Android SurfaceView 不响应触摸事件
Android SurfaceView not responding to touch events
我正在尝试获取一个简单的表面视图来响应触摸事件。下面的应用程序启动但不响应触摸事件。我有一个 Log.i 语句来确认(通过打印到控制台)触摸事件是否有效。谁能告诉我我做错了什么?
这是我的主activity
public class MainActivity extends Activity {
public static int screenWidth, screenHeight;
public static boolean running=true;
public static MainSurface mySurface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//this gets the size of the screen
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
screenWidth = displaymetrics.widthPixels;
screenHeight = displaymetrics.heightPixels;
Log.i("MainActivity", Integer.toString(screenWidth) + " " + Integer.toString(screenHeight));
mySurface = new MainSurface(this);
setContentView(mySurface);
}
}
这是平面图class
public class MainSurface extends SurfaceView implements OnTouchListener {
public MainSurface(Context context) {
super(context);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
int point = event.getPointerCount();
Log.i("MainSurface", Integer.toString(x)); //nothing prints to the console here
return true;
}
}
您应该在触摸事件中识别 Action
,例如:
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_OUTSIDE:
break;
}
return true;
}
- 移除
implements OnTouchListener
.
- 将
onTouch(View v, MotionEvent event)
更改为 onTouchEvent(MotionEvent event)
。
它不起作用的原因是 SurfaceView 不知道它应该是它自己的 OnTouchListener,而无需您告诉它。或者,您可以通过将此代码添加到您的 onCreate():
来使其工作
mySurface = new MainSurface(this);
mySurface.setOnTouchListener(mySurface);
然而,由于 SurfaceView 已经有一个 OnTouchEvent 函数,直接使用它更简单。
另外,不要将 SurfaceView 声明为静态的。
我正在尝试获取一个简单的表面视图来响应触摸事件。下面的应用程序启动但不响应触摸事件。我有一个 Log.i 语句来确认(通过打印到控制台)触摸事件是否有效。谁能告诉我我做错了什么?
这是我的主activity
public class MainActivity extends Activity {
public static int screenWidth, screenHeight;
public static boolean running=true;
public static MainSurface mySurface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//this gets the size of the screen
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
screenWidth = displaymetrics.widthPixels;
screenHeight = displaymetrics.heightPixels;
Log.i("MainActivity", Integer.toString(screenWidth) + " " + Integer.toString(screenHeight));
mySurface = new MainSurface(this);
setContentView(mySurface);
}
}
这是平面图class
public class MainSurface extends SurfaceView implements OnTouchListener {
public MainSurface(Context context) {
super(context);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
int point = event.getPointerCount();
Log.i("MainSurface", Integer.toString(x)); //nothing prints to the console here
return true;
}
}
您应该在触摸事件中识别 Action
,例如:
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_OUTSIDE:
break;
}
return true;
}
- 移除
implements OnTouchListener
. - 将
onTouch(View v, MotionEvent event)
更改为onTouchEvent(MotionEvent event)
。
它不起作用的原因是 SurfaceView 不知道它应该是它自己的 OnTouchListener,而无需您告诉它。或者,您可以通过将此代码添加到您的 onCreate():
来使其工作mySurface = new MainSurface(this);
mySurface.setOnTouchListener(mySurface);
然而,由于 SurfaceView 已经有一个 OnTouchEvent 函数,直接使用它更简单。
另外,不要将 SurfaceView 声明为静态的。