首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TextureView:在后台执行TextureView.getBitmap()

TextureView:在后台执行TextureView.getBitmap()
EN

Stack Overflow用户
提问于 2014-08-22 02:44:08
回答 2查看 3.8K关注 0票数 1

我正在TextureView中显示TextureView,并使用TextureView.getBitmap()TextureView获取位图。

每次我打电话给TextureView.getBitmap(),都会导致相机预览冻结一秒。我想在后台执行这项任务。

谢谢

下面是我尝试过的代码:

代码语言:javascript
运行
复制
     findViewById(R.id.capture).setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View v) {
             Bitmap bmp =  mTextureView.getBitmap();  
             rev = new ArrayList<Bitmap>();
             rev.add(bmp);
             Toast.makeText(getApplicationContext(),""+ rev.size(), Toast.LENGTH_LONG).show();
           }
        });     

这是我的日志

代码语言:javascript
运行
复制
       08-22 03:59:57.867: E/AndroidRuntime(4859): FATAL EXCEPTION: main
        08-22 03:59:57.867: E/AndroidRuntime(4859): java.lang.NullPointerException
        08-22 03:59:57.867: E/AndroidRuntime(4859):     at                              com.example.hangout_gif_camera.MainActivity$1.onClick(MainActivity.java:41)
      08-22 03:59:57.867: E/AndroidRuntime(4859):   at            android.view.View.performClick(View.java:4211)
     08-22 03:59:57.867: E/AndroidRuntime(4859):    at       android.view.View$PerformClick.run(View.java:17446)
     08-22 03:59:57.867: E/AndroidRuntime(4859):    at   android.os.Handler.handleCallback(Handler.java:725)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at         android.os.Handler.dispatchMessage(Handler.java:92)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at android.os.Looper.loop(Looper.java:153)
     08-22 03:59:57.867: E/AndroidRuntime(4859):    at android.app.ActivityThread.main(ActivityThread.java:5297)
   08-22 03:59:57.867: E/AndroidRuntime(4859):  at java.lang.reflect.Method.invokeNative(Native Method)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at java.lang.reflect.Method.invoke(Method.java:511)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
      08-22 03:59:57.867: E/AndroidRuntime(4859):   at dalvik.system.NativeStart.main(Native Method)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-22 02:54:08

代码语言:javascript
运行
复制
 freeze for a nano second

你甚至不会意识到它会冻结我们的眼睛,不能那么快地做出反应(除非你是超人)。

但是,如果您真的希望它在单独的线程中运行,您可以尝试如下:

编辑:

代码语言:javascript
运行
复制
findViewById(R.id.capture).setOnClickListener(new OnClickListener() {
               @Override
               public void onClick(View v) {
                 Thread td = new Thread(new Runnable() {
                   public void run()
                   {
                         Bitmap bmp =  mTextureView.getBitmap();  
                         rev = new ArrayList<Bitmap>();
                         rev.add(bmp);
                         runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                 Toast.makeText(getApplicationContext(),""+ rev.size(), Toast.LENGTH_LONG).show();
                            }
                        });
                   }
                 });
                 td.start(); //start the thread

               }
            }); 
票数 1
EN

Stack Overflow用户

发布于 2015-03-06 21:38:33

您必须在主UI线程上触发TextureView.getBitmap()。然后将这个Bitmap传递给一个AsyncTask,然后在那里执行剩下的操作。我就是这么做的,而且效果很好。

如果您正在捕获TextureView的每一个帧,例如从MediaRecorder中捕获,请注意内存问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25438814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档