博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CustomView的手势缩放总结
阅读量:6331 次
发布时间:2019-06-22

本文共 3406 字,大约阅读时间需要 11 分钟。

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

你可能感兴趣的文章
iOS 图文混排
查看>>
64. Minimum Path Sum
查看>>
Windows Live Writer 使用指南
查看>>
分析iOS Crash文件,使用命令符号化iOS Crash文件
查看>>
R学习笔记 第五篇:字符串操作
查看>>
在Mac OS下配置PHP开发环境
查看>>
(转)介绍下Nuget在传统Asp.net项目中的使用
查看>>
C# ArcEngine 实现点击要素高亮并弹出其属性
查看>>
初识GO语言——安装Go语言
查看>>
SDK命令行操作
查看>>
基于Bootstrap的DropDownList的JQuery组件的完善版
查看>>
EXTJS学习系列提高篇:第二十四篇(转载)作者殷良胜,ext2.2打造全新功能grid系列--阅增删改篇...
查看>>
Hadoop MapReduce编程 API入门系列之分区和合并(十四)
查看>>
判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
查看>>
并查集的应用之求解无向图中的连接分量个数
查看>>
7个神奇的jQuery 3D插件
查看>>
在线浏览PDF之PDF.JS (附demo)
查看>>
波形捕捉:(3)"捕捉设备"性能
查看>>
AliOS Things lorawanapp应用介绍
查看>>
美国人的网站推广方式千奇百怪
查看>>