属性动画的使用实例

来源:互联网 发布:淘宝有没有隐形降权 编辑:程序博客网 时间:2024/05/11 14:00

写Android动画之前,先看两个之前写的例子。

1.状态栏的平滑消失与重现

代码:

public class MainActivity extends Activity {    private View mView, mButton;    private int mHeight;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        mView = findViewById(R.id.ll);        mButton = findViewById(R.id.start_button);        float density = getResources().getDisplayMetrics().density;        mHeight = (int) (40 * density + 0.5f);        mButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (mView.getVisibility() == View.GONE){                    //do sth                    mView.setVisibility(View.VISIBLE);                    openAnim(mView, 0, mHeight);                } else {                    //                    closeAnim(mView, mHeight, 0);                }            }        });    }    private void openAnim(View view, int start, int end) {        ValueAnimator animator = createAnim(view, start, end);        animator.start();    }    private void closeAnim(final View view, int start, int end) {        ValueAnimator animator = createAnim(view, start, end);        animator.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationEnd(Animator animation) {                view.setVisibility(View.GONE);            }        });        animator.start();    }    private ValueAnimator createAnim(final View view, int start, int end) {        ValueAnimator animator = ValueAnimator.ofInt(start, end);        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                int value = (int) animation.getAnimatedValue();                ViewGroup.LayoutParams layoutParams = view.getLayoutParams();                layoutParams.height = value;                view.setLayoutParams(layoutParams);            }        });        animator.setDuration(500);        animator.setInterpolator(new LinearInterpolator());        return animator;    }}
布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                android:layout_width="match_parent"                android:layout_height="match_parent">    <LinearLayout        android:id="@+id/ll"        android:layout_width="match_parent"        android:layout_height="40dp"        android:background="@color/colorPrimaryDark"        android:orientation="horizontal">    </LinearLayout>    <Button        android:id="@+id/start_button"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="start"        android:layout_alignParentBottom="true"        /></RelativeLayout>
效果:




2.悬浮球

代码:

public class SpeakingFloatView extends FrameLayout implements Animator.AnimatorListener{    private float mTouchX;    private float mTouchY;    private float x;    private float y;    private float mLastX;    private float mLastY;    private boolean isMove;    private WindowManager mWindowManager;    private WindowManager.LayoutParams mWindowManagerParams;    private ImageView mFloatAnnouncer;    private ImageView mFloatWave1;    private ImageView mFloatWave2;    private ImageView mFloatWave3;    private ImageView mFloatBg;    private AnimatorSet animatorSet1;    private AnimatorSet animatorSet2;    private AnimatorSet animatorSet3;    public SpeakingFloatView(Context context, WindowManager windowManager,                             WindowManager.LayoutParams params) {        super(context);        mWindowManager = windowManager;        mWindowManagerParams = params;        LayoutInflater inflater=(LayoutInflater)(context.getSystemService(Context.LAYOUT_INFLATER_SERVICE));        View view=inflater.inflate(R.layout.speaking_float_layout,this);        mFloatAnnouncer = (ImageView) view.findViewById(R.id.floatview_announcer);        mFloatWave1 = (ImageView) view.findViewById(R.id.floatview_wave1);        mFloatWave2 = (ImageView) view.findViewById(R.id.floatview_wave2);        mFloatWave3 = (ImageView) view.findViewById(R.id.floatview_wave3);        mFloatBg = (ImageView) view.findViewById(R.id.floatview_bg);        initAnimator();    }    @Override    public boolean onInterceptTouchEvent(MotionEvent event){        float x = event.getX();        float y = event.getY();        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                isMove = false;                mLastX = x;                mLastY = y;                mTouchX = x;                mTouchY = y;                break;            case MotionEvent.ACTION_MOVE:                int xDiff = (int) Math.abs(x - mLastX);                int yDiff = (int) Math.abs(y - mLastY);                if (xDiff > 5 || yDiff > 5) {                    isMove = true;                }                break;            case MotionEvent.ACTION_UP:                if (isMove) {                    isMove = false;                }                break;        }        return isMove;    }    @Override    public boolean onTouchEvent(MotionEvent event) {        Rect frame = new Rect();        getWindowVisibleDisplayFrame(frame);        int statusBarHeight = frame.top;        x = event.getRawX();        y = event.getRawY() - statusBarHeight;        switch (event.getAction()) {            case MotionEvent.ACTION_MOVE:                float xDiff = Math.abs(event.getX() - mLastX);                float yDiff = Math.abs(event.getY() - mLastY);                if(xDiff >= 5||yDiff >= 5){                    isMove=true;                }                if(isMove){                    updateViewPosition();                }                break;            case MotionEvent.ACTION_UP:                if(isMove){                    updateViewPosition();                    isMove = false;                }                mTouchX = mTouchY = 0;                break;        }        return true;    }    @Override    public void setOnClickListener(OnClickListener l) {        mFloatBg.setOnClickListener(l);    }    private void updateViewPosition() {        mWindowManagerParams.x = (int) (x - mTouchX);        mWindowManagerParams.y = (int) (y - mTouchY);        mWindowManager.updateViewLayout(this, mWindowManagerParams);    }    public void startAnimation(){        animatorSet1.start();        animatorSet2.start();        animatorSet3.start();        animatorSet3.addListener(this);    }    public void stopAnimation(){        animatorSet1.end();        animatorSet2.end();        animatorSet3.end();    }    public void initAnimator(){        animatorSet1 = new AnimatorSet();        ObjectAnimator[] animator1 = new ObjectAnimator[6];        animator1[0] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",0.45f,0.75f).setDuration(80);        animator1[1] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",0.75f,0.75f).setDuration(160);        animator1[2] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",0.75f,0.55f).setDuration(160);        animator1[3] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",0.55f,1f).setDuration(80);        animator1[4] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",1f,1f).setDuration(720);        animator1[5] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",1f,0.45f).setDuration(200);        for(int i=0;i<5;i++){            animatorSet1.play(animator1[i]).before(animator1[i+1]);        }        animatorSet2 = new AnimatorSet();        final ObjectAnimator[] animator2 = new ObjectAnimator[13];        animator2[0] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0f,0f).setDuration(40);        animator2[1] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0f,0.60f).setDuration(80);        animator2[2] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.60f,0.60f).setDuration(80);        animator2[3] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.60f,0.35f).setDuration(160);        animator2[4] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.35f,0.35f).setDuration(80);        animator2[5] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.35f,1f).setDuration(80);        animator2[6] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",1f,1f).setDuration(160);        animator2[7] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",1f,0.50f).setDuration(160);        animator2[8] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.5f,0.5f).setDuration(80);        animator2[9] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.50f,0.85f).setDuration(120);        animator2[10] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.85f,0.85f).setDuration(120);        animator2[11] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.85f,0f).setDuration(200);        animator2[12] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0f,0f).setDuration(40);        for(int i=0;i<12;i++){            animatorSet2.play(animator2[i]).before(animator2[i+1]);        }        animatorSet3 = new AnimatorSet();        ObjectAnimator[] animator3 = new ObjectAnimator[12];        animator3[0] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0f).setDuration(80);        animator3[1] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0.45f).setDuration(80);        animator3[2] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0.45f,0f).setDuration(160);        animator3[3] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0f).setDuration(160);        animator3[4] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,1f).setDuration(80);        animator3[5] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",1f,1f).setDuration(80);        animator3[6] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",1f,0f).setDuration(160);        animator3[7] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0f).setDuration(160);        animator3[8] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0.35f).setDuration(120);        animator3[9] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0.35f,0.35f).setDuration(40);        animator3[10] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0.35f,0f).setDuration(200);        animator3[11] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0f).setDuration(80);        for(int i=0;i<11;i++){            animatorSet3.play(animator3[i]).before(animator3[i+1]);        }    }    @Override    public void onAnimationStart(Animator animation) {    }    @Override    public void onAnimationEnd(Animator animation) {        animatorSet1.start();        animatorSet2.start();        animatorSet3.start();    }    @Override    public void onAnimationCancel(Animator animation) {    }    @Override    public void onAnimationRepeat(Animator animation) {    }}

布局:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    >    <ImageView        android:id="@+id/floatview_bg"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:src="@drawable/speaking_floatview_bg"        android:layout_gravity="center"/>    <ImageView        android:id="@+id/floatview_wave1"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:src="@drawable/floatview_wave_3"        android:layout_gravity="center"/>    <ImageView        android:id="@+id/floatview_wave2"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:src="@drawable/floatview_wave_2"        android:layout_gravity="center"/>    <ImageView        android:id="@+id/floatview_wave3"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:src="@drawable/floatview_wave_1"        android:layout_gravity="center"/>    <ImageView        android:id="@+id/floatview_announcer"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:src="@drawable/floatview_announcer_4"        android:layout_gravity="center"/></FrameLayout>