2013-11-20 137 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