Android上滑手势触发和不增加布局层级扩大点击区域

最近项目中需要实现手势上滑或者点击滑出界面的效果,实现上是利用GestureDetector,然后在onFling中判断,但遇到一个问题:手势上滑是针对整个布局的,但如果有对单独的View设置点击监听,在该View上的手势上滑会失效。

如果这个View本身就是专门用于点击的,那并没有什么问题,可惜的是,这个View的尺寸不大,所以要求扩大点击区域。

我们首先能想到的方法就是用一个容器将该View包起来,类似RelativeLayout,LinearLayout等,但这样布局的层级就会再加多一层。

我们能否想到不用增加层级也能实现点击区域扩大的方法呢?

GestureDetector是Android提供的手势操作类,它提供了单击,双击,长按等操作,并且会将这些事件传给onTouch,因此我们可以利用这个来判断触发单击事件的到底是哪个控件。

但是我们的问题是扩大点击区域,而不是识别控件,因此需要知道用户的点击动作到底是落在哪个区域。

所幸,MotionEvent提供了事件发生时候的坐标,这样我们就能知道单击时候的坐标,进一步确定是否在指定的区域范围内。

MotionEvent是Android中触控方面编码的一个至关重要的类,它提供了用户在屏幕上的触控信息。我们可以通过MotionEvent获取到触控的事件类型,触控的坐标,并且现在已经支持多点触碰,还能进一步获取触控的索引信息。

我们先上代码:

 1     @Override
 2     public boolean onTouch(View v, MotionEvent event) {
 3         if(event.getAction() == MotionEvent.ACTION_DOWN){
 4             int downX = (int)event.getX();
 5             int[] location = new int[2];
 6             ivMore.getLocationInWindow(location);
 7             if(Math.abs(downX - location[0]) <= 50){
 8                  ...
 9             }
10         }
11         return gestureDetector.onTouchEvent(event);
12     }

我们先通过MotionEvent的getAction,获取到触控的事件类型,单击的类型为ACTION_DOWN,然后通过MotionEvent的getX获取到点击的x坐标,然后通过getLocationInWindow获取指定的View的坐标,这里指定该组件的x轴坐标正负50(表示左右范围)内为触发范围。

我们现在可以不增加布局层级也能扩大点击范围了。

利用GestureDetector实现上滑判断是很简单的,只要实现OnGestureListener接口,在对应的回调中进行我们指定的操作,不过因为GestureDetector本身并不捕获触控事件,所以要再实现onTouch事件,并调用GestureDetector的onTouchEvent,将对应的事件传过去。

滑动的操作是在onFling回调中进行的,该回调会传进两个历史记录的MotionEvent,我们只要判断它们的Y轴坐标是否有变化即可。

Android的触控是一个相当大的话题范围,我们只要在明确自己需求的前提上,去寻找对应的快捷解决方案。

时间: 2024-10-19 18:17:13

Android上滑手势触发和不增加布局层级扩大点击区域的相关文章

用简单的方法,在android上实现手势放大缩小功能

package com.example.eventtest; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.gesture.GestureOverlayView; import android.gesture.GestureOverlayView.OnGestureListener; import android.graphics.Point; i

Android 上滑显示底部导航,下滑显示标题bar

本文简单介绍使用属性动画来实现上滑显示底部导航,下滑显示标题bar.先上图看效果,再分析: 可以看出这是个listview有标题和底部,有点像下拉刷新和上拉加载更多.只不过下拉或上拉一定时位置固定拉不动,且只在list的第一个item出现显示时,才平滑动画的让标题或底部显示或隐藏. 实现思路: 1.整个布局有三个部分构成,上部由一个RelativeLayout放ImageView或TextView.中间部分是个listView,下部是一个TextView. 2.采用LinearLayout摆放中

iOS 增加UIButton按钮的可点击区域

在很多时候,按钮可能看起来那么大,但是在它周围进行点击时,都能够触发事件,是因为它的可点击区域并不一定只有那么大. 在使用AutoLayout的时候,我们处理的是按钮的image属性,所以这个时候要将它的backgroundImage设置为nil,否则,会有两张不一样大小的image. -(CGRect)imageRectForContentRect:(CGRect)contentRect{ CGFloat x = contentRect.size.width-17; CGFloat y = 0

ffmpeg在android上输出滑屏问题处理

ffmpeg部分机器上有花屏的问题 原代码如下: while(av_read_frame(formatCtx, &packet)>=0 && !_stop && NULL!=window && bInit) { // Is this a packet from the video stream? if(packet.stream_index==videoStream) { // Decode video frame avcodec_decode

Android如何定制一个下拉刷新,上滑加载更多的容器

前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉刷新和上滑,非常考验对android布局与父子触摸机制的功底,因此参考gitHub上的一个热门的下拉刷新项目 之所以选择他是因为它一个类就完成了所有View的适配,非常的精简强力. 需求 咱对下拉刷新.上滑加载更多的控件,需求如下: 1:下拉刷新,拖动到一定距离,提示文字变成 放手刷新 2:刷新完成

Android scrollview 上滑固定某一控件(美团团购详情UI)完美版

在scrollview 上滑固定某一控件(美团团购详情UI)文中介绍了怎么用touchlistener实现类似上滑停住的效果,但是这种方法存在一个明显的bug,就是在内容比较多的时候, 大部分人都是以滑动方式查看内容,而不是touch的方式,这就会导致最上面的滑块出现不及时,或者延后的现象,这里介绍一个全新的方法去实现类似效果,可以很好的解决以上问题. 目前在scrollview中没有onscrolllistener所以需要自己去实现,先复写一个scrollview: package com.e

Android右滑返回上一界面

今天突然心血来潮,想在自己的项目里面加一个右滑finish界面的功能.思路很简单就是拦截屏幕滑动事件,然后finish当前页面,不多说了,上代码吧. 第一步:利用VelocityTracker计算滑动速度,及一些附带的代码. private VelocityTracker mVelocityTracker = null;//速度记录器 private int getScrollVelocity() { mVelocityTracker.computeCurrentVelocity(1000);

Android 浮动按钮+上滑隐藏按钮+下滑显示按钮

1.效果演示 1.1.关注这个红色的浮动按钮 . 可以看到,上滑的时候浮动按钮消失,因为用户迫切想知道下面的东西,而不是回到顶部. 当下滑的时候,用户想回到原来的位置,就可以点击浮动按钮,快速回到顶部.所以浮动按钮弹上来了. 2.定义一个动画通用类AnimatorUtil 2.1.源代码如下 public class AnimatorUtil { private static LinearOutSlowInInterpolator FAST_OUT_SLOW_IN_INTERPOLATOR =

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_