如何在android的opencv中实现按钮禁用和启用功能。我也跟着this后,并能够得到surfaceview.Now显示一个按钮,如果我尝试禁用此按钮或使用按钮在opencv for android中禁用和启用功能(runOnUiThread)
btnOK.setEnabled(false); or btnOK.setVisibility(View.INVISIBLE);
使其不可见它会抛出一个错误,说
E/AndroidRuntime (24225): android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的 原始线程可以触及其视图。
public class Tutorial2Activity extends Activity implements CvCameraViewListener2,OnTouchListener{
private Mat mIntermediateMat;
private Mat mGray;
private Button learnbutton;
private volatile Thread btnthread;
private MenuItem mItemPreviewLearn;
private MenuItem mItemPreviewFeatures;
private MenuItem mItemPreviewMatcher;
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.tutorial2_surface_view);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial2_activity_surface_view);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
ArrayList<View> views = new ArrayList<View>();
views.add(findViewById(R.id.learnbutton));
learnbutton=(Button)findViewById(R.id.learnbutton);
mOpenCvCameraView.addTouchables(views);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
mItemPreviewFeatures = menu.add("Find features");
mItemPreviewLearn = menu.add("Learn object");
mItemPreviewMatcher = menu.add("Find Match");
return true;
}
@Override
public void onPause()
{
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
@Override
public void onResume()
{
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
mGray = new Mat(height, width, CvType.CV_8UC1);
}
public void onCameraViewStopped() {
mRgba.release();
mGray.release();
mIntermediateMat.release();
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
final int viewMode = mViewMode;
switch (viewMode) {
case VIEW_MODE_LEARN:
// make button invisible here
//learnbutton.setVisibility(View.GONE);
//learnbutton.setEnabled(false);
//learnbutton.setVisibility(View.INVISIBLE);
runThread();
mRgba = inputFrame.rgba();
break;
case VIEW_MODE_FEATURES:
//enable the button here
break;
case VIEW_MODE_MATCHER:
//enable the button here
break;
}
return mRgba;
}
private void runThread()
{
btnthread = new Thread() {
public void run() {
{
runOnUiThread(new Runnable() {
@Override
public void run() {
learnbutton.setVisibility(View.VISIBLE);
}
});
}
}
};
btnthread.start();
}
}
在单独的线程中使用“runonUIThread”执行此操作android function –
我尝试使用单独的runonUIThread,它非常缓慢,需要很长时间才能将按钮设置为可见。同样,如果我在菜单之间切换,它不起作用,即如果按钮被启用或禁用,它将继续在所有三个菜单选项中这样做。我用我的代码更新了这个问题。 – Darshan