在这之前,请了解RenderThread——RenderThread基础知识
不知为何,我模拟不出上面博文的效果,特发出来,求助各路大神。
package com.example.zxtext.util;
/*
* RenderThread异步渲染动画实践
* 目前得知目前支持RenderThread完全渲染的动画,只有两种:
* ViewPropertyAnimator和CircularReveal(揭露动画)。
* 而对于CircularReveal(揭露动画)使用比较简单且功能较为单一。
* */
import android.animation.AnimatorInflater;
import android.util.Log;
import android.view.View;
import android.view.ViewPropertyAnimator;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import static android.content.ContentValues.TAG;
public class AnimHelper {
    /**
     * 此类是属于包保护级别的,不是hide的类,
     * 在Android P 使用反射并不会有影响
     * 创建对应的View的ViewPropertyAnimatorRT
     */
    private static Object createViewPropertyAnimatorRT(View view){
        try {
            Class<?> animRtClazz = Class.forName("android.view.ViewPropertyAnima");
            Constructor<?> animConstructor = animRtClazz.getDeclaredConstructor(View.class);
            animConstructor.setAccessible(true);
            Object animRt = animConstructor.newInstance(view);
            return animRt;
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("TAG", "创建ViewPropertyAnimatorRT出错,错误信息:");
        }
        return null;
    }
   // 然后为viewpropertyAnimator设置对应的mRTBackend的值。
    private static void setViewPropertyAnimatorRT(ViewPropertyAnimator animator, Object rt) {
        try {
            Class<?> animClazz = Class.forName("android.view.ViewPropertyAnimator");
            Field animRtField = animClazz.getDeclaredField("mRTBackend");
            animRtField.setAccessible(true);
            animRtField.set(animator, rt);
    } catch (Exception e) {
            e.printStackTrace();
            Log.d("TAG", "设置ViewPropertyAnimatorRT出错,错误信息:" + e.toString());
        }
    }
    /**
     * 在执行动画开始前配置
     */
    public static void onStartBeforeConfig(ViewPropertyAnimator animator, View view) {
        Object rt = createViewPropertyAnimatorRT(view);
        setViewPropertyAnimatorRT(animator, rt);
    }
}
Activity部分代码:
 findViewById(R.id.one1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("TAG","one1Click");
                startAnim1(view);
                delaySleep(1000,3000);
                Log.d("TAG","1000one1Click");
            }
        });
        findViewById(R.id.one2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("TAG","one2Click");
                startAnim2(view);
                delaySleep(1000, 3000);
                Log.d("TAG","1000one2Click");
            }
        });
    }
    private void startAnim2(View v) {
        v.setScaleY(1);
        ViewPropertyAnimator animator = v.animate().scaleY(2).setDuration(2000);
        AnimHelper.onStartBeforeConfig(animator, v);
        animator.start();
    }
    private void startAnim1(View v) {
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v, "scaleY", 1, 2);
        objectAnimator.setDuration(2000);
        objectAnimator.start();
    }
    private void delaySleep(long delay, final long duration) {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(duration);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, delay);
    }





























