2017-09-28 17 views
0

Ich habe ein Problem mit meiner Android App. Ich habe benutzerdefinierte Ansicht erstellt (http://syedwasihaider.github.io/blog/2015/07/12/XamarinViews/ bis Schritt 2), überschreiben onDraw und ich zeichne schwarzen Bildschirm und Text "Draw {i}" wobei i ist Nummer, die jedes Mal erhöht, wenn OnDraw auftritt. Ich möchte diese Methode 30 mal/Sekunde (oder 60) aufrufen, also habe ich einen Timer eingerichtet, der Invalidate() alle 33 ms auslöst.Invalidate verursacht keine OnDraw

Aber Invalidate() verursacht überhaupt keine onDraw! (Es ist nicht wie eine Verzögerung zwischen Invalidate und Ondraw, Ondraw wird überhaupt nicht aufgerufen). Ich habe versucht, SetWillNotDraw(false) einzustellen, aber es hat nicht funktioniert. Hier ist mein Code:

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

Wie kann ich entweder:

Anruf OnDraw alle 33ms

ODER

Leinwand erhalten, die in OnDraw-Methode verwendet wird? (versucht, Canvas zu speichern, das als Parameter in onDraw kommt und es später benutzt, aber es gab etwas merkwürdiges Verhalten, also hat es nicht funktioniert).

Antwort

1

Anruf OnDraw alle 33ms

Sie Handler diese Funktion implementieren nutzen könnten.

Jedes Mal, wenn Ihr DrawCanvas führen die OnDraw Methode, können Sie eine Nachricht an Handler senden, wenn Sie die Nachricht in Handler erhalten, könnten Sie die DrawCanvas ‚s Invalidate Methode aufrufen, diese Invalidate Methode OnDraw Methode aufrufen wird. Es wird weitergehen.

Zum Beispiel:

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

Wirkung:

enter image description here

+0

Es funktioniert! Wirklich danke, es ist super :) – SoptikHa