android 完全区分double-tap 与 singal-tap 的方法

需求:viewpager显示图片,需要在双击时对图片进行缩放,单击时在屏幕下方弹出popwindow,由于android的双击本质就是两次单击,但是又不想在双击时触发单击时的动作,所以就在网上各种搜解决办法,未果,经过苦思冥想,发现以下办法

1.重写activity的dispatchTouchEvent方法


 1 @Override
2 public boolean dispatchTouchEvent(MotionEvent event) {
3
4 if (event.getAction() == MotionEvent.ACTION_DOWN) {
5 mDownX = (int) event.getX();
6 if (mFirstTouchEventTime == 0) {
7 mFirstTouchEventTime = event.getDownTime();
8 } else {
9 mLastTouchEventTime = event.getDownTime();
10 }
11 } else if (event.getAction() == MotionEvent.ACTION_UP) {
12 mUpX = (int) event.getX();
13 if (Math.abs(mUpX - mDownX) < 30) {
14 Log.d(TAG, "--->>" + Math.abs(mFirstTouchEventTime - mLastTouchEventTime));
15 if (Math.abs(mFirstTouchEventTime - mLastTouchEventTime) < Constants.TIME_MENU_DISPLAY) {
16 mFirstTouchEventTime = 0L;
17 mLastTouchEventTime = 0L;
18 mScreenObsever.removeMessages(Constants.MSG_MENU_DISPLAY);
19 } else {
20 mScreenObsever.sendEmptyMessageDelayed(Constants.MSG_MENU_DISPLAY, Constants.TIME_MENU_DISPLAY);
21 }
22 } else {
23 mFirstTouchEventTime = 0L;
24 mLastTouchEventTime = 0L;
25 }
26 }
27
28 return super.dispatchTouchEvent(event);
29 }

其中 mFirstTouchEventTime 与 mLastTouchEventTime 为两个long型类变量,用来记录两次ACTION_DOWN动作发生的时间,Constants.TIME_MENU_DISPLAY 为一个自定义的msg what。mScreenObserver为一个自定义的handler,用来处理单击事件用。
2.mScreenObserver 的handler类实现

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

private
class ObseverOperateHandler extends
Handler {

        @Override

        public
void handleMessage(Message msg) {   

            if
(msg.what == Constants.MSG_MENU_DISPLAY) {

                mFirstTouchEventTime = 0L;

                mLastTouchEventTime = 0L;

                if
(mOperateMenuPopupWindow.isShowing()) {

                    mNotePopWindow.startDownAnimation();

                    mOperateMenuPopupWindow.dismiss();

                } else
{

                    mNotePopWindow.startUpAnimation();

                    mOperateMenuPopupWindow.showAtLocation(findViewById(R.id.photoLayout), Gravity.BOTTOM, 0, 0);

                }

            }

            super.handleMessage(msg);

        }

    }

if 中的部分即是要在单击中处理的事情了

3.至于双击要做的事情,就可以正常实现GestureDetector.OnDoubleTapListener来处理了。网上就可以搜到怎么弄了。

另外代码中的Constants.TIME_MENU_DISPLAY这个时间值,经各种途径验证为350ms比较恰当,即两次单击间隔350ms会被认为是一次双击。

时间: 2024-10-11 09:32:20

android 完全区分double-tap 与 singal-tap 的方法的相关文章

Android TextView里直接显示图片的三种方法

方法一:重写TextView的onDraw方法,也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系.一般如果字体是在图片上重叠的推荐这样写.时间关系,这个不付源码了. 方法二:利用TextView支持部分Html的特性,直接用api赋图片.代码如下: //第一种方法在TextView中显示图片 String html = "<img src='" + R.drawable.circle + "'/>"; ImageGetter imgGett

【Android】Could not find XXX.apk!的解决方法

昨天在Eclipse中导入一个Android工程后点击运行时出现了Could not find XXX.apk!的错误信息,具体错误提示如下: 到网上搜了好多方法,挨个尝试,最后都没解决但是,重启Eclipse居然好了,    观察发现在bin目录下没有apk文件,可能是因为工程没有完全编译通过无法生成apk,所以project-->clean,然后rebuild就可以了~ 另外可以手动导出无签名的apk然后在导入到模拟器中,对于如何将apk导入到模拟器中可以参考这篇文章: http://wan

Android实际开发中的bug总结与解决方法(一)

                                                                             Android实际开发中的bug总结与解决方法(一) Android开发中有很多bug,我们是完全可以在线下避免的,不要等到线上报的BUG的再去修复.下面是我在实际开发中遇到过的bug和解决方法. BUG 1: java.lang.RuntimeException: Unable to start activity ComponentInfo

android之在view中内嵌浏览器的方法

我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有一个用来显示网页的View呢,于是我就在eclipse里xml编辑器里输入<web,哈哈,果然下面有个提示是webVeiw,那么能不能用它呢?于是到网上搜一下它的资料,果然可以的,下面就开始吧. 先在xml里把webview建好,在代码里用findViewById()将其取出来.我的代码是: Web

Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法

http://www.cnblogs.com/SkyD/archive/2010/11/08/1871423.html Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法 SurfaceView在Android中用作游戏开发是最适宜的,本文就将演示游戏开发中常用的两种绘图刷新策略在SurfaceView中的实现方法. 首先我们来看一下本例需要用到的两个素材图片: bj.jpg就是一个渐变图,用作背景. question.png是一个半透明的图像,我们希望将它放在上面,围绕其圆心

Android ActionBar 关于tab的应用 以及 TabListener的方法详解

actionBar的tab标签应用以及TabListener的方法详解 package com.example.actionBarTest.actionBarTab; import android.app.*; import android.os.Bundle; import com.example.actionBarTest.R; import java.util.ArrayList; import java.util.List; /** * Created by Heyiyong on 20

android Uri获取真实路径转换成File的方法

Uri uri = data.getData(); String[] proj = { MediaStore.Images.Media.DATA }; Cursor actualimagecursor = managedQuery(uri,proj,null,null,null); int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); actua

Android手机外置SD卡(TF卡)的获取方法

Android手机上的外置SD卡,起初的时候,即在Android出世的前几年,那时手机的存储是十分有限的,不像现在到处可见16G.32G和64G的存储,因而那时候的手机有的厂商允许插入外置的SD卡,此时这张卡仍处于手机的扩展部分.后来,随着手机的发展以及存储能力的增加,这张外置SD卡,逐渐成为了手机的一部分,不再允许可挺拔了,当然现在依然有的手机允许对存储进行拓展,比如三星等. 那张拓展的存储卡,现在叫做TF卡,且不是所有的手机都支持它,但是有时候有些奇葩需求偏要优先存储在TF卡里面,这叫不得不

[Android]ADB Server didn&#39;t ACK错误的解决方法

Eclipse中调试的时候报错 [2014-06-18 13:07:49 - DinnerBooker] The connection to adb is down, and a severe error has occured.[2014-06-18 13:07:49 - DinnerBooker] You must restart adb and Eclipse.[2014-06-18 13:07:49 - DinnerBooker] Please ensure that adb is co

Android 通过应用设置系统日期和时间的方法

android 2.3 android 4.0 测试可行,不过需要ROOT权限. import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.util.Calendar; import android.os.SystemClock; public class SystemDateTime { static final String TAG = "SystemDateTi