使用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();
}
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();
}
相关文章推荐
- View setDrawingCacheEnabled 缓存
- Android 高级UI设计笔记04:可以拖动交换item位置的GridView ---> 使用setDrawingCacheEnabled(boolean flag)提高绘图速度
- View的setLayerType() , setDrawingCacheEnabled() 方法用法
- Android 使用setContentView在一个Activity进行界面切换
- 【android学习】imageview通过getDrawingCache获取图像
- 关于使用getDrawingCache()方法获取屏幕截图的问题
- Android 解决ListView在使用多个布局的同时使用convertView进行缓存时导致ListView下面有空白的问题
- 当一个imageview 使用了 setimagebitmap(bit); 之后 如何从imageview中获取到bit
- Android开发:用getDrawingCache方法获取ImageView中的图像需要注意的问题
- IOS应用加载本地WebView禁止进行缓存(使用私有api)
- 使用ViewGrop和Fragment对Fragmen进行缓存
- 【封装】java中为什么要将属性进行私有化,又使用set和get方法来设置和获取属性呢?
- setDrawingCacheEnabled(boolean flag)的用法
- setAnimationTransition:forView:cache: 运行动画时背景色问题
- getDrawingCache方法获取ImageView中的图像需要注意的问题
- [转]使用Rack::Cache进行平滑的HTTP缓存
- 用getDrawingCache方法获取ImageView中的图像
- 关于android Activity中注解的使用,省去无用的findviewbyid....setonclick.....
- Android Smart Image View使用方法--从url获取图片或从通讯录获取图片,支持缓存
- Android 绘图 cache setDrawingCacheEnabled(boolean flag)