我在 android 中使用像 drawCircle 和 drawPoint 这样的画布函数。这工作正常。
但是现在的问题是延迟绘制这些不同的项目,所以它看起来像一个动画。
我应该使用什么样的机制?尝试过异步,但我不喜欢这种方式。
我应该使用某种仅按时间间隔绘制的计时器,还是有其他聪明的方法可以做到这一点?
我在 android 中使用像 drawCircle 和 drawPoint 这样的画布函数。这工作正常。
但是现在的问题是延迟绘制这些不同的项目,所以它看起来像一个动画。
我应该使用什么样的机制?尝试过异步,但我不喜欢这种方式。
我应该使用某种仅按时间间隔绘制的计时器,还是有其他聪明的方法可以做到这一点?
我使用这种策略,首先我以这种方式声明一个 Handler 和一个 Runnable:
private final Observable mObservable = new Observable();
private final static int TIME_STEP_MS = 5;
private final Handler mHandler = new Handler();
private final Runnable mTimeManager = new Runnable()
{
public void run()
{
mObservable.notifyObservers(TIME_STEP_MS);
mHandler.postDelayed(mTimeManager, TIME_STEP_MS);
}
};
然后,当我想启动我的时间管理器时,我只需调用 mTimeManager.run(),它就会开始Observer
定期通知我的 s(之前添加的)。
如果您出于某种原因需要停止计时器或您只需执行以下操作:
mHandler.removeCallbacks(mTimeManager);
[编辑-更完整的代码]
好吧,让我们更清楚一点,首先我制作了一个像这样的自定义 Observable 对象[这是可选的]:
private final Observable mObservable = new Observable()
{
public void notifyObservers()
{
setChanged();
super.notifyObservers();
};
@Override
public void notifyObservers(Object data)
{
setChanged();
super.notifyObservers(data);
};
};
这样做的原因只是因为我不能在 Observable 类之外调用 setChanged() - 它是受保护的,如果它没有改变它不会通知任何观察者。
其他声明与之前显示的相同,现在我需要在TimeManager
某个地方开始,我的应用程序是 LiveWallpaper,我将所有渲染内容放入一个扩展 aThread
但你不一定需要的类中,我创建了一个名为 的方法resumeDrawing()
,这个是super.start();
在我@Override
的班级之后立即调用public synchronized void start()
的Thread
,该方法如下所示:
public void resumeDrawing()
{
if (!mTimeManagerRunning) // just a boolean field in my class
{
System.err.println("Resuming renderer."); // just for debug
mTimeManager.run();
mTimeManagerRunning = true;
}
else
{
System.err.println("Renderer already running."); // just for debug
}
}
它是双重的:
public void pauseDrawing()
{
if (mTimeManagerRunning)
{
System.err.println("Pausing renderer.");
mHandler.removeCallbacks(mTimeManager);
mTimeManagerRunning = false;
}
else
{
System.err.println("Renderer already paused.");
}
}
好的,现在我们可以启动和停止时间管理器,但是谁在听呢?没有人!所以让我们添加:在我的 Renderer 的构造函数中,我Observer
向我的对象添加了一些 s mObservable
,其中之一是 Renderer 本身,所以我的渲染器扩展Thread
并实现Observer
:
@Override // from Observer interface
public void update(Observable arg0, Object arg1)
{
mElapsedMsRedraw += (Integer) arg1;
if (mElapsedMsRedraw >= mDrawingMsPerFrame)
{
mElapsedMsRedraw = 0;
drawEm(); // refresh the canvas and stuff
}
}
添加观察者,您只需这样做mObservable.addObserver(THE_OBJECT - Implements Observer)
您可以看到,每次收到通知时我都不会重新渲染我的东西,那是因为我将这个 TimeManager 用于其他想法,而不仅仅是刷新Canvas
我想在内部绘制的对象的位置。
所以,你需要减慢绘图速度是改变你的对象在时间流逝时内部变化的方式,我的意思是你的圆圈和点等,或者你可以选择你的时间步长,我推荐第一个。
是不是更清楚了?我希望它有所帮助。
我会使用计时器,或创建动画。你可以创建动画来做各种各样的事情,包括随着时间的推移改变透明度。
这是动画资源的Android 文档
我相信可能有复杂的方法可以做到这一点,但出于我的需要,我使用了一种具有很多优点的简单方法:我首先为绘图的每个点创建坐标记录(以及所需的任何其他数据)——而不是在现场绘制点 - 然后使用计时器(最好是 Android 处理程序)重现它们。这在实际绘图时也提供了很多可能性:暂停,快/慢,倒退,......我不知道这种方法是否可以用于复杂的绘图,但它可以用于绘制形状,曲线,曲面, ETC。