Java TextureView:在后台执行TextureView.getBitmap()
我正在Java TextureView:在后台执行TextureView.getBitmap(),java,android,bitmap,camera,textureview,Java,Android,Bitmap,Camera,Textureview,我正在TextureView中显示CameraView,并使用TextureView.getBitmap()从TextureView获取位图 每次调用TextureView.getBitmap()时,它都会导致相机预览冻结一纳秒。我想在后台运行此任务 谢谢 以下是我尝试过的代码: findViewById(R.id.capture).setOnClickListener(new OnClickListener() { @Override pu
TextureView
中显示CameraView
,并使用TextureView.getBitmap()
从TextureView
获取位图
每次调用TextureView.getBitmap()
时,它都会导致相机预览冻结一纳秒。我想在后台运行此任务
谢谢
以下是我尝试过的代码:
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();
}
});
你甚至不会意识到它冻结了我们的眼睛,我们的反应不会那么快(除非你是超人)
但如果您确实希望它在单独的线程中运行,可以尝试以下方法:
编辑:
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
}
});
findviewbyd(R.id.capture).setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Thread td=新线程(new Runnable(){
公开募捐
{
位图bmp=mTextureView.getBitmap();
rev=新的ArrayList();
修订增补(bmp);
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
Toast.makeText(getApplicationContext(),“”+rev.size(),Toast.LENGTH\u LONG.show();
}
});
}
});
td.start();//启动线程
}
});
您必须在主UI线程上的上启动TextureView.getBitmap()
。然后将该位图
传递给异步任务
并在那里执行其余操作。我就是这样做的,效果很好
如果要捕获
TextureView
的每一帧,请注意内存问题,例如,从MediaRecorder
它会导致我的应用程序crash@DonnieIbiyemi你能把我刚贴的logcatRod_Algonquin贴出来吗it@DonnieIbiyemi第41行是什么?Rod_Algonquin Toast消息我发现在Galaxy S5上获得1920x1080位图大约需要50毫秒,这对于UI线程来说相当重要。在一半大小时,大约需要15毫秒,四分之一大小大约需要5毫秒。因此,这个解决方案是可行的(并且可能是唯一的选择),但我仍然认为它的性能不是很好/
freeze for a nano second
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
}
});