Android SurfaceView无法响应触摸事件

时间:2015-03-11 06:04:38

标签: android surfaceview

我正在尝试使用简单的表面视图来响应触摸事件。下面的应用程序启动但不响应触摸事件。我有一个Log.i语句来确认(通过打印到控制台)触摸事件是否正常工作。谁能告诉我我做错了什么?

这是我的主要活动

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);
    }

}

这是表面视图类

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;
    }

}

2 个答案:

答案 0 :(得分:5)

  1. 删除implements OnTouchListener
  2. onTouch(View v, MotionEvent event)更改为onTouchEvent(MotionEvent event)
  3. 它不起作用的原因是SurfaceView不知道它应该是它自己的OnTouchListener而不告诉它。或者,您可以通过将此代码添加到onCreate():

    来使其工作
    mySurface = new MainSurface(this);
    mySurface.setOnTouchListener(mySurface);
    

    然而,由于SurfaceView已经具有OnTouchEvent函数,因此使用它更简单。

    另外,不要将SurfaceView声明为静态。

答案 1 :(得分:2)

您应该在触摸事件中识别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;
}