码迷,mamicode.com
首页 > 其他好文 > 详细

CustomView的手势缩放总结

时间:2015-10-27 20:20:05      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

两种方法:
一,利用ScaleGestureDetector。代码在customview中。
        设为View的成员变量;
        构造方法中传入OnScaleGestureListener,覆写缩放的三个方法;
        覆写customView的onTouchEven(MotionEvent event)方法,将event传给ScaleGestureDetector. onTouchEven(MotionEvent event)处理。

  1. OnScaleGestureListener listener = new OnScaleGestureListener() {
  2. @Override
  3. public void onScaleEnd(ScaleGestureDetector detector) {
  4. Log.i("OnScaleGestureListener", "onScaleEnd");
  5. }
  6. @Override
  7. public boolean onScaleBegin(ScaleGestureDetector detector) {
  8. Log.i("OnScaleGestureListener", "onScaleBegin");
  9. return true;
  10. }
  11. @Override
  12. public boolean onScale(ScaleGestureDetector detector) {
  13. Log.i("OnScaleGestureListener", "onScale");
  14. float dXStart = detector.getPreviousSpanX();
  15. float dXEnd = detector.getCurrentSpanX();
  16. float dScale = (dXEnd - dXStart) / getWidth();
  17. scale += dScale;
  18. if(scale > 3f) {
  19. scale = 3f;
  20. }
  21. if(scale < 1) {
  22. scale = 1f;
  23. }
  24. // Log.i("xFirstStart,xSecondStart,xFirstEnd", xFirstStart + "," + xSecondStart + "," + xFirstEnd + "," + xSecondEnd);
  25. // Log.i("dXStart,dXEnd,scale,kcvKchart.getWidth()", dXStart + "," + dXEnd + "," + scale + "," + kcvKchart.getWidth());
  26. setScaleX(scale);
  27. return false;
  28. }
  29. };


二,直接设置customView的onTouchEventListener,覆写onTouch()方法。代码在activity中。
        这里注意,可以使用MotionEvent.ACTION_POINTER_DOWN事件,比较方便;
        如果不使用pointerdown事件,则在down事件中不能获取第二个pointer信息,只能在move事件中获取,第一获取后不做处理,第二次获取后做缩放。
  1. // 没有使用MotionEvent.ACTION_POINTER_DOWN事件
  2. kcvKchart.setOnTouchListener(new OnTouchListener() {
  3. private float xFirstStart;
  4. private float xSecondStart;
  5. private float xFirstEnd;
  6. private float xSecondEnd;
  7. private int dXFirst;
  8. private int oldPointerCount;
  9. private int newPointerCount;
  10. private float scale = 1f;
  11. @Override
  12. public boolean onTouch(View v, MotionEvent event) {// can be written in KChartView‘s onTouchEven(--)
  13. switch (event.getAction()) {
  14. case MotionEvent.ACTION_DOWN:
  15. xFirstStart = event.getX();// to WindowScreen
  16. oldPointerCount = event.getPointerCount();
  17. break;
  18. case MotionEvent.ACTION_MOVE:
  19. newPointerCount = event.getPointerCount();
  20. if(newPointerCount == 1) {// one finger translate
  21. xFirstEnd = event.getX();
  22. dXFirst = Math.round(xFirstStart - xFirstEnd);// the closest integer to the argument,including positive & negative .
  23. // TODO condition:if left x axis < 0 || right x axis > view.getWidth, then left x=0 || right x=view.getWidth return
  24. kcvKchart.scrollBy(dXFirst, 0); // can called repeatedly
  25. // Log.i("startX - endX, distanceX", xFirstStart - xFirstEnd + "," + dXFirst);
  26. xFirstStart = xFirstEnd;
  27. } else {// two or more finger scale
  28. xFirstEnd = event.getX();
  29. xSecondEnd = event.getX(1);
  30. if(oldPointerCount == 1) {// initialize second pointer axis
  31. // 由于第二个pointer的初始坐标不能再down事件中获取,只能在第一次move时获取,故第一次move不能进行缩放,需要过滤
  32. oldPointerCount = newPointerCount;
  33. } else {
  34. float dXStart = Math.abs(xFirstStart - xSecondStart);
  35. float dXEnd = Math.abs(xFirstEnd - xSecondEnd);
  36. float dScale = (dXEnd - dXStart) / kcvKchart.getWidth();
  37. scale += dScale;
  38. if(scale > 3f) {
  39. scale = 3f;
  40. }
  41. if(scale < 1) {
  42. scale = 1f;
  43. }
  44. // Log.i("xFirstStart,xSecondStart,xFirstEnd", xFirstStart + "," + xSecondStart + "," + xFirstEnd + "," + xSecondEnd);
  45. // Log.i("dXStart,dXEnd,scale,kcvKchart.getWidth()", dXStart + "," + dXEnd + "," + scale + "," + kcvKchart.getWidth());
  46. kcvKchart.setScaleX(scale);
  47. }
  48. xFirstStart = xFirstEnd;
  49. xSecondStart = xSecondEnd;
  50. }
  51. break;
  52. case MotionEvent.ACTION_POINTER_DOWN:
  53. break;
  54. default:
  55. break;
  56. }
  57. return true;
  58. }
  59. } );






CustomView的手势缩放总结

标签:

原文地址:http://www.cnblogs.com/chenchengzhi/p/4915227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!