Android手势操作(双击,长按,滑动,滚动,多点触控)

源码分享: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;
}






你可能感兴趣的:(android,Android)