【发布时间】:2019-04-02 17:31:33
【问题描述】:
我正在为 Android 制作动态壁纸。该代码有效,但我有性能问题。基本上我正在绘制位图并移动它们。有 15 个小图像,它工作正常。但是有了 50 张更大的图像,它就开始滞后了。
在我的移动对象中,我在构造函数中创建位图并像这样显示它:
public void drawFrame(Canvas canvas) {
Position p = movingStrategy.move();
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
matrix.postRotate(p.getRotation());
matrix.postTranslate(p.getPositionX(), p.getPositionY());
canvas.drawBitmap(bitmap, matrix, paint);
}
在我的壁纸服务中,我这样调用 onDraw:
private void draw() {
handler.removeCallbacks(drawRunner);
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
canvas.save();
canvas.drawColor(Color.BLACK);
for (DrawElement element : elements) {
element.drawFrame(canvas);
}
canvas.restore();
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
if (visible) {
handler.postDelayed(drawRunner, 1);
}
}
我尝试将它与普通视图一起使用,它是 onDraw 并且它工作正常。它非常光滑。现在我问自己如何提高性能。我也尝试了不同的delayMillis,但性能并没有提高。
我也听说过 GLWallpaperService,但是绘制简单的位图似乎很复杂。所以我想改用 Canvas。
谢谢
编辑:
我已经测试了视图和服务之间的性能。这部分:
long start = System.currentTimeMillis();
for (DrawElement element : elements) {
element.drawFrame(canvas);
}
Log.e("DrawingTime", Long.toString(System.currentTimeMillis()-start));
在 0-1 毫秒内获取视图,在 50 到 300 毫秒之间获取服务。
【问题讨论】:
标签: android android-canvas live-wallpaper