CustomView的手势缩放总结

两种方法:
一,利用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. } );






转载于:https://www.cnblogs.com/chenchengzhi/p/4915227.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值