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

简介: Android SubsamplingScaleImageView(subsampling-scale-image-view)单双击长按事件【系列2】附录参考文章1介绍了Android SubsamplingScaleImageView(subsampling-scale-image-view)的简单使用方法。

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 !!!";

	@Override
	public 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() {
			@Override
			public 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;
			}

			@Override
			public 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();
				}
			}

			@Override
			public 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() {
			@Override
			public 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


相关文章
|
24天前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
27天前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
38 1
|
1月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
1月前
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
39 4
|
6月前
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
189 0
|
3月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
3月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android面试必问考点之一,如果你能把下面的一些事件分发图当场画出来肯定加分不少。废话不多说,总结一句:事件分发机制很重要。
196 9
|
3月前
|
开发工具 Android开发
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
39 0
|
5月前
|
XML Android开发 数据格式
37. 【Android教程】基于监听的事件处理机制
37. 【Android教程】基于监听的事件处理机制
81 2
|
6月前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
347 0