zoukankan      html  css  js  c++  java
  • 一手遮天 Android

    项目地址 https://github.com/webabcd/AndroidDemo
    作者 webabcd

    一手遮天 Android - Animation: 属性动画(Property Animation)中的 ViewPropertyAnimator

    示例如下:

    /animation/AnimationDemo7.java

    /**
     * 属性动画(Property Animation)中的 ViewPropertyAnimator
     * ViewPropertyAnimator 是通过 ValueAnimator 实现的
     *
     *
     * View - 视图
     *     animate() - 返回 ViewPropertyAnimator 对象
     *
     * ViewPropertyAnimator - 用于简化动画的实现(支持链式语法)
     *     setStartDelay() - 设置动画启动的延迟时间,单位:毫秒
     *     setDuration() - 设置动画的持续时间,单位:毫秒
     *     setInterpolator() - 指定此动画的 Interpolator(关于 Interpolator 参见 animation/AnimationDemo2 和 animation/AnimationDemo3)
     *     alpha() - alpha 动画到指定的值
     *     alphaBy() - alpha 动画偏移指定的值(这就是结尾有 By 和没有 By 的区别)
     *     rotation(), rotationBy(), rotationX(), rotationXBy(), rotationY(), rotationYBy() - 顾名思义
     *     scaleX(), scaleXBy(), scaleY(), scaleYBy() - 顾名思义
     *     translationX(), translationXBy(), translationY(), translationYBy(), translationZ(), translationZBy() - 顾名思义
     *     x(), xBy(), y(), yBy(), z(), zBy() - 顾名思义
     *     start() - 开始动画(一般不需要手动调用 start() 方法,因为 ViewPropertyAnimator 会自动启动动画)
     *     cancel() - 停止动画
     *     withStartAction() - 动画开始的回调
     *     withEndAction() - 动画结束的回调
     *     addListener() - 动画事件
     *         onAnimationStart() - 动画开始
     *         onAnimationEnd() - 动画结束
     *         onAnimationCancel() - 动画取消
     *         onAnimationRepeat() - 动画重复
     *     addUpdateListener() - 动画更新事件
     *         onAnimationUpdate() - 动画更新了(这里可以拿到 ValueAnimator 对象)
     *
     *
     * 注:对于动画来说,优先考虑用 ViewPropertyAnimator,不行再考虑用 ObjectAnimator, 再不行再考虑用 ValueAnimator, 还不行最后考虑自己写
     */
    
    package com.webabcd.androiddemo.animation;
    
    import android.animation.Animator;
    import android.animation.ValueAnimator;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.animation.BounceInterpolator;
    import android.widget.TextView;
    
    import com.webabcd.androiddemo.R;
    import com.webabcd.androiddemo.utils.Helper;
    
    public class AnimationDemo7 extends AppCompatActivity {
    
        private TextView mTextView1;
        private TextView mTextView2;
        private TextView mTextView3;
        private TextView mTextView4;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_animation_animationdemo7);
    
            mTextView1 = findViewById(R.id.textView1);
            mTextView2 = findViewById(R.id.textView2);
            mTextView3 = findViewById(R.id.textView3);
            mTextView4 = findViewById(R.id.textView4);
    
            sample1();
        }
    
        private void sample1() {
            // 把参数都设置完后,动画会自动启动(按照所有参数并行运行动画)
            mTextView1.animate()
                    .setDuration(2000)
                    .translationX(Helper.dp2px(this, 200))
                    .rotation(360)
                    .setInterpolator(new BounceInterpolator());
    
    
            // 重复设置相同的参数,则以最后一次的设置为准
            mTextView2.animate()
                    .setStartDelay(100)
                    .setDuration(10)
                    .translationX(10)
                    .rotation(10);
            mTextView2.animate()
                    .setDuration(2000)
                    .translationX(Helper.dp2px(this, 200))
                    .rotation(360)
                    .setInterpolator(new BounceInterpolator());
    
    
            // 需要按顺序运行动画的话,则在播放结束的回调中再次使用 ViewPropertyAnimator 即可
            mTextView3.animate()
                    .setDuration(2000)
                    .translationX(Helper.dp2px(this, 200))
                    .rotation(360)
                    .setInterpolator(new BounceInterpolator())
                    .withStartAction(new Runnable() {
                        @Override
                        public void run() {
                            // 动画开始
                        }
                    })
                    .withEndAction(new Runnable() {
                        @Override
                        public void run() {
                            // 动画结束后启动指定的其他动画
                            mTextView3.animate()
                                    .setDuration(2000)
                                    .translationXBy(Helper.dp2px(AnimationDemo7.this, -100));
                        }
                    });
    
    
            // 拿到 ViewPropertyAnimator 所用的 ValueAnimator 对象,可以做一些额外的处理
            mTextView4.animate()
                    .setDuration(2000)
                    .translationX(Helper.dp2px(this, 200))
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                            // 动画开始
                        }
    
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            // 动画结束
                        }
    
                        @Override
                        public void onAnimationCancel(Animator animation) {
                            // 动画取消
                        }
    
                        @Override
                        public void onAnimationRepeat(Animator animation) {
                            // 动画重复
                        }
                    })
                    .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator animation) {
                            // 通过设置 ValueAnimator 对象使动画循环运行
                            animation.setRepeatCount(-1);
                            animation.setRepeatMode(ValueAnimator.REVERSE);
    
                            // 可以从 ValueAnimator 对象获取动画的当前运行的时长,fraction 等数据
                            mTextView4.setText(String.format("%d, %.2f", animation.getCurrentPlayTime(), animation.getAnimatedFraction()));
                        }
                    });
        }
    }
    
    

    /layout/activity_animation_animationdemo7.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:textColor="#FFFF0000" />
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:textColor="#FFFF0000" />
    
        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:textColor="#FFFF0000" />
    
        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:textColor="#FFFF0000" />
    
    </LinearLayout>
    
    

    项目地址 https://github.com/webabcd/AndroidDemo
    作者 webabcd

  • 相关阅读:
    input type = file 上传图片转为base64
    vue-cli 搭建的项目,无法用本地IP访问
    js小数点精度问题
    虚拟机安装软件必备技术之一 --虚拟机快照技术
    Linux 关机命令总结
    查询模块错误排查
    - Oracle 闪回特性(FLASHBACK DATABASE)
    ORACLE密码过期,修改密码
    查看sql执行进度
    ORACLE CPU过高的sql查询
  • 原文地址:https://www.cnblogs.com/webabcd/p/android_animation_AnimationDemo7.html
Copyright © 2011-2022 走看看