源码分享:https://github.com/heinika/GestureListener
主要使用到
GestureDetector 这个类:在实际使用中一般使用他们的子类GestureDetector.SimpleOnGestureListener()

下面自定义一个View实现手势操作:

public class MyButton extends Button {
private GestureDetector mGesture;

在构造器中初始化手势

   
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
/**
*GestureDetector新建一个手势识别类,复写手势监听器里的方法
*/
mGesture =new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
/**
* 双击操作
* @param e 双击的事件
* @return
*/
@Override
public boolean onDoubleTap(MotionEvent e) {
if(onDoubleTapListener!=null){
onDoubleTapListener.onDoubleTap(MyButton.this);
}
Log.d("heinikamGesture", "连续点击了两次");
return super.onDoubleTap(e);
}
/**
* 长按的操作
* @param e
*/
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
}
/**
* 滑动操作,滑动完之后才处理
* @param e1 down事件
* @param e2 up事件
* @param velocityX X轴的速度
* @param velocityY Y轴的速度
* @return
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
ObjectAnimator.ofFloat(MyButton.this,"translationX",getTranslationX(),getTranslationX()+e2.getX()-e1.getX()).setDuration(300).start();
ObjectAnimator.ofFloat(MyButton.this,"translationY",getTranslationY(),getTranslationY()+e2.getY()-e1.getY()).setDuration(300).start();
return true;
}
/**
* 滚动的操作 实现按键随按下的位置移动
* @param e1 down事件
* @param e2 up事件
* @param distanceX x轴位移的总距离
* @param distanceY y轴位移的总距离
* @return
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.d("heinikamGesture","X:"+distanceX+" Y:"+distanceY);
if(onScrollListener!=null){
onScrollListener.OnScroll(MyButton.this,distanceX,distanceY);
}
/**
* distanceX,distanceY为总共移动的距离
*/
setTranslationX(getTranslationX()+e2.getX()-e1.getX());
setTranslationY(getTranslationY()+e2.getY()-e1.getY());
return true;
}
});
}
   

将手势传递给onTouchEvent

/**
* 将事件传递到onTouchEvent,从而进行处理
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
mGesture.onTouchEvent(event);
return super.onTouchEvent(event);
}
   

多点触控的实现

实际上多点触控也是基于onTouchEvent(MotionEvent event)
使用onTouchEvent中的event.getPointerCount()方法可以获取触控点的个数,使用循环并在getXXX()中传入i,即可获得对应的信息。
/**
* 处理触屏事件
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// 获得屏幕触点数量
int pointerCount = event.getPointerCount();
if (pointerCount > MAX_TOUCHPOINTS) {
pointerCount = MAX_TOUCHPOINTS;
}

// 锁定Canvas,开始进行相应的界面处理
Canvas c = getHolder().lockCanvas();
if (c != null) {
c.drawColor(Color.BLACK);
if (event.getAction() == MotionEvent.ACTION_UP) {
// 当手离开屏幕时,清屏
} else {
// 在每一个触点上绘制一个十字和坐标信息
for (int i = 0; i < pointerCount; i++) {
int id = event.getPointerId(i);
int x = (int) event.getX(i);
int y = (int) event.getY(i);
drawCrosshairsAndText(x, y, touchPaints[id], i, id, c);
}

// 在每一个触点上绘制一个圆
for (int i = 0; i < pointerCount; i++) {
int id = event.getPointerId(i);
int x = (int) event.getX(i);
int y = (int) event.getY(i);
drawCircle(x, y, touchPaints[id], c);
}
}

// 画完后,unlock
getHolder().unlockCanvasAndPost(c);
}
return true;
}






更多相关文章

  1. android 监听解锁事件
  2. android之点击事件ImageView切换
  3. android的四种点击事件的设置
  4. android识别 单击和双击事件
  5. Android 监听Fragment界面的点击事件
  6. Android 下listview不能相应onItemClick事件
  7. Android 扫描SDCard上的音乐文件以及监听扫描事件

随机推荐

  1. android assets 读图片
  2. Android(安卓)7.0 以上 安装 apk 的方法
  3. 有关Android发送E-mail
  4. Android(安卓)NDK 开发问题及解决方法
  5. android 杂记2:单位 屏幕适配
  6. Android(安卓)Keymaster/keystore的代码
  7. Android(安卓)动态改变TextView字体大小
  8. Android之TabHost的几种使用方法
  9. Android(安卓)控件的显示隐藏上下左右移
  10. Android(安卓)6.0运行时权限小结