Android手势:单指拖动、双指缩放图片

举报
ShaderJoy 发表于 2021/12/30 00:59:52 2021/12/30
【摘要】 原创文章,转载请注明: 转载自ian的个人博客 [ http://www.icodelogic.com ] 本文链接地址: http://www.icodelogic.com/?p=601 手势其实是一个比较复杂的东西,首先是因为处理的时机。Android中触摸屏的事件其实只有ACTION_DOWN、ACTION_...
原创文章,转载请注明: 转载自ian的个人博客 [ http://www.icodelogic.com ]

本文链接地址: http://www.icodelogic.com/?p=601

手势其实是一个比较复杂的东西,首先是因为处理的时机。Android中触摸屏的事件其实只有ACTION_DOWN、ACTION_MOVE和ACTION_UP这三种,当然我们实现手势的逻辑时,一般会用到GestureDetector,它有许多封装好的事件回调接口,比如onFling、onLongPress、onScroll等,其实这些事件只是对上面那三个基本时间的包装而已:即三个基本事件按一定的序列出现,则会触发响应的GestureDetector中的事件,比如ACTION_DOWN 加上三个ACTION_MOVE再加上ACTION_UP就是一次Fling事件等等。

虽然手势能给用户带来比较新奇好玩的体验,GestureDetector这样的接口很容易理解,但是却也有很多问题,主要是自定义手势时。假如我们要实现一个自定义的手势,即当用户在触摸屏上画圆时响应我们的事件处理逻辑,那么当用户画圆时,其实也是一个Scroll事件,这时候就不太好确定到底响应画圆事件还是Scroll事件了。

手势带来的另一个问题是UI的体验,大多数情况下我们需要考虑到用户手指移动的加速度、反馈、期望等,比如快速的滑动和低速的滑动给用户的心理预期是完全不同的,这方面做得比较完美的要数MacBook上的TouchPad了,从单指移动鼠标、双指窗口内移动,到三指窗口间切换、四指返回Home,给用户的体验算是十分优秀的了。当然这都是交互的内容了,不再过多讨论,一般产品中也不建议做太复杂的手势。

一般情况下我们用的比较多的手势就是单指拖拽、双指缩放图片这样的简单手势,下面的代码是ImageView实现单指和双指这两种手势的代码,没有用到GestureDetector,而是仅仅对onTouch事件进行处理:


  
  1. float mCurrentScale = 1;
  2. float last_x = -1;
  3. float last_y = -1;
  4. mImage.setOnTouchListener(new OnTouchListener() {
  5. float baseValue;
  6. @Override
  7. public boolean onTouch(View v, MotionEvent event) {
  8. // TODO Auto-generated method stub
  9. // return ArtFilterActivity.this.mGestureDetector.onTouchEvent(event);
  10. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  11. baseValue = 0;
  12. float x = last_x = event.getRawX();
  13. float y = last_y = event.getRawY();
  14. }
  15. else if (event.getAction() == MotionEvent.ACTION_MOVE) {
  16. if (event.getPointerCount() == 2) {
  17. float x = event.getX(0) - event.getX(1);
  18. float y = event.getY(0) - event.getY(1);
  19. float value = (float) Math.sqrt(x * x + y * y);// 计算两点的距离
  20. if (baseValue == 0) {
  21. baseValue = value;
  22. }
  23. else {
  24. if (value - baseValue >= 10 || value - baseValue <= -10) {
  25. float scale = value / baseValue;// 当前两点间的距离除以手指落下时两点间的距离就是需要缩放的比例。
  26. img_scale(scale); //缩放图片
  27. }
  28. }
  29. }
  30. else if (event.getPointerCount() == 1) {
  31. float x = event.getRawX();
  32. float y = event.getRawY();
  33. x -= last_x;
  34. y -= last_y;
  35. if (x >= 10 || y >= 10 || x <= -10 || y <= -10)
  36. img_transport(x, y); //移动图片位置
  37. last_x = event.getRawX();
  38. last_y = event.getRawY();
  39. }
  40. }
  41. else if (event.getAction() == MotionEvent.ACTION_UP) {
  42. }
  43. return true;
  44. }
  45. });

关于完整的代码,其实在之前关于图像处理的文章中提供下载的代码中就已经实现了,或者直接点击这里下载: 代码

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8539239

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200