Invalidate 不会导致 OnDraw

Invalidate doesn't cause OnDraw

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

但是 Invalidate() 根本不会导致 onDraw! (这不像是 invalidate 和 ondraw 之间的延迟,根本不调用 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方法中使用的canvas? (试图保存作为参数出现在 onDraw 中的 canvas 并在以后使用它,但是有一些奇怪的行为,所以它没有用)。

Call onDraw every 33ms

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

每次你的DrawCanvas执行OnDraw方法,你可以发送消息给Handler,当你在Handler收到消息时,你可以调用DrawCanvasInvalidate方法,这个Invalidate方法会调用OnDraw方法。它将继续。

例如:

class DrawCanvas : View
{
     MyHandler mHandler;
     ...
     private void init(Context ctx)
     {
         mHandler = new MyHandler(this);
         mContext = ctx;
         black = new Paint() { Color = Color.Black,TextSize=56 };
         white = new Paint() { Color = Color.White, TextSize = 56 };
     }
     ...
     protected override void OnDraw(Canvas canvas)
     {
         TestDraw(canvas);
         mHandler.SendEmptyMessageDelayed(1,33);
     }
     ...
     public class MyHandler : Handler
     {
         private DrawCanvas drawCanvas;

         public MyHandler(DrawCanvas drawCanvas)
         {
             this.drawCanvas = drawCanvas;
         }

         public override void HandleMessage(Message msg)
         {
             base.HandleMessage(msg);
             drawCanvas.Invalidate();
         }
     }
}

效果: