gpt4 book ai didi

android - 在 Android 上以高帧率绘制高分辨率动画

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:52:39 24 4
gpt4 key购买 nike

我有 30 多个单位图(320x240 像素),我想在 Android 设备上以全屏方式一个接一个地显示,从而产生动画效果。目前,我使用 ImageView 和设置下一帧的计时器实现动画,然后发送将应用下一帧的消息。生成的帧速率非常低:< 2 fps。

计时器:

animationTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Drawable frame = getNextFrame();
if (frame != null) {
Message message = animationFrameHandler.obtainMessage(1, frame);
animationFrameHandler.sendMessage(message);
}
}
}, 0, (int) (1000.0d / fps));

处理程序:

final Handler animationFrameHandler = new Handler() {
@Override
public void handleMessage(Message message) {
setImageDrawable((Drawable) message.obj);
}
};

因为我想实现高达 30 fps 的帧速率,所以我必须使用另一种机制并听说过 Canvas.drawBitmapMesh()OpenGL

如果可能,我想避免使用 OpenGL。

非常感谢您分享您的经验!

最佳答案

我现在的工作方法如下:

在开始动画之前,将每一帧加载到 List<Bitmap> 中.重要提示:调用System.gc()如果你得到 OutOfMemoryError s – 这确实有助于将更多位图加载到内存中。然后运行一个线程,将下一帧发布到 View 实例,然后更新它的 Canvas 。

加载帧并开始动画

// Loading the frames before starting the animation
List<Bitmap> frames = new ArrayList<Bitmap>();
for (int i = 0; i < 30; i++) {
// Load next frame (e. g. from drawable or assets folder)
frames.add(...);
// Do garbage collection every 3rd frame; really helps loading all frames into memory
if (i %% 3 == 0) {
System.gc();
}
}

// Start animation
frameIndex = 0;
animationThread.start();

应用下一帧的线程

private final class AnimationThread extends Thread {
@Override
public void run() {
while (!isInterrupted()) {
// Post next frame to be displayed
animationView.postFrame(frames.get(frameIndex));

// Apply next frame (restart if last frame has reached)
frameIndex++;
if (frameIndex >= frames.size()) {
frameIndex = 0;
}

try {
sleep(33); // delay between frames in msec (33 msec mean 30 fps)
} catch (InterruptedException e) {
break;
}
}
}
}

动画 View

class AnimationView extends View {
Bitmap frame = null;

public void postFrame(Bitmap frame) {
Message message = frameHandler.obtainMessage(0, frame);
frameHandler.sendMessage(message);
}

protected final Handler frameHandler = new Handler() {
@Override
public void handleMessage(Message message) {
if (message.obj != null) {
frame = (Bitmap) message.obj;
} else {
frame = null;
}
invalidate();
}
}

@Override
protected void onDraw(Canvas canvas) {
if (frame == null) return;
canvas.drawARGB(0, 0, 0, 0);
canvas.drawBitmap(frame, null, null, null);
}
}

关于android - 在 Android 上以高帧率绘制高分辨率动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4724355/

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