我正在尝试逐步更改OvalShape()的alpha值。 为此,我需要调用invalidate,以便它不断调用自身并使用增加的alpha值渲染自身。
但设置错了,因为我对此并不太了解..
public class xml_anim_testing_sub_class extends View {
private ShapeDrawable mDrawable;
int x = 10;
int y = 10;
int width = 300;
int height = 50;
int my_alpha = 255,add_to_my_alpha = 0;
public xml_anim_testing_sub_class(Context context) {
super(context);
}
protected void onDraw(Canvas canvas) {
x++;
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xff74AC23);
mDrawable.setAlpha(my_alpha += add_to_my_alpha );
mDrawable.setBounds(x, y, x + width, y + height);
if (my_alpha == 0)
add_to_my_alpha = 1;
if (my_alpha == 255)
add_to_my_alpha = -1;
mDrawable.draw(canvas);
mDrawable.invalidateSelf();
}
}
好的,我找到了解决方案invalidate()
,但是invalidate
和postInvalidate
之间有什么区别? cos都在工作..
另外,有什么用?
mDrawable.invalidateSelf()(cb);
答案 0 :(得分:6)
而不是调用mDrawable.invalidateSelf()
,而是调用postInvalidate()
(对于视图本身)。这将在当前完成之后安排另一个绘图过程。
此外,每次通过onDraw都不需要分配新的ShapeDrawable。只需在构造函数中分配一次。这将减少垃圾的产生。
答案 1 :(得分:0)
根据文档: http://developer.android.com/reference/android/view/View.html#invalidate()
invalidate()
使整个视图无效。如果视图可见,将来某个时候会调用onDraw(android.graphics.Canvas)。
必须从UI线程调用此方法。要从非UI线程调用,请调用postInvalidate()。
post invalidate将为UI线程(Main looper)排队一个无效任务,以FIFO方式执行。