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
收到消息时,你可以调用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();
}
}
}
效果:
我的 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
收到消息时,你可以调用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();
}
}
}
效果: