android Pull-to-refresh 动画实现

android Pull-to-refresh 动画实现

现在很多应用都使用的pull-to-refresh 动画效果,包括微博、微信、QQ等。

这里示例性的实现pull-to-refresh 动画效果,并增加了额外的图片放大、透明度、位移等动画。这些动画也被经常使用。


实现效果:

http://v.youku.com/v_show/id_XNjY0MTQzODQ4.html

java文件

package com.buptfarmer.devapp;

import static com.nineoldandroids.view.ViewPropertyAnimator.animate;

import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.AnimatorListenerAdapter;
import com.nineoldandroids.view.ViewHelper;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.View.OnTouchListener;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class PullAnimationExample extends Activity {
    private TextView mRefreshText;
    private TextView mAaaText;
    private ImageView mHeaderImg;
    private LinearLayout mBottom;
    private LinearLayout mHolder;
    private int mCount;
    private RotateAnimation mFlipAnimation;
    private RotateAnimation mReverseFlipAnimation;
    private int mSlop;
    private boolean mSwiping;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ViewConfiguration vc = ViewConfiguration.get(this);
        mSlop = vc.getScaledTouchSlop();
        initView();

        mFlipAnimation = new RotateAnimation(0, -180,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        mFlipAnimation.setFillAfter(true);
        mReverseFlipAnimation = new RotateAnimation(-180, 0,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        mReverseFlipAnimation.setFillAfter(true);
    }

    private void initView() {
        setContentView(R.layout.pull_animation_example);
        mHolder = (LinearLayout) findViewById(R.id.holder);
        mHeaderImg = (ImageView) findViewById(R.id.header_img);
        ViewHelper.setAlpha(mHeaderImg, 0.3f);
        mRefreshText = (TextView)findViewById(R.id.refresh);
        mRefreshText.setVisibility(View.INVISIBLE);
        mAaaText = (TextView) findViewById(R.id.aaa);
        mBbbText = (TextView) findViewById(R.id.bbb);
        mBottom = (LinearLayout) findViewById(R.id.buttom);

        mHolder.setOnTouchListener(new OnTouchListener() {

            private float mDownX;
            private float mDownY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN: {
                        mDownX = event.getX();
                        mDownY = event.getY();
                        mRefreshText.setVisibility(View.VISIBLE);
                        mRefreshText.setText("pull to refresh");
                        break;
                    }
                    case MotionEvent.ACTION_MOVE: {
                        float deltaX = Math.abs(event.getX() - mDownX);
                        float deltaY = Math.abs(event.getY() - mDownY);
                        if (deltaY > mSlop && deltaY > 0) {
                            mSwiping = true;
                            v.getParent().requestDisallowInterceptTouchEvent(true);
                            float percent = Math.min(0.2f, Math.abs(deltaY) / mHeaderImg.getMeasuredHeight());
                            ViewHelper.setScaleX(mHeaderImg,
                                    1f + 3f * percent);
                            ViewHelper.setScaleY(mHeaderImg,
                                    1f + 3f * percent);
                            ViewHelper.setAlpha(mHeaderImg,
                                    Math.min(1f, 0.3f+3f * percent));
                            ViewHelper.setTranslationY(mBottom, deltaY);
                            if(deltaY > mRefreshText.getHeight()){
                                mRefreshText.setText("release to refresh");
                            }
                        }
                        break;
                    }
                    case MotionEvent.ACTION_UP: {
                        if (mSwiping) {
                            mSwiping = false;
                            ViewHelper.setScaleX(mHeaderImg, 1f);
                            ViewHelper.setScaleY(mHeaderImg, 1f);
                            ViewHelper.setAlpha(mHeaderImg, 0.3f);
                            animate(mHeaderImg).alpha(0.3f).scaleX(1f).scaleY(1f).setListener(null);
                            animate(mBottom).translationY(0).setListener(null);
                            updateText();

                            mRefreshText.setVisibility(View.INVISIBLE);
                            mRefreshText.setText("refreshing...");
                        }
                        break;

                    }
                    default: {
                        break;
                    }
                }
                return true;
            }
        });
    }

    private void updateText() {
        animateText(mAaaText, new AnimationCallback() {

            @Override
            public void onAnimation() {
                // TODO Auto-generated method stub
                mAaaText.setText("update " + mCount++);
            }
        });

    }

    public static void animateText(final View view, final AnimationCallback callback) {
        int origHeight = view.getHeight();
        animate(view).translationY(origHeight).alpha(0).scaleX(0.5f).scaleY(0.5f)
                .setListener(new AnimatorListenerAdapter() {
                    public void onAnimationEnd(Animator animation) {
                        if (callback != null) {
                            callback.onAnimation();
                        }
                        animate(view).translationY(0).alpha(1).scaleX(1f).scaleY(1f).setListener(null);
                    };
                });
    }

    public interface AnimationCallback {
        public void onAnimation();
    }
}

layout xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/holder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="fill_parent" >

        <ImageView
            android:id="@+id/header_img"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:src="@drawable/all_in_one" />

        <TextView
            android:id="@+id/refresh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:text="pull to refresh"
            android:textColor="@color/blue"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/aaa"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/refresh"
            android:layout_centerHorizontal="true"
            android:text="aaaaaa text"
            
            android:textColor="@color/red"
            android:textSize="20sp" />

        <LinearLayout
            android:id="@+id/buttom"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/header_img"
            android:gravity="center_horizontal"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/bbb"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="bbbbbb text"
                android:textSize="20sp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="bbbbbb text"
                android:textSize="20sp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="bbbbbb text"
                android:textSize="20sp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="bbbbbb text"
                android:textSize="20sp" />
        </LinearLayout>
    </RelativeLayout>

</LinearLayout>




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。