如何在 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.

希望这个答案对其他人也有帮助。