Android视图从上到下动画遮罩

3

我创建了一个自定义视图,它是FrameLayout的父类。在我的视图内部,我创建了遮罩层:

function makeBitmapMask(int animationHeight) {
    mask = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
    Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(mask);
    drawable.setBounds(0, animationHeight, getMeasuredWidth(), getMeasuredHeight());
    drawable.draw(canvas);
}          

并创建了Paint:

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(mPorterDuffXferMode);

接下来我要重写 dispatchDraw 方法:

@Override
protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
        paint.setXfermode(mPorterDuffXferMode);
        canvas.drawBitmap(mask, 0.0f, 0.0f, mPaint);
        paint.setXfermode(null);
}

为了制作遮罩动画,我运行 Handler:
int animationHeight = 0;
private void animateView() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                animateView();
                animationHeight += 10;
                makeBitmapMask(animationHeight);
                invalidate();
            }
        }, 10);
    }

它能够工作,但非常缓慢。

使用ValueAnimator得到相同的结果:

ValueAnimator va = ValueAnimator.ofInt(0, getHeight());
    int mDuration = 3000;
    va.setDuration(mDuration);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer value = (Integer) animation.getAnimatedValue();
            makeBitmapMask(value);
            invalidate();
        }
    });

    va.start();

我认为makeBitmapMask()很慢。 也许我只能改变遮罩的边界或高度,而不需要在每个动画帧上重新创建新的位图? 制作视图遮罩的正确方法是什么?


使用 ValueAnimator / ObjectAnimator - pskink
无论如何都很慢。我认为makeBitmapMask()非常慢。也许我只能改变掩码边界或高度,而不必在每个动画帧上重新创建新的位图? - ki44321
1个回答

0
也许你可以使用圆形揭示效果。只需将动画的源点设置得非常远,并在非常大的半径和略微较大的半径之间进行动画处理,这有点取巧,但可以实现几乎直线式的揭示效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接