【问题标题】:Invalidate-like method for WallpaperServices' draw methodWallpaperServices 的 draw 方法的类似 Invalidate 的方法
【发布时间】:2012-09-09 00:28:12
【问题描述】:

我试图使带有加速度计的移动位图更平滑,但无意中注意到,当我在 onDraw() 方法的末尾调用 invalidate(); 而不是在 onSensorChanged() 的末尾调用它时,我得到了更平滑的运动,即使我没有任何类型的低通滤波器。然后我尝试用我的 LiveWallpaper 做同样的事情,但是你知道在 EngineWallpaperService 中没有 onDraw() 方法,但是你必须自己创建一个并调用它,例如使用 Handler。但是即使其余代码与其他程序中的相同,这样做也不会产生任何更流畅的结果。

这是我在非壁纸程序中使用的代码,它运行良好:

public void onDraw(Canvas c) {

xPosition += xAcceleration;
yPosition += yAcceleration;

drawable = BitmapFactory.decodeResource(getResources(),R.drawable.ball);
c.drawBitmap(drawable, xPosition,yPosition, paint);

invalidate();

}

所以我去尝试为WallpaperService 创建我自己的类似无效的解决方案并想出了这个:

void drawFrame() {
final SurfaceHolder holder = getSurfaceHolder();

Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {
xPosition += xAcceleration;
yPosition += yAcceleration;

background = BitmapFactory.decodeResource(getResources(),R.drawable.bg);
drawable = BitmapFactory.decodeResource(getResources(),R.drawable.ball);

c.drawBitmap(background, 0,0, null);
c.drawBitmap(drawable, xPosition,yPosition, null);
}
} catch (Exception ex){
}
holder.unlockCanvasAndPost(c);
drawFrame();
}

所以我正在做的是:

  1. 获取Canvas
  2. Canvas上画画。
  3. 解锁 Canvas 并重新开始。

据我所知,这应该给我invalidate();-like 行为,但它会尝试显示壁纸,然后它给我 StackOverflowError。

【问题讨论】:

    标签: android canvas invalidation


    【解决方案1】:

    好的,我已经解决了这个问题。我所要做的就是将位图初始化移动到onCreate() 方法中。

    【讨论】:

    • 我要说的是,通过在绘制中无效(如果没有锁定 FPS),它会以代码或设备允许的速度绘制。通过在传感器上无效,它将在传感器更新时重绘。 IE。它可能会在平局时以 60fps 的速度更新,但传感器可能只会更新 45fps。
    • 哦,顺便说一句,你也是对的。当您在循环中一遍又一遍地解码相同的位图时,您可能正在泄漏内存。
    猜你喜欢
    • 2022-11-10
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多