如何在 CanvasWatchFaceService 的 onDraw() 中获得硬件加速 Canvas?
How to get hardware accelerated Canvas in onDraw() of CanvasWatchFaceService?
我正在开发 android 佩戴的表盘。我想让 Canvas 硬件加速。
在清单中我声明如下
<application
android:hardwareAccelerated="true"
..>
<service
android:name=".WatchFaceMain"
android:hardwareAccelerated="true"
..>
</application>
但是当我从我的 onDraw(Canvas canvas, Rect bounds) 方法内部检查它时 canvas.isHardwareAccelerated() returns false。这显然意味着我的 canvas 没有硬件加速。
@Override
public void onDraw(Canvas canvas, Rect bounds) {
...
boolean isAccelarated = canvas.isHardwareAccelerated();
.......
}
如何使这个 canvas 硬件加速?
终于找到了这个问题的解决方案。虽然这不是一个直接或简单的解决方案。
首先,我必须从我的 WatchFaceMain class 扩展的库中复制整个 android.support.wearable.watchface.CanvasWatchFaceService class。
然后我不得不像下面那样编辑引擎 Class 中的 draw() 方法
public abstract class CanvasWatchFaceService extends WatchFaceService {
.....
public class Engine extends android.support.wearable.watchface.WatchFaceService.Engine {
...
private void draw(SurfaceHolder holder) {
this.mDrawRequested = false;
Canvas canvas = holder.getSurface().lockHardwareCanvas();
if(canvas != null) {
try {
this.onDraw(canvas, holder.getSurfaceFrame());
} finally {
holder.getSurface().unlockCanvasAndPost(canvas);
}
}
}
}
}
我在 onDraw 中编辑了两行,如下所示。
from
Canvas canvas = holder.lockCanvas();
To
Canvas canvas = holder.getSurface().lockHardwareCanvas();
And From
holder.unlockCanvasAndPost(canvas);
To
holder.getSurface().unlockCanvasAndPost(canvas);
我仍然想知道为什么 CanvasWatchFaceService 没有提供任何更简单的方法来请求硬件加速 canvas!
More detail solution is available here in this Article.
希望这个答案对其他人也有帮助。
我正在开发 android 佩戴的表盘。我想让 Canvas 硬件加速。
在清单中我声明如下
<application
android:hardwareAccelerated="true"
..>
<service
android:name=".WatchFaceMain"
android:hardwareAccelerated="true"
..>
</application>
但是当我从我的 onDraw(Canvas canvas, Rect bounds) 方法内部检查它时 canvas.isHardwareAccelerated() returns false。这显然意味着我的 canvas 没有硬件加速。
@Override
public void onDraw(Canvas canvas, Rect bounds) {
...
boolean isAccelarated = canvas.isHardwareAccelerated();
.......
}
如何使这个 canvas 硬件加速?
终于找到了这个问题的解决方案。虽然这不是一个直接或简单的解决方案。
首先,我必须从我的 WatchFaceMain class 扩展的库中复制整个 android.support.wearable.watchface.CanvasWatchFaceService class。
然后我不得不像下面那样编辑引擎 Class 中的 draw() 方法
public abstract class CanvasWatchFaceService extends WatchFaceService {
.....
public class Engine extends android.support.wearable.watchface.WatchFaceService.Engine {
...
private void draw(SurfaceHolder holder) {
this.mDrawRequested = false;
Canvas canvas = holder.getSurface().lockHardwareCanvas();
if(canvas != null) {
try {
this.onDraw(canvas, holder.getSurfaceFrame());
} finally {
holder.getSurface().unlockCanvasAndPost(canvas);
}
}
}
}
}
我在 onDraw 中编辑了两行,如下所示。
from
Canvas canvas = holder.lockCanvas();
To
Canvas canvas = holder.getSurface().lockHardwareCanvas();
And From
holder.unlockCanvasAndPost(canvas);
To
holder.getSurface().unlockCanvasAndPost(canvas);
我仍然想知道为什么 CanvasWatchFaceService 没有提供任何更简单的方法来请求硬件加速 canvas!
More detail solution is available here in this Article.
希望这个答案对其他人也有帮助。