Android 手勢監聽demo
阿新 • • 發佈:2018-11-12
package com.shengfang.demo.testdemo; import android.content.Context; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; /** * 實現監聽上下左右滑動的事件,哪個view需要的時候直接setOnTouchListener就可以用了 * */ public class GestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener { /** 左右滑動的最短距離 */ private int distance = 100; /** 左右滑動的最大速度 */ private int velocity = 200; private GestureDetector gestureDetector; public GestureListener(Context context) { super(); gestureDetector = new GestureDetector(context, this); } /** * 向左滑的時候呼叫的方法,子類應該重寫 * @return */ public boolean left(float distance) { return false; } /** * 向右滑的時候呼叫的方法,子類應該重寫 * @return */ public boolean right(float distance) { return false; } /** * 向上滑的時候呼叫的方法,子類應該重寫 * @return */ public boolean up(float distance) { return false; } /** * 向下滑的時候呼叫的方法,子類應該重寫 * @return */ public boolean down(float distance) { return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub // e1:第1個ACTION_DOWN MotionEvent // e2:最後一個ACTION_MOVE MotionEvent // velocityX:X軸上的移動速度(畫素/秒) // velocityY:Y軸上的移動速度(畫素/秒) // 向左滑 if (e1.getX() - e2.getX() > distance && Math.abs(velocityX) > velocity) { left(e1.getX() - e2.getX()); } if (e1.getY() - e2.getY() > distance && Math.abs(velocityX) > velocity) { up(e1.getY() - e2.getY()); } // 向右滑 if (e2.getX() - e1.getX() > distance && Math.abs(velocityX) > velocity) { right(e2.getX() - e1.getX() ); } if (e2.getY() - e1.getY() > distance && Math.abs(velocityX) > velocity) { down(e2.getY() - e1.getY()); } return false; } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub gestureDetector.onTouchEvent(event); return false; } public int getDistance() { return distance; } public void setDistance(int distance) { this.distance = distance; } public int getVelocity() { return velocity; } public void setVelocity(int velocity) { this.velocity = velocity; } public GestureDetector getGestureDetector() { return gestureDetector; } public void setGestureDetector(GestureDetector gestureDetector) { this.gestureDetector = gestureDetector; } }
package com.shengfang.demo.testdemo; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView hh; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //需要監聽左右滑動事件的view RelativeLayout view = (RelativeLayout) this.findViewById(R.id.layout); hh=(TextView)findViewById(R.id.hh); //setLongClickable是必須的 view.setLongClickable(true); view.setOnTouchListener(new MyGestureListener(this)); } /** * 繼承GestureListener,重寫left和right方法 */ private class MyGestureListener extends GestureListener { public MyGestureListener(Context context) { super(context); } @Override public boolean left(float distance) { Log.e("test", "向左滑"); hh.setText("向左滑"+distance); return super.left(distance); } @Override public boolean up(float distance) { hh.setText("向上滑"+distance); return super.up(distance); } @Override public boolean down(float distance) { hh.setText("向下滑"+distance); return super.down(distance); } @Override public boolean right(float distance) { Log.e("test", "向右滑"); hh.setText("向右滑"+distance); return super.right(distance); } } }