今天做的项目中,需要使用滑屏来调出一个界面,经过自己的尝试,结合网上的方法,成功实现了。
代码如下
package com.example.text; import android.app.Activity; import android.os.Bundle; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.widget.TextView; public class MainActivity extends Activity implements OnGestureListener { private GestureDetector mGestureDetector; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv=(TextView) findViewById(R.id.tv); //这个如果直接写一个this,会提示过时。另外,如果两个参数都写成this,会报错。原因不知
mGestureDetector = new GestureDetector(MainActivity.this, this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub //通过event自动判断手势,回调相应的方法 return mGestureDetector.onTouchEvent(event); }
//按下屏幕触发,打印的是坐标
@Override public boolean onDown(MotionEvent arg0) { // TODO Auto-generated method stub tv.setText(arg0.getX()+" "+arg0.getY()); return false; }
//滑动屏幕的时候触发,打印的分别是起点跟终点的坐标
@Override public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { // TODO Auto-generated method stub tv.setText("arg1.getX()="+arg1.getX()+" arg0.getX()="+arg1.getY()+" arg2="+arg2+" arg3="+arg3); return true; } @Override public void onLongPress(MotionEvent arg0) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent arg0) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent arg0) { // TODO Auto-generated method stub return false; } }
这个类的使用步骤如下
1.定义手势类:private GestureDetector mGestureDetector;
2.初始化类:这个是跟其他控件设置监听一样的,有多种方法
1)匿名内部类:
mGestureDetector = new GestureDetector(MainActivity.this, new OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent arg0) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent arg0) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { // TODO Auto-generated method stub return false; } @Override public void onLongPress(MotionEvent arg0) { // TODO Auto-generated method stub } @Override public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { // TODO Auto-generated method stub return false; } @Override public boolean onDown(MotionEvent arg0) { // TODO Auto-generated method stub return false; } });
2).直接让主类继承:
public class MainActivity extends Activity implements OnGestureListener{ }
3).内部类
class MyOnGestureListener implements OnGestureListener{ }
3.在onTouchEvent()事件中使用这个类
@Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub //通过event自动判断手势,回调相应的方法 return mGestureDetector.onTouchEvent(event); }
不过,现在还有一点不是很明白,就是方法中的return false跟return true有什么区别