我创建了自定义视图,它是FrameLayout的父级。 在我的视图中,我创建了蒙版:
data_new = subset(data, data[,2] %in% as.character(10:00:00) : as.character(11:00:00) )
并创建了Paint:
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);
}
然后我覆盖了dispatchDraw:
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(mPorterDuffXferMode);
要制作面具动画,我运行Handler:
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
paint.setXfermode(mPorterDuffXferMode);
canvas.drawBitmap(mask, 0.0f, 0.0f, mPaint);
paint.setXfermode(null);
}
它有效但很慢。
使用ValueAnimator的相同结果:
int animationHeight = 0;
private void animateView() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
animateView();
animationHeight += 10;
makeBitmapMask(animationHeight);
invalidate();
}
}, 10);
}
我认为,makeBitmapMask()非常慢。 也许我只能更改蒙版边界或高度,而无需在每个动画帧上重新创建新的位图? 制作视图蒙版动画的正确方法是什么?
答案 0 :(得分:0)
也许你可以使用循环显示。只需将动画的源点设置得非常远,并在非常大的半径到更大的半径之间设置它的动画,它有点笨拙,但它可能会导致几乎是直线的显示。