- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我从 opencv4android(人脸检测)复制了示例代码。我通过了NDK部分。并在手机上运行该应用程序。但是 SurfaceView 仅显示相机预览。似乎在 OnCameraFrame 中所做的任何事情都不会影响 SurfaceView 上的 Canvas 。所以我追踪到他们的SDK。问题出在 deliverAndDrawFrame 函数中。以前有人遇到过同样的问题吗?
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
Log.d(TAG, "mStretch value: " + mScale);
if (mScale != 0) {
canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2),
(int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2),
(int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2 + mScale*mCacheBitmap.getWidth()),
(int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2 + mScale*mCacheBitmap.getHeight())), null);
} else {
canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,
(canvas.getHeight() - mCacheBitmap.getHeight()) / 2,
(canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(),
(canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null);
}
if (mFpsMeter != null) {
mFpsMeter.measure();
mFpsMeter.draw(canvas, 20, 30);
}
getHolder().unlockCanvasAndPost(canvas);
}
错误:
10-09 21:57:47.485 28018-28088/com.example.tim.r3dmobileclient E/SurfaceHolder﹕ Exception locking surface
java.lang.IllegalArgumentException
at android.view.Surface.nativeLockCanvas(Native Method)
at android.view.Surface.lockCanvas(Surface.java:253)
at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:848)
at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:816)
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:412)
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:348)
at java.lang.Thread.run(Thread.java:841)
最佳答案
在尝试锁定 Canvas 之前,您是否尝试过检查表面是否有效?如果所有这些代码都在循环中,请尝试在锁定 Canvas 之前将其放入:
if(!getHolder().getSurface().isValid()){
continue;
}
如果它不在循环内,请尝试将所有代码(从锁定 Canvas 及下方)放入此 if 语句中:
if(getHolder().getSurface().isValid()){
//code goes here
}
关于java - lockCanvas 不断抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33040448/
标题说的很清楚,不过我会给出一个代码示例以防万一。这是来自 Android SDK 中的 LunarLander 示例: @Override public void run() {
我从 opencv4android(人脸检测)复制了示例代码。我通过了NDK部分。并在手机上运行该应用程序。但是 SurfaceView 仅显示相机预览。似乎在 OnCameraFrame 中所做的任
在速度较慢的设备(Orange San Francisco 又名 ZTE Blade)上测试我的游戏时,我得到了一个令人震惊的帧速率。 我将一些调试代码放入绘图循环中,发现以下行占用了超过 100 毫
我创建了一个扩展 SurfaceView 的类,以便循环一系列 ARGB 位图。这主要是有效的,除了(通常但不总是)为每个新帧保留底层位图的状态。 换句话说,如果我显示的第一帧是不透明的,而随后的帧是
我以给定的速度平滑滚动位图。我正在用游戏循环来做这件事。它滚动非常流畅,大约 60 fps,除了偶尔的卡顿/跳跃。这些跳跃从每秒一次到每秒几次不等。通常它们会在运行几秒钟后开始或变得更频繁,但我不确定
我正在尝试在 Android 中构建动态壁纸,但当方向改变时应用程序崩溃了。尝试将 Canvas 锁定在表面支架上时看起来它正在崩溃,但我不确定我能做些什么来防止它。 这是类: public clas
我正在开发一款安卓游戏,我正在使用 SurfaceView。我有一个每 16 毫秒调用一次的方法(我想要 60fps) public void myDraw(SurfaceHolder holder)
我一直在为这个异常而苦苦挣扎,我环顾四周,但没有任何帮助。 这是代码 package com.example.surfacetest; import android.app.Activity; imp
我正在实现一个 SurfaceView 子类,我在其中运行一个单独的线程来绘制到 SurfaceHolders Canvas 上。我正在测量调用 lockCanvas() 之前和之后的时间,我从大约
尝试在单个 Canvas 上每毫秒绘制一些东西。我的意思是只向 Canvas 添加细节,而不是每一帧都重新绘制。所以这段代码给了我三个不同的 Canvas 。第三,然后又是第一。为什么? public
每次我调用这些方法时,都需要 14-20 毫秒才能继续。 Canvas canvas = holder.lockCanvas(); holder.unlockCanvasAndPost(canvas)
我正在为 Android 开发一个小游戏(测试),但我不明白用 SurfaceView 创建一个好的 Timer 线程的逻辑。 [SurfaceView object].getHolder().loc
我有一个自定义的 SurfaceView,它带有绘制背景和位图的方法 doDraw()。问题是当我运行它时出现错误 Caused by: java.lang.IllegalArgumentExcept
我正在制作游戏,由于我是 Android 的新手,所以我的设计基于示例 LunarLander code .在其设计中,GameThread.doStart() 从 GameActivity 调用,然
我正在尝试创建一个 Canvas 并使用以下代码向其绘制位图: Paint paint = new Paint(); InputStream is = assets.open("card_art" +
在 onPreviewFrame 中使用 lockCanvas() 时,我遇到了 IllegalArgumentException。 基本上我想实现的是抓取frame,处理,直接绘制到SurfaceP
我在市场上有一款 Android 游戏,在尝试使用 Canvas 时收到 NullPointers 的崩溃报告。我可以假设这是因为 SurfaceHolder.lockCanvas() 正在返回 nu
我想问一个已经在这里解决过一两次的问题,但是我找到的信息都不能帮助我解决几天前遇到的问题。 我想使用 Canvas 为 Android 制作动态壁纸 - 它在图形上不够复杂,不需要 OpenGL。为简
我正在尝试在我的 Canvas 上使用适用于 Android 的硬件加速。我曾经有一个 SurfaceView ,我在上面做了 lockCanvas() 以获得后来绘制的 Canvas ,但我改为 T
使用 MediaCodec 生成视频的大部分代码到目前为止我已经看到要么使用纯OpenGL或从 MediaCodec 生成的 Surface 锁定 Canvas 并对其进行编辑。我可以同时使用两者吗?
我是一名优秀的程序员,十分优秀!