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

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


你可能感兴趣的:(基础知识)