2013-11-20 53 views
0

如何在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(); 

} 



} 
+0

在單獨的線程中使用「runonUIThread」執行此操作android function –

+0

我嘗試使用單獨的runonUIThread,它非常緩慢,需要很長時間才能將按鈕設置爲可見。同樣,如果我在菜單之間切換,它不起作用,即如果按鈕被啓用或禁用,它將繼續在所有三個菜單選項中這樣做。我用我的代碼更新了這個問題。 – Darshan

回答

0

我只是想btnOK.setVisibility(View.INVISIBLE);工作正常。

+0

問題是onCameraFrame在UI線程之外運行的方法,我必須在那裏進行修改。我試過btnOK.setVisibility(View.INVISIBLE);在這種方法之外,即在創建方法之外,它工作得很好 – Darshan