package wk.demo.widget;import android.content.Context;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.ScaleGestureDetector;import android.view.View;/** * 功能描述:自定义屏幕上下左右手势滑动 。  
* 所有的手势 都用view 转交给 探测器 GestureDetector ,ScaleGestureDetector
* 它们都有完整的回调,不要自己去通过计算。
void scrollToLeft( );//向左
void scrollToRight( );//向右
void scrollToTop( );//向上
void scrollToBottom( );//向下
void zoomToMax( float scale);//手势放大
void zoomToMin( float scale);//手势缩小
void zoomStop( ); //停止缩小
void doubleClick( ); 双击
void onClick(); 单击
void onLongPress(); //长按 */public class GestureView extends View { /**最小滑动距离*/ private final int minVelocity = 5; /** * 对外的接口 */ public MyGestureCallBack myGestureCallBack; /** * 手势监听 */ private GestureDetector gestureDetector; /** * 缩放监听 */ private ScaleGestureDetector scaleGestureDetector = null; public GestureView(Context context) { super(context); initView(context); } public GestureView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } private void initView(Context context){ gestureDetector = new GestureDetector(context, onGestureListener); gestureDetector.setOnDoubleTapListener(onDoubleTapListener); scaleGestureDetector = new ScaleGestureDetector(context, onScaleGestureListener); } public void setCallBack(MyGestureCallBack myGestureCallBack) { this.myGestureCallBack = myGestureCallBack; } private ScaleGestureDetector.OnScaleGestureListener onScaleGestureListener = new ScaleGestureDetector.OnScaleGestureListener() { @Override public boolean onScale(ScaleGestureDetector detector) { float scale=detector.getScaleFactor() ; if(scale>1){ myGestureCallBack.zoomToMax(scale); }else{ myGestureCallBack.zoomToMin(scale); } return false; } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { // 一定要返回true才会进入onScale()这个函数 return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { myGestureCallBack.zoomStop(); } }; @Override public boolean performClick() { return super.performClick(); } @Override public boolean onTouchEvent(MotionEvent event) { // 手势事件交给 Detector接管 gestureDetector.onTouchEvent(event); scaleGestureDetector.onTouchEvent(event); performClick(); return true; } private GestureDetector.OnDoubleTapListener onDoubleTapListener = new GestureDetector.OnDoubleTapListener() { @Override public boolean onSingleTapConfirmed(MotionEvent e) { myGestureCallBack.onClick(); return false; } @Override public boolean onDoubleTap(MotionEvent e) { myGestureCallBack.doubleClick(); return false; } @Override public boolean onDoubleTapEvent(MotionEvent e) { // 一般可不用 return false; } }; private GestureDetector.OnGestureListener onGestureListener = new GestureDetector.OnGestureListener(){ @Override public boolean onDown(MotionEvent e) { // 一般可不用 return true; } @Override public void onShowPress(MotionEvent e) { // 一般可不用 } @Override public boolean onSingleTapUp(MotionEvent e) { // 一般不用 return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (distanceX < -minVelocity) { myGestureCallBack.scrollToRight( ); } else if (distanceX > minVelocity) { myGestureCallBack.scrollToLeft( ); } else if (distanceY < -minVelocity) { myGestureCallBack.scrollToBottom( ); } else if (distanceY > minVelocity) { myGestureCallBack.scrollToTop( ); } return true; } @Override public void onLongPress(MotionEvent e) { myGestureCallBack.onLongPress(); } public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e1.getX() - e2.getX() > minVelocity && Math.abs(velocityX) > minVelocity) { myGestureCallBack.scrollToLeft(); } else if ((e2.getX() - e1.getX() > minVelocity && Math.abs(velocityX) > minVelocity)) { myGestureCallBack.scrollToRight(); } else if (e1.getY() - e2.getY() > minVelocity && Math.abs(velocityY) > minVelocity) { myGestureCallBack.scrollToTop(); } else if ((e2.getY() - e1.getY() > minVelocity && Math.abs(velocityY) > minVelocity)) { myGestureCallBack.scrollToBottom( ); } return true; } }; public interface MyGestureCallBack { /** * 向左 */ void scrollToLeft( ); /** * 向右 */ void scrollToRight( ); /** * 向上 */ void scrollToTop( ); /** * 向下 */ void scrollToBottom( ); /** * 手势放大 */ void zoomToMax( float scale); /** * 手势缩小 */ void zoomToMin( float scale); /** * 停止缩小 */ void zoomStop( ); /** * 双击 */ void doubleClick( ); /** * 单击 */ void onClick(); /** * 长按 */ void onLongPress(); }}
使用:gestureView = findViewById(R.id.gestureView) ;gestureView.setCallBack(myGestureCallback);

更多相关文章

  1. android图片缩放平移
  2. Android可缩放矢量图形(SVG)
  3. android photoview 图片放大缩放功能 ImageView
  4. Android实现图片缩放与旋转
  5. 【Android每周专题】触摸屏手势
  6. Android imageView图片按比例缩放
  7. Android控制水平方向字体缩放android:textScaleX
  8. Android Gesture 手势识别使用实例 - Android - mobile - ITeye
  9. 使用sklearn轻松实现数据缩放

随机推荐

  1. Android(安卓)MediaScanner
  2. [图文并茂] 在 MyEclipse 上 搭建 安装 A
  3. android adb通过wifi查看日志
  4. Android(安卓)Studio Error:Failed to re
  5. Android(安卓)使用USB进行数据传输
  6. Android(安卓)Rect类的构造函数参数说明
  7. Android(安卓)Fragment实践(二)
  8. Ubuntu 下用 Eclipse 编译调试 Android(
  9. Android原生GPS和网络定位工具类
  10. Android下 SQLite的使用