在Surfaceview android上检测Touch

时间:2017-04-21 07:31:10

标签: android ontouchlistener

我正在创建一个相机应用,需要检测触摸surfaceView这是相机预览。我想设置用户触摸的相机焦点。但是,我只需要检测触摸位置。

这是我的预览类代码。

public class Preview extends SurfaceView implements SurfaceHolder.Callback {
    public Preview(Context ctx, SurfaceView surfaceView) {
      super(ctx);
      init(surfaceView);
    }

  private void init(SurfaceView surfaceView){
        mSurfaceView = surfaceView;
        final SurfaceHolder surfaceHolder = mSurfaceView.getHolder();
        surfaceHolder.addCallback(this);
  }
  public void setCamera(){
     mCamera = Camera.open()
         mCamera.setPreviewDisplay(mSurfaceView.getHolder());
            mCamera.startPreview();
  }
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    Log.i(TAG, "onInterceptTouchEvent");
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i(TAG, "onTouchEvent");
    return super.onTouchEvent(event);
}
 // Other code.... like override methods etc

MainActivity

  // inside onCreate() method
  preview = new Preview(this, surfaceView);
    RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.mainLayout);
    mainLayout.addView(preview);
  preview.setCamera();
  // Other codes .....

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/mainLayout">
<SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
</RelativeLayout> 

我添加了onTouchEventonInterceptTouchEvent但两者都无效。每当我触及sufaceView 记录中没有显示时,我想我错过了一些东西,你能告诉我吗?

2 个答案:

答案 0 :(得分:2)

  

preview = new Preview(this,surfaceView);

     

preview.setCamera();

     

MainActivity中只有两行代码初始化预览,而setCamera()则没有其他内容。

为什么您没有看到onTouchEventonInterceptTouchEvent日志?

我认为,您尚未将该布局添加到视图层次结构中。

 rootView.addView(preview);

添加后,您应该看到触摸事件日志。

但那并不是你真正期望做的事情,因为你错了#34;包裹&#34;您的SurfaceView在Java类中,但这并不意味着SurfaceView上的触摸事件会反映在您的日志中。

你真正想要的是extend SurfaceView并覆盖那些触摸事件。现在您将收到正确的触摸事件。然后确保将自定义SurfaceView充气到视图层次结构中。

或者,第二种方法,您可以将SurfaceView添加为ViewGroup的孩子:

yourCustomViewGroup.addView(surfaceView);

答案 1 :(得分:0)

扩展类存在一些问题,因为它不包含所有必需的覆盖方法。但是我会假设这仍在开发中。

理论上这应该有效:

preview.setOnClickListener( new OnClickListener(){
    @Override
    public void onClick() {
        //do stuff
    }
});

我还没有对它进行测试,但由于这是在扩展ViewGroup,所以这应该可行。

注意:您可能需要添加此

android:clickable="true"

到“预览”布局,以允许处理点击。

希望有所帮助。