您的位置:首页 > 其它

使用View 的setDrawingCacheEnabled获取整个activity的缓存快照,进行渐变动画

2017-12-20 15:59 423 查看
在项目中用到了夜间模式切换,需要一个动画效果。于是想到了在decorView中使用setDrawingCacheEnabled来获得当前整个view树的缓存快照。然后对把整个快照放到一个imageView中,进行渐变处理。具体如下:

public static void showChangeNightModeAnim(Activity activity, Animator.AnimatorListener animatorListener) {
if (activity == null) {
return;
}
final ViewGroup container = (ViewGroup) activity.getWindow().getDecorView();
if (container == null) {
return;
}
final ImageView imageView = new ImageView(activity);
container.setDrawingCacheEnabled(true);
Bitmap drawingCache = null;
try {
Bitmap cache = container.getDrawingCache();
if (cache != null && !cache.isRecycled()) {
drawingCache = Bitmap.createBitmap(cache);
} else {
LogHelper.logE(TAG, "showChangeNightModeAnim : container.getDrawingCache() = " + cache);
}
} catch (OutOfMemoryError error) {
LogHelper.logE(TAG, "showChangeNightModeAnim : createBitmap OOM!!!");
drawingCache = null;
}
if (drawingCache != null && !drawingCache.isRecycled()) {
imageView.setImageBitmap(drawingCache);
}
container.destroyDrawingCache();
container.setDrawingCacheEnabled(false);// 以清空画图缓冲区,否则下一次还是原来的图像
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
container.addView(imageView);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "alpha", imageView.getAlpha(), 0f);
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
imageView.setImageBitmap(null);
container.removeView(imageView);
}
});
if (animatorListener != null) {
objectAnimator.addListener(animatorListener);
}
objectAnimator.setDuration(Constant.CHANGE_NIGHT_ANIM_DURATION);
objectAnimator.setInterpolator(new Interpolator() {
@Override
public float getInterpolation(float input) {
return input * input * input;
}
});
objectAnimator.start();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐