首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android中View位置和触摸事件详解

一、简述 View是Android中所有控件的基类,不管是简单的Button和TextView,还是复杂的RelativeLayout和ListView,其基类都是View类;ViewGroup也继承了...View类,这意味着View本身就可以代表简单的和复杂的所有控件和布局,通过这种关系,就形成了View树的结构。...本文Demo都是在自定义View中进行的,文末有下载链接 View的位置参数 MotionEvent屏幕触摸事件 GestureDetector手势检测(单击,双击,长摁,滑动) 二、View的位置参数...context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } 三、MotionEvent 1、手指触摸屏幕后产生的事件...,典型事件如下: ACTION_DOWN–手指刚触摸屏幕 ACTION_MOVE–手指在屏幕上移动 ACTION_UP–手指从屏幕上分开的一瞬间 2、MotionEvent获取点击事件发生的坐标 getX

1.5K51

Android使用TouchDelegate增加View触摸范围

本文为大家分享了Android使用TouchDelegate增加View触摸范围的方法,供大家参考,具体内容如下 还不知道TouchDelegate这个东西的可以先看一下API,这里大致说一下它的作用:...假设有两个View,分别是v1,v2,我们可以通过v1的setTouchDelegate(bounds, v2)来委派触摸事件,其中bounds是一个Rect。...既然是这样,那我们可以通过设置某个view的parent的touchDelegate来达到扩大这个view触摸范围的目的。关键是什么时候去执行parent.setTouchDelegate()方法呢?...至此,实现的思路已经很清晰了,我们通过自定义一个Button来检验一下,下面开始上代码: 为了方便在xml中使用我们自定义的View,并且可以自定义扩大的触摸范围,我们再自定义一个attrs,res/values...如果希望一个view能设置多个委派,需要再自定义parent,具体方法可参考:链接地址 总而言之,要触发委派,必须保证parent接收到了触摸事件,并且落在了你定义的范围内。

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android中单个View触摸事件分发机制

    接下来就进行分析对于view触摸事件的执行,分析几两个问题, 为什么onClick时不会产生点击和长按的冲突? 为什么onLongClick时会执行完长按操作,再紧接着直接点击操作?...对于view触摸事件有三个动作: ACTION_DOWN:按下 ACTION_MOVE:移动 ACTION_UP:弹起 对于一个view,有touch事件,drag事件,click事件,所涉及到的listener...方法如下 以TextView为例,给textview添加listener: setOnTouchListener:覆写父接口OnTouchListener的onTouch方法,当触摸view时会触发该listener...默认的是返回的false 在此声明:当屏幕进行触摸时首先是activity感受到该触摸事件,然后对事件进行分发处理,也就是说要不要传给activity中的view进行处理。...了解到触摸事件处理逻辑后博文刚开始的问题就好解决多了 当点击view时,只是执行onClick,而不执行onLongClick 当长按view时 ,在手抬起之前执行onLongClick,在抬起之后会执行

    81420

    WPF 触摸失效 试试重启触摸

    在使用一些诡异的系统以及诡异的触摸框的时候,也许会出现 WPF 程序触摸失效,失效的本质原因是 Win32 层应用触摸失效。...也许出现的问题是某个窗口设置 TopMost 然后插拔一些触摸设备等,这些行为,如果触摸设备太过诡异,也许就会让 Win32 窗口触摸失效。...而我自己基于开源的 WPF 框架也定制了可以从触摸线程都重启的强力版本,当然了,这个版本非开源的版本 在使用本文的方法之前,请确定你对触摸有足够的了解 如果你对触摸的了解很少,那么我推荐你先看以下博客...WPF 触摸屏应用需要了解的知识 浅谈 Windows 桌面端触摸架构演进 WPF 客户端开发需要知道的触摸失效问题 对于 Win32 应用来说,如果应用的触摸失效了,可以的解决方法是重新注册一次触摸,...关于在 WPF 中的触摸调用细节请看 WPF 触摸到事件 和 WPF 通过 InputManager 模拟调度触摸事件 重启注册触摸的步骤就是先反注册,然后再次注册。

    1.3K40

    高级 UI 成长之路 (二) 深入理解 Android 8.0 View 触摸事件分发机制

    前言 在上一篇文章中我们介绍了 View 的基础知识以及 View 滑动的实现,本篇将为大家带来 View 的一个核心知识点 事件分发机制。...如果事件能够传递给当前的 View ,那么此方法一定会被调用,返回结果受当前 View 的 onTouchEvent 和下级 View 的 dispatchTouchEvent 方法的影响,表示是否消耗当前事件...方法,即点击事件开始交由 View 处理,请看下面的分析: View 对点击事件的处理过程 其实 View 对点击事件的处理过程稍微简单一些,注意这里的 View 不包含 ViewGroup 。...- mDownX) mLastMoveX = mMoveX //当手指拖动值大于 TouchSlop 值时,就认为是在滑动,拦截子控件的触摸事件...true } } return interceptor } /** * 父容器没有拦截事件,这里就会接收到用户的触摸事件

    62360

    WPF 插拔触摸设备触摸失效

    最近使用 WPF 程序,在不停插拔触摸设备会让 WPF 程序触摸失效。通过分析 WPF 源代码可以找到 WPF 触摸失效的原因。...获取触摸流程循环用于拿到用户触摸相关。很多的时候,在用户正常使用的流程只是运行初始化流程循环一次,之后在用户触摸的时候就通过获取触摸流程循环拿到值。...因为 GetPenEvent 和 GetPenEventMultiple 都只有在触摸屏收到触摸信息或者 _pimcResetHandle 被释放会返回,而在用户拔出触摸屏时,触摸屏是没有收到触摸信息,...因为在用户插入触摸屏时触发了 TabletAdded 消息,在之后用户触摸时不会有其他的插拔触摸相关消息。...实际上这里在 _handles 没有值就是用户没有触摸屏,用户插入触摸屏的时间是很少的,没有几个用户一天没事都在插入拔出触摸屏,所以在用户插入触摸屏时再创建一个新的线程,在用户拔出触摸屏去掉这个线程是可以的

    1.7K10

    WPF 从触摸消息转触摸事件

    在 WPF 程序可能因为一些坑让程序触摸失效,如果此时还可以收到系统的触摸消息,那么可以通过从触摸消息转触摸事件解决程序触摸失效但不适合所有触摸失效程序 在 WPF 的触摸代码写的不是很清真,特别是触摸到事件可能出现一些坑...,如WPF 在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待 和 WPF 插拔触摸设备触摸失效 等,有时候在开机的过程,如果启动快了,触摸设备还没准备好,刚好在 WPF 初始化的过程 USB 触摸设备才准备好...因为在希沃的设备上主要是触摸屏幕,用户不会有鼠标,如果出现了初始化的过程刚好就是 USB 准备好,那么这个程序将收不到任何触摸事件 在程序启动的时候,可以通过获得触摸精度和触摸点判断当前是否存在触摸设备...但是还可以收到系统的触摸消息,可以通过本文的黑科技收到触摸 在 WPF 的框架,触摸是从 PENIMC 里面获取的,如果通过自己创建一个模拟的触摸设备,请看 WPF 模拟触摸设备 也可以做到模拟一个触摸...在默认的 WPF 程序是收不到系统的触摸消息,需要禁用实时触摸才可以收到触摸消息,在 Win7 和之后都可以从系统收到 WM_TOUCH 消息,通过这个消息可以解析当前的触摸点和触摸面积,通过这两个值可以用来模拟触摸走原有的

    1.2K20

    Android触摸事件_wpf触摸屏点击事件

    触屏事件 三类简单触屏事件: 单击事件:OnClickListener 长按事件:OnLongClickListener 触摸事件:OnTouchListener 这些方法都是View类的,所以像TextView...这三类触屏事件都是View中的接口,其定义如下: public static interface View.OnClickListener { void onClick(View...触摸事件 触摸事件有onTouch方法有参数MotionEvent event,通过对象event方法getX()和getY()可以获取触摸出横纵坐标。...触摸事件第一下必须点在组件上,之后手指可以滑向组件之外,并且可以得到时时的坐标。 简单地说,为一个飞机加上监听之后,我们必须手指放在飞机上才可以拖动飞机。...对最上面的TextView加上触摸监听器,并显示坐标。 xml代码: <?xml version="1.0" encoding="utf-8"?

    2.1K20

    Android触摸反馈

    同向嵌套 父 View 会彻底卡住子 View 原因:抢夺条件一致,但 父 View 的 onInterceptTouchEvent() 早于子View 的 dispatchTouchEvent()...解决⽅方案: 实现策略—父 View、子 View 谁来消费事件可以实时协商 换成 NestedScrollView:可以滑动 实现 NestedScrollingChild3 接口来实现自定义的嵌套滑动逻辑...自定义单 View触摸反馈 View.onTouchEvent() 当用户按下(ACTION_DOWN): 如果不在滑动控件中,切换至按下状态,并注册长按计时器 如果在滑动控件中,切换至预按下状态...() View中 setOnTouchListener的onTouch,onTouchEvent,onClick的执行顺序 View的dispatchTouchEvent源码 public boolean...的触摸反馈 除了重写 onTouchEvent() ,还需要重写 onInterceptTouchEvent() onInterceptTouchEvent() 不用在第一时间返回 true,而是在任意事件

    1.5K60

    【Android 应用开发】自定义View 和 ViewGroup

    自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸按键相关...当某个键被按下时触发该方法; (7)松开键方法 public boolean onKeyUp(int keyCode, KeyEvent event) 当某个键松开的时候调用该方法; (8)轨迹球事件方法...public boolean onTrackballEvent(MotionEvent event) 发生轨迹球事件时触发该方法; (9)触摸方法 public boolean onTouchEvent...自定义View 自定义一个View组件铺满全屏, 在绘制该View组件的时候, 在onDraw()方法中根据一个xy坐标绘制一个小球; 这个xy坐标在触摸回调方法onTouchEvent()方法中动态改变..., 当检测到触摸位置发生改变, 那么就重新给xy坐标赋值, 并且调用invalidate()方法重绘该组件, invalidate()方法执行后, 会回调onDraw()方法; public class

    48620

    实习杂记(27):android的touch Mode

    当用户通过键盘(或者轨迹球)操作的时候,有必要聚焦当前接受输入的UI元素,例如,高亮(聚焦)某个按钮,让用户知道当前正在操作的UI元素是哪个。      ...并且,通过触摸屏与设备交互的时候,点击某个UI元素也不会导致该元素聚焦,此时的高亮效果是由Pressed状态来完成的。...可以通过调用View的isInTouchMode来判断设备当前是否处于Touch Mode模式。       但是,也有例外情况。...调用View的setFocusableInTouchMode(true)可以使View在Touch Mode模式之下仍然可获得焦点(像Edittext就是在内部设置了这个属性),调用isFocusableInTouchMode...可以判断View是否可在Touch Mode模式下聚焦。

    70320

    轨迹拼接(Trajectory Stitching)

    对于控制来说,连续稳定的轨迹更利于控制下发指令的平滑性,避免车辆产生抖动。...实际测试表明,轨迹拼接(Trajectory Stitching)确实能够使实车的控制更加平滑。...轨迹规划模块以固定的频率进行, 我们使用了轨迹拼接的算法(Trajectory Stitching)保证相邻帧的轨迹在控制器看来是平滑的。...); 如果上一周期的轨迹存在, 我们会根据当前系统时间 T, 在上一周期的轨迹中找到相对应的轨迹点, 然后我们进行一个比较, 比较这个轨迹点与定位模块获得的当前车辆状态的差异, 如果这个差异在一定范围内...这种机制保证了在控制误差允许的情况下, 做到相邻帧轨迹的平滑拼接. 在控制器看起来, 规划模块发出的轨迹是一小段一小段 dt 长度的轨迹光滑拼接起来的.

    2.5K10
    领券