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