Android SubsamplingScaleImageView(subsampling-scale-image-view)单双击长按事件【系列2】

附录参考文章1介绍了Android SubsamplingScaleImageView(subsampling-scale-image-view)的简单使用方法。
在处理大图的浏览查看动作过程中,往往还有其他额外的事情需要处理,典型的以微信为例,在微信中,用户可以在消息列表中查看单击/双击放大/缩小消息列表中的图片,但还有一个事件:用户长按图片,弹出对话框,提示用户针对此图片的其他动作如转发。这项功能需要在SubsamplingScaleImageView(subsampling-scale-image-view)给当前的SubsamplingScaleImageView注册一个OnTouchListener事件侦听类,进而用Android的GestureDetector侦听处理有关SubsamplingScaleImageView的单击、双击、长按事件。
在附录文章1的基础上,增加上述‘功能,给出一个小demo。
测试的主Activity MainActivity.java:

package zhangphil.demo;import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Toast;public class MainActivity extends Activity {private SubsamplingScaleImageView mSubsamplingScaleImageView;private GestureDetector gestureDetector;private final String fail_tips = "SubsamplingScaleImageView not ready !!!";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mSubsamplingScaleImageView = (SubsamplingScaleImageView) findViewById(R.id.subsamplingScaleImageView);mSubsamplingScaleImageView.setImage(ImageSource.asset("china.jpg"));gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {if (mSubsamplingScaleImageView.isReady()) {PointF sCoord = mSubsamplingScaleImageView.viewToSourceCoord(e.getX(), e.getY());Toast.makeText(getApplicationContext(), "单击: " + ((int) sCoord.x) + ", " + ((int) sCoord.y),Toast.LENGTH_SHORT).show();} else {Toast.makeText(getApplicationContext(), fail_tips, Toast.LENGTH_SHORT).show();}return false;}@Overridepublic void onLongPress(MotionEvent e) {if (mSubsamplingScaleImageView.isReady()) {PointF sCoord = mSubsamplingScaleImageView.viewToSourceCoord(e.getX(), e.getY());Toast.makeText(getApplicationContext(), "长按: " + ((int) sCoord.x) + ", " + ((int) sCoord.y),Toast.LENGTH_SHORT).show();} else {Toast.makeText(getApplicationContext(), fail_tips, Toast.LENGTH_SHORT).show();}}@Overridepublic boolean onDoubleTap(MotionEvent e) {if (mSubsamplingScaleImageView.isReady()) {PointF sCoord = mSubsamplingScaleImageView.viewToSourceCoord(e.getX(), e.getY());Toast.makeText(getApplicationContext(), "双击: " + ((int) sCoord.x) + ", " + ((int) sCoord.y),Toast.LENGTH_SHORT).show();} else {Toast.makeText(getApplicationContext(), fail_tips, Toast.LENGTH_SHORT).show();}return false;}});mSubsamplingScaleImageView.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {return gestureDetector.onTouchEvent(motionEvent);}});}
}

在此简单的说一下Android的事件传导派发流程。在Android的OnTouchListener中,用GestureDetector屏幕事件时候,在个别系统回调函数中的返回值:true,false。通常,
(1)如果返回true,是告知Android事件系统当前事件已经被消费(事件被拦截了),不要再继续传导派发此事件了。
(2)如果返回false,是告知Android事件系统,当前此事件没有被消费(事件没有被拦截,只是监听而已),要求Android系统继续传导派发此事件。
简言之,如果是拦截事件,就返回true;如果只是监听事件,则返回false。
在本例中,虽然我拦截了GestureDetector的onSingleTapConfirmed,onDoubleTap,但返回了false,返回false,是为了继续支持SubsamplingScaleImageView的单击、双击、长按事件。
运行结果如图所示:

附录参考文章:
【文章1】《Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】》链接地址:http://blog.csdn.net/zhangphil/article/details/49557549

Android SubsamplingScaleImageView(subsampling-scale-image-view)单双击长按事件【系列2】相关推荐

  1. Android 让View 和 ViewGroup 同时响应点击或者长按事件

    面试的时候,被问到如何让View 和 其 父View 同时响应长按事件. 我还记得当时自己的回答,子View 里面 处理了长按事件,但是返回了false, 没有处理,然后会继续调用到父View 的长按 ...

  2. android应用的界面编程----View与ViewGroup的概念

    1 UI OverView Android中所有的UI元素都是通过View与ViewGroup来构建的,View是指屏幕中一块可与用户进行交互的空白,类似于java界面编程中的JPanel.为了界面布 ...

  3. android触摸事件透传,Android中父View穿透子View响应长按事件

    释放双眼,带上耳机,听听看~! 需求 在实际项目开发中,有这样的需求,长按整个ViewGroup响应长按事件,例如长按弹出对话框或者popwindow等等 问题 针对这个需求出现两种情况: 1,当Vi ...

  4. Android 让你的SeekBar 也支持长按事件

    SeekBar 本身有就是一个View 对象,既然是View 对象那也证明它有setOnLongClickListener 事件,众所周知,这个事件是让一个View 对象拥有长按功能,进而达到我们想要 ...

  5. webview 模拟点击_Android如何基于坐标对View进行模拟点击事件详解

    前言 大家应该都知道,在Android中,我们对于View进行模拟点击事件,很容易,比如调用View.performClick即可. 但是有些时候,我们想要更加精细的点击,比如View的某一区域或者某 ...

  6. [Android]ButterKnife-无尽之刃-绑定视图控件和事件的快速开发工具

    本文链接http://blog.csdn.net/jan_s/article/details/50772360,转载请留言 简单介绍 Butter knife是大神JakeWharton的一款Andr ...

  7. 【Flutter】Flutter 手势交互 ( 点击事件处理 | 点击 onTap | 双击 | 长按 onLongPress | 点击取消 | 按下 onTapDown | 抬起 onTapUp )

    文章目录 一.Flutter 点击事件处理 二.GestureDetector 常用事件说明 三.完整代码示例 四.相关资源 一.Flutter 点击事件处理 Flutter 点击事件处理的组件是 G ...

  8. Android系统中自定义按键的短按、双击、长按事件

    在项目中碰到这样的问题: 由于系统中的按键在底层做了重新定义或者新增了按键,此时需要在APP层对按键事件(keyevent)做分解处理,模拟Android系统做法,把keyevent分解成: 1.单击 ...

  9. Android 应用的动画实践--View Animation篇

    2019独角兽企业重金招聘Python工程师标准>>> <h2 id="menuIndex0">前言</h2> <p>尝试搜索 ...

最新文章

  1. netcore读取json文件_.net core读取json格式的配置文件
  2. 用Javascript为DropDownList添加一个Item至定义索引位置
  3. python 发送邮件解决所有乱码问题
  4. 怎么读取mysql库绘制柱状图_从数据库中取出最近三十天的数据并生成柱状图
  5. 浏览器登录_经常用浏览器自动登录忘记了密码?教你一键查看网页星号密码
  6. amd cpu 安卓模拟器_夜神模拟器常见问题解答_v20201025
  7. Pentium Pro架构/流水线及其优化 (1) - 架构概述
  8. 银联的bankall_阿尔法银行罗马尼亚分行开始受理银联卡
  9. hbase major_compact 文件会变小吗_图解式学习:可能是最易懂的Hbase架构原理解析(二)...
  10. Linux视频教程—笔记(全)
  11. 计算机考研压分的学校,考研压分院校盘点 | 都说这些学校今年压分严重?!
  12. 磅、号、ppi、dpi、字号和分辨率关系
  13. 1.3中国计算机网络发展情况
  14. 计算机教师的幸福,有关信息技术教师教育感言
  15. convexHull实现
  16. [ICCV2021] TransReID: Transformer-based Object Re-Identification 行人重识别
  17. PHP与ECMP,2019 NECMP东北音乐产业发展论坛在沈举行
  18. 「机械工程」力矩,转矩,扭矩的理解
  19. 椭圆曲线数字签名算法(ECDSA)
  20. 谷歌浏览器模拟微信/QQ内置浏览器调试及js判断方法

热门文章

  1. android用kotlin制作计算器,使用Kotlin做一个简单计算器
  2. 30万条数据,搜索文本字段的各种方式对比
  3. js页面文字选中后分享到新浪微博实现
  4. DataList:HTML5中的input输入框自动提示宝器
  5. jquery user interface
  6. 机器学习降维算法三:LLE (Locally Linear Embedding) 局部线性嵌入
  7. android 安装内核module,提示Required key not available
  8. 【转载】计算机网络基础知识总结
  9. 华为机试——数字颠倒
  10. Linux——Linux下安装tree