74.动画

作者: SlideException | 来源:发表于2020-08-09 23:07 被阅读0次

    /**
    * 每天一个知识点day74 TODO 广播的原理、动画
    *
    * https://www.jianshu.com/p/a842432a4fc2
    * Android广播的原理:
    *
    * 静态注册注册的广播,在PMS启动的时候扫描系统中安装的apk文件,
    * 并解析它们的AndroidManifest.xml文件,将所有注册的广播保存在PMS的成员变量mReceivers中
    * 当发送广播时,AMS就会到这里来查询所有匹配的静态广播接收者,进而将广播发送给它们。
    *
    * 动态注册的广播存储在AMS的成员变量mRegisteredReceivers中
    * AMS负责从mReceivers和mRegisteredReceivers这两个集合查询出与IntentFilter匹配的接收者,
    * 并将它们添加到BroadcastQueue的mParallelBroadcasts(动态注册的无序广播)
    * 或者mOrderedBroadcasts(有序广播和所有的静态广播)中
    *
    * 在BroadcastQueue先处理mParallelBroadcasts,所以动态注册的无序广播会先收到广播;
    *
    * 当有应用安装,卸载时(实际的逻辑在PMS中),静态注册的广播自然是在PMS中进行更新注册信息,
    * 接着再发送广播到AMS中更新动态注册广播;
    *
    * 动态广播的onReceive方法是在LoadedApk#ReceiverDispatcher#Args的run方法中被调用;
    * 静态广播的onReceive是在ActivityThread的handleReceiver方法中被调用,
    * 而它们都是跑在目标进程的主线程中。
    *
    * 1.广播接受者BroadcastReceiver通过Binder机制向ActivityManagerService进行注册。
    * 2.广播发送者向AMS发送广播。
    * 3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,
    * 将广播发送到BroadcastReceiver(一般是Activity)相应的消息循环队列BroadcastQueue中。
    * 4.消息循环执行拿到广播,回调BroadcastReceiver的onReceive()方法。
    *
    * Android动画:https://www.jianshu.com/p/420629118c10
    *
    * 传统动画View Animation:帧动画和补间动画。
    * 帧动画:
    * 原理就是将一张张单独的图片连贯的进行播放,从而在视觉上产生一种动画的效果。
    * imageView.setImageResource(R.drawable.dra_anim);
    * AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
    * animationDrawable.start();
    *
    * 补间动画:
    * 补间动画可以分为四种形式:Alpha(透明度)、Rotate(旋转)、Scale(缩放)、Translate(位移)
    * 补间动画的实现,一般会采用xml 文件的形式
    * Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_scale);
    * imageView.startAnimation(animation);
    * 补间动画对view的移动更像是在不同地方绘制了一个影子,实际的对象还是处于原来的地方。
    *
    * interpolator插值器:
    * AccelerateDecelerateInterpolator :在动画开始与结束的地方速率改变比较慢,在中间的时候加速
    * AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始速率变化加快
    * LinearInterpolator:以常量速率改变
    * AnticipateInterpolator:开始的时候向后然后向前甩
    * CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线
    * PathInterpolator:动画执行的效果按贝塞尔曲线
    * anticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
    * OvershootInterpolator:向前甩一定值后再回到原来位置
    * BounceInterpolator:动画结束的时候有弹起效果
    * AlphaAnimation、 ScaleAnimation、TranslateAnimation、RotateAnimation
    *
    *
    * 属性动画Property Animator:
    * 为什么引入Property Animator(属性动画)?
    * 能实现补间动画无法实现的功能。
    * View Animation仅能对指定的控件做动画,而Property Animator是通过改变控件某一属性值来做动画的。
    * 补间动画虽能对控件做动画,但并没有改变控件内部的属性值。
    * 而Property Animator则是恰恰相反,Property Animator是通过改变控件内部的属性值来达到动画效果的。
    *
    * ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);
    * 二类:ValueAnimator、ObjectAnimator是其重要的两个类。
    * 三方:ValueAnimator有ofInt、ofFloat、ofObject三个重要的方法
    *
    * Interpolator继承自TimeInterpolator
    * 插值器(Interpolator):决定值的变化模式,从初始值过渡到结束值的节奏。
    * 估值器(TypeEvaluator):决定值的具体变化数值,如何从初始值过渡到结束值。
    * 说的通俗一点,你每天早晨出门去公司上班,TypeEvaluator决定了你是坐公交、
    * 坐地铁还是骑车;而当你决定骑车后,TimeInterpolator决定了你一路上骑行的方式
    *
    * 使用动画的注意事项:
    * 1.OOM问题,主要出现在帧动画中。
    * 2.属性动画中有一类无限循环的动画,这类动画需要在Activity退出时及时停止,
    * 否则将导致Activity无法释放从而造成内存泄露,通过验证后发现补间动画并不存在此问题。
    * 3.兼容性问题:动画在3.0以下的系统有兼容性问题。
    * 4.View动画的问题,View.GONE失效,需要view.clearAnimation()。
    * 5.不要使用px:在进行动画的过程中,要尽量使用dp。使用px会导致在不用的设备上有不用的效果。
    * 6.硬件加速:使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性。
    * <activity android:hardwareAccelerated="true" />
    *
    *
    */
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    ImageView imageView = findViewById(R.id.id_img);
    imageView.setImageResource(R.drawable.dra_anim);
    AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
    animationDrawable.start();
    animationDrawable.setOneShot(true);//循环执行

        Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_scale);
        imageView.startAnimation(animation);
    
        ValueAnimator valueAnimator = ValueAnimator.ofFloat();
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();
                
            }
        });
        
        
        ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.5f, 0.8f, 1.0f);
        ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(imageView, "scaleX", 0.0f, 1.0f);
        ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(imageView, "scaleY", 0.0f, 2.0f);
        ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(imageView, "rotation", 0, 360);
        ObjectAnimator transXAnim = ObjectAnimator.ofFloat(imageView, "translationX", 100, 400);
        ObjectAnimator transYAnim = ObjectAnimator.ofFloat(imageView, "tranlsationY", 100, 750);
        AnimatorSet set = new AnimatorSet();
        set.playTogether(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
        set.playSequentially(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
        set.setDuration(3000);
        set.start();
    }

    相关文章

      网友评论

          本文标题:74.动画

          本文链接:https://www.haomeiwen.com/subject/vyordktx.html