2017-09-28 12 views
0

Android 앱에 문제가 있습니다. 나는 사용자 정의보기 (http://syedwasihaider.github.io/blog/2015/07/12/XamarinViews/ 2 단계까지)를 작성하고 onDraw를 재정의하고 검은 화면과 텍스트 "Draw {i}"를 그립니다. 여기서 i은 onDraw가 발생할 때마다 증가하는 숫자입니다. 이 메서드를 30 번/초 (또는 60) 호출하고 싶습니다. 그래서 33ms마다 Invalidate()를 발생시키는 타이머를 설정했습니다.무효화로 인해 OnDraw가 발생하지 않습니다.

하지만 Invalid를 사용하면 onDraw가 발생하지 않습니다. (무효화와 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); 
    } 
} 

어떻게 수 I 중 하나를

전화 onDraw는 33ms마다

또는

가 된 onDraw 방법에 캔버스를 사용하기? (onDraw에서 매개 변수로 제공되는 캔버스를 저장하고 나중에 사용하려고 시도했지만 이상한 동작이 있었기 때문에 작동하지 않았습니다.)

답변

1

전화는 33ms마다

당신은이 기능을 구현하기 위해 Handler를 사용할 수의 OnDraw.

때마다

당신의 DrawCanvas OnDraw 방법을 실행하면, Handler에게 메시지를 보낼 수는 Handler에서 메시지를받을 때, 당신은 DrawCanvas의이 Invalidate 방법이 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