我正在创建一个相机应用,需要检测触摸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>
我添加了onTouchEvent
和onInterceptTouchEvent
但两者都无效。每当我触及sufaceView
记录中没有显示时,我想我错过了一些东西,你能告诉我吗?
答案 0 :(得分:2)
preview = new Preview(this,surfaceView);
preview.setCamera();
MainActivity中只有两行代码初始化预览,而setCamera()则没有其他内容。
为什么您没有看到onTouchEvent
和onInterceptTouchEvent
日志?
我认为,您尚未将该布局添加到视图层次结构中。
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"
到“预览”布局,以允许处理点击。
希望有所帮助。