2017-09-28 123 views
0

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

但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); 
    } 
} 

如何,我不是:

呼叫的onDraw每个为33ms

OR

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

回答

1

呼叫的OnDraw每个为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(); 
     } 
    } 
} 

效果:

enter image description here

+0

它的工作原理!真的很感谢,它真棒:) – SoptikHa

相关问题