在这之前,请了解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);
}