d290a475ecf21537dc446c7a9f9a7656d992467a.svn-base 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package eVVM.apk.helper;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Matrix;
  5. import android.support.annotation.NonNull;
  6. import android.support.annotation.Nullable;
  7. import android.support.v4.widget.ViewDragHelper;
  8. import android.util.AttributeSet;
  9. import android.view.GestureDetector;
  10. import android.view.MotionEvent;
  11. import android.view.ScaleGestureDetector;
  12. import android.view.View;
  13. import android.widget.FrameLayout;
  14. import com.nineoldandroids.view.ViewHelper;
  15. public class CommunityView extends FrameLayout {
  16. // 屏幕宽高
  17. private int screenHeight;
  18. private int screenWidth;
  19. private ViewDragHelper mDragHelper;
  20. private long lastMultiTouchTime;// 记录多点触控缩放后的时间
  21. private int originalWidth;// view宽度
  22. private int originalHeight;// view高度
  23. private ScaleGestureDetector mScaleGestureDetector = null;
  24. // private View view;
  25. private int downX;// 手指按下的x坐标值
  26. private int downY;// 手指按下的y坐标值
  27. private int left;// view的左坐标值
  28. private int top;// view的上坐标值
  29. private int right;// view的右坐标值
  30. private int bottom;// view的下坐标值
  31. private int newHeight;
  32. private int newWidth;
  33. private float scale;
  34. private float preScale = 1;// 默认前一次缩放比例为1
  35. public CommunityView(Context context, AttributeSet attrs, int defStyleAttr) {
  36. super(context, attrs, defStyleAttr);
  37. init(context);
  38. }
  39. public CommunityView(Context context, AttributeSet attrs) {
  40. super(context, attrs);
  41. init(context);
  42. }
  43. public CommunityView(Context context) {
  44. super(context);
  45. init(context);
  46. }
  47. private void init(Context context) {
  48. mDragHelper = ViewDragHelper.create(this, callback);
  49. mScaleGestureDetector = new ScaleGestureDetector(context,
  50. new ScaleGestureListener());
  51. // view.post(new Runnable() {
  52. //
  53. // @Override
  54. // public void run() {
  55. // left = view.getLeft();
  56. // top = view.getTop();
  57. // right = view.getRight();
  58. // bottom = view.getBottom();
  59. // originalWidth = view.getWidth();
  60. // originalHeight = view.getHeight();
  61. // }
  62. // });
  63. }
  64. @Override
  65. protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  66. super.onSizeChanged(w, h, oldw, oldh);
  67. screenWidth = getMeasuredWidth();
  68. screenHeight = getMeasuredHeight();
  69. }
  70. @Override
  71. public boolean onInterceptTouchEvent(MotionEvent ev) {
  72. super.onInterceptTouchEvent(ev);
  73. boolean b = mDragHelper.shouldInterceptTouchEvent(ev);// 由mDragHelper决定是否拦截事件,并传递给onTouchEvent
  74. return b;
  75. }
  76. private boolean needToHandle=true;
  77. @Override
  78. public boolean onTouchEvent(MotionEvent event) {
  79. int pointerCount = event.getPointerCount(); // 获得多少点
  80. if (pointerCount > 1) {// 多点触控,
  81. switch (event.getAction()) {
  82. case MotionEvent.ACTION_DOWN:
  83. needToHandle=false;
  84. break;
  85. case MotionEvent.ACTION_MOVE:
  86. break;
  87. case MotionEvent.ACTION_POINTER_2_UP://第二个手指抬起的时候
  88. needToHandle=true;
  89. break;
  90. default:
  91. break;
  92. }
  93. return mScaleGestureDetector.onTouchEvent(event);//让mScaleGestureDetector处理触摸事件
  94. } else {
  95. long currentTimeMillis = System.currentTimeMillis();
  96. if (currentTimeMillis - lastMultiTouchTime > 200&&needToHandle) {
  97. // 多点触控全部手指抬起后要等待200毫秒才能执行单指触控的操作,避免多点触控后出现颤抖的情况
  98. try {
  99. mDragHelper.processTouchEvent(event);
  100. } catch (Exception e) {
  101. e.printStackTrace();
  102. }
  103. return true;
  104. }
  105. // }
  106. }
  107. return false;
  108. }
  109. private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {
  110. /**
  111. * 用于判断是否捕获当前child的触摸事件
  112. *
  113. * @param child
  114. * 当前触摸的子view
  115. * @param pointerId
  116. * @return true就捕获并解析;false不捕获
  117. */
  118. @Override
  119. public boolean tryCaptureView(View child, int pointerId) {
  120. if (preScale > 1)
  121. return true;
  122. return false;
  123. }
  124. /**
  125. * 控制水平方向上的位置
  126. */
  127. @Override
  128. public int clampViewPositionHorizontal(View child, int left, int dx) {
  129. if (left < (screenWidth - screenWidth * preScale) / 2)
  130. left = (int) (screenWidth - screenWidth * preScale) / 2;// 限制mainView可向左移动到的位置
  131. if (left > (screenWidth * preScale - screenWidth) / 2)
  132. left = (int) (screenWidth * preScale - screenWidth) / 2;// 限制mainView可向右移动到的位置
  133. return left;
  134. }
  135. public int clampViewPositionVertical(View child, int top, int dy) {
  136. if (top < (screenHeight - screenHeight * preScale) / 2) {
  137. top = (int) (screenHeight - screenHeight * preScale) / 2;// 限制mainView可向上移动到的位置
  138. }
  139. if (top > (screenHeight * preScale - screenHeight) / 2) {
  140. top = (int) (screenHeight * preScale - screenHeight) / 2;// 限制mainView可向上移动到的位置
  141. }
  142. return top;
  143. }
  144. };
  145. public class ScaleGestureListener implements
  146. ScaleGestureDetector.OnScaleGestureListener {
  147. @Override
  148. public boolean onScale(ScaleGestureDetector detector) {
  149. float previousSpan = detector.getPreviousSpan();// 前一次双指间距
  150. float currentSpan = detector.getCurrentSpan();// 本次双指间距
  151. if (currentSpan < previousSpan) {
  152. // 缩小
  153. // scale = preScale-detector.getScaleFactor()/3;
  154. scale = preScale - (previousSpan - currentSpan) / 1000;
  155. } else {
  156. // 放大
  157. // scale = preScale+detector.getScaleFactor()/3;
  158. scale = preScale + (currentSpan - previousSpan) / 1000;
  159. }
  160. // 缩放view
  161. if (scale > 0.5) {
  162. ViewHelper.setScaleX(CommunityView.this, scale);// x方向上缩放
  163. ViewHelper.setScaleY(CommunityView.this, scale);// y方向上缩放
  164. }
  165. return false;
  166. }
  167. @Override
  168. public boolean onScaleBegin(ScaleGestureDetector detector) {
  169. // 一定要返回true才会进入onScale()这个函数
  170. return true;
  171. }
  172. @Override
  173. public void onScaleEnd(ScaleGestureDetector detector) {
  174. preScale = scale;// 记录本次缩放比例
  175. lastMultiTouchTime = System.currentTimeMillis();// 记录双指缩放后的时间
  176. }
  177. }
  178. }