gpt4 book ai didi

android - 延迟在 Canvas 上绘制 - "make onDraw() slow down"

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:51 29 4
gpt4 key购买 nike

我在 android 中使用像 drawCircle 和 drawPoint 这样的 Canvas 函数。这很好用。

但是现在的问题是要延迟绘制这些不同的项目,所以它看起来像一个动画。

我应该使用什么样的机制?尝试过异步,但我不喜欢这种方式。

我应该使用某种只按间隔绘制的计时器还是有其他巧妙的方法来做到这一点?

最佳答案

我使用这个策略,首先我以这种方式声明一个 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(之前添加)。

如果您出于某种原因需要停止计时器或您只需这样做:

    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() - 它是 protected ,如果它没有改变它不会通知任何观察者。

其他声明与之前所示保持相同,现在我需要在某处启动此 TimeManager,我的应用程序是一个 LiveWallpaper,我将所有渲染内容放入一个扩展 Thread 的类中 但你不一定需要那个,我做了一个名为 resumeDrawing() 的方法,这个方法在我的 super.start(); 之后调用Thread 类的public synchronized void start()@Override,方法如下所示:

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

好的,现在我们可以启动和停止时间管理器了,但是谁在听呢?没有人!所以让我们添加:在我的渲染器的构造函数中,我将一些 Observer 添加到我的 mObservable 对象,其中之一是渲染器本身,所以我的渲染器扩展了 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 - 延迟在 Canvas 上绘制 - "make onDraw() slow down",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826391/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com