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

本文介绍了一种在Android应用中实现夜间模式切换动画的方法。通过在decorView中使用setDrawingCacheEnabled获取当前视图树的缓存快照,并将此快照放入ImageView中进行渐变处理。该方法适用于希望为夜间模式添加平滑过渡效果的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值