Invalidate不会导致OnDraw

时间:2017-09-28 10:05:37

标签: c# android xamarin android-custom-view custom-view

我的Android应用有问题。我创建了自定义视图(http://syedwasihaider.github.io/blog/2015/07/12/XamarinViews/直到第2步),覆盖了onDraw,我绘制了黑屏和文本“Draw {i}”,其中i是每次onDraw发生时递增的数字。我想调用这个方法30次/秒(或60),所以我设置了每33毫秒导致Invalidate()的计时器。

但是Invalidate()根本不会导致onDraw! (这不像是无效和退出之间的延迟,根本没有调用提取)。我试图设置SetWillNotDraw(false),但它没有用。这是我的代码:

class DrawCanvas : View
{
    Context mContext;
    public DrawCanvas(Context context) : base(context)
    {
        init(context);
    }
    public DrawCanvas(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        init(context);
    }
    public DrawCanvas(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
    {
        init(context);
    }

    private void init(Context ctx)
    {
        mContext = ctx;

        black = new Paint() { Color = Color.Black };
        white = new Paint() { Color = Color.White };

        Timer timer = new Timer(33);
        timer.Elapsed += Timer_Elapsed;
        timer.Start();
    }

    private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Invalidate();
    }

    int i = 0;
    Paint black;
    Paint white;
    private void TestDraw(Canvas canvas)
    {
        canvas.DrawRect(0, 0, Width, Height, black);
        canvas.DrawText("Draw " + i, 10, 10, white);
        i++;
    }

    protected override void OnDraw(Canvas canvas)
    {
        TestDraw(canvas);
    }
}

我该怎么做:

每33毫秒调用一次渲染

获取onDraw方法中使用的画布? (试图在onDraw中保存作为参数出现的画布并在以后使用它,但是有一些奇怪的行为,所以它不起作用)。

1 个答案:

答案 0 :(得分:1)

  

每33毫秒调用一次渲染

您可以使用Handler来实现此功能。

每次DrawCanvas执行OnDraw方法时,您都可以向Handler发送消息,当您收到Handler中的消息时,可以调用DrawCanvas 1}}的{​​{1}}方法,此Invalidate方法将调用Invalidate方法。它会继续下去。

例如:

OnDraw

效果:

enter image description here