我已经创建了自定义 View ,它是 FrameLayout 的父 View 。 在我看来,我已经创建了面具:
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);
}
为了制作 mask 动画,我运行了 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() 非常慢。 也许我只能更改蒙版边界或高度,而无需在每个动画帧上重新创建新的位图? 制作 View mask 动画的正确方法是什么?
最佳答案
也许您可以使用循环展示。只需将动画的源点设置得非常远,并在非常大的半径和稍大一点的半径之间设置动画,这有点笨拙,但它可以产生几乎直线的显示。
关于Android动画 View mask 从上到下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38785960/