登录

去注册

登录

注册

去登录

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

获取注册验证码

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

每日一问 | 属性动画与硬件加速的相遇,不是你想的那么简单?

xiaoyang   2020-10-12 00:47   收藏

很多时候我们讨论属性动画与之前的View Animation之间的区别,很多同学都会说:

“属性动画在移动后,仍然可以响应用户的点击”

原因可以看这篇:每日一问 | 为什么属性动画移动一个控件后,目标位置仍然能响应用户事件?

了解的同学应该清楚,能响应只是在事件分发的时候,做了一下坐标映射。

今天,我们讨论另一个区别,就是当属性动画与硬件加速配合时,会摩擦出什么火花?

看一个示例:

MyTextView tv =view.findViewById( R.id.tv_name);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 300).setDuration(2000);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        v.setTranslationY((int) animation.getAnimatedValue());
                    }
                });
                valueAnimator.start();
            }
        });

很简答,我们自定义一个TextView,点击的时候,对它做一点往下的移动。

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<com.example.zhanghongyang.kotlinlearn.view.MyFrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.zhanghongyang.kotlinlearn.view.MyTextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello" />

</com.example.zhanghongyang.kotlinlearn.view.MyFrameLayout>

硬件加速开启时(默认就是开启的):

  1. 动画执行过程中:MyTextView的draw方法会回调吗?
  2. 动画执行过程中:MyFrameLayout的dispatchDraw方法会回调吗?

硬件加速关闭时:

  1. 动画执行过程中:MyTextView的draw方法会回调吗?
  2. 动画执行过程中:MyFrameLayout的dispatchDraw方法会回调吗?

如果两者有差异:

  1. v.setTranslationY在开启和不开启硬件加速过程中,执行的逻辑到底有什么变化?

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定