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

来源:互联网 发布:婚礼绘图软件 编辑:程序博客网 时间:2024/06/10 17:53

在项目中用到了夜间模式切换,需要一个动画效果。于是想到了在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();}


阅读全文
0 0