设置drawable.invalidate以在画布上连续绘制

时间:2012-03-11 07:53:14

标签: android callback drawable invalidation

我正在尝试逐步更改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(),但是invalidatepostInvalidate之间有什么区别? cos都在工作..

另外,有什么用?

mDrawable.invalidateSelf()(cb);

2 个答案:

答案 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方式执行。