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

行为变更 | Android 12 中不受信任的触摸事件

触摸控制是 Android 系统中同应用进行交互的主要方式。Android 12 中采取了额外的措施,来确保触摸事件被正确地传递给了应该响应此事件的应用,以此确保触摸交互的直观和安全性。...具体地说,就是在 Android 12 中,如果触摸事件是从一个不同的应用窗口传递的,那么此事件会被屏蔽。...尽可能使用特殊用途 (Special-Purpose) 的 API 在检查您的应用是否会受此影响之前,最好先评估一下您应用的某些场景是否可以使用以下 Android API。...如果您的应用不能使用上述 API,而是让触摸事件直接通过其窗口传递,那么在 Android 12 中它们可能无法按预期传递到下层。...在之前,应用可以通过简单地使用一个全屏窗口,并将其标记为 FLAG_NOT_TOUCHABLE 来实现,如图 1 所示: 请注意,在以前的操作系统版本中,通过实际的 UI 元素进行的触摸事件,在这种情况下会传递到下层的窗口中

1.4K30

Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)

但是,Android 平台并不支持这种模式,因为在 iOS 上框架渲染后系统会有回调通知,例如:当 iOS 视图向下移动 2px 时,我们也可以将其列表中的所有其他 Flutter 控件也向下渲染 2px...2.1、触摸事件 默认情况下, PlatformViews 是没办法接收触摸事件。...类似可见:《Flutter完整开发实战详解(十三、全面深入触摸和滑动原理)》 当触摸成功时会向 Android embedding 发送一条消息,其中包含 touch 事件的详细信息。...MotionEvent 的转化过程中可能会因为机制的不同,存在某些信息没办法完整转化的丢失。...当要求 AndroidView 提供 InputConnection 时,它会检查 AndroidView 是否确实是输入的目标。

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

    Android ANR问题解析(一)

    ActivityManagerService(简称 AMS)和 WindowManagerService(简称 WMS)会监测应用程序的响应时间,如果应用程序主线程(即 UI 线程)在超时时间内对输入事件没有处理完毕...因为只有主线程也就是UI线程需要与用户进行交互,子线程的阻塞或者缓慢只要不影响主线程就不会引发ANR。 超时时间:不同类型ANR的超时时间不同,只要主线程在这个时间上限内没有响应就会ANR。...ANR的类型 用户输入事件处理超时 当应用程序的窗口处于活动状态并且能够接收输入事件(例如按键事件、触摸事件等)时,系统底层上报的事件就会被InputDispatcher分发给该应用程序。...应用程序的主线程通过InputChannel读取输入事件并交给界面视图处理,界面视图是一个树状结构,DecorView是视图树的根,事件从树根开始一层一层向端点(例如一个 Button)传递。...当主线程在执行ContentProvider相关操作时没有在规定的时间内执行完毕就会发生ANR。由程序开发者自行设置是否启用以及超时时间。

    2.5K10

    (转载非原创)Android系统编程入门系列之界面Activity交互响应

    事件传递机制 在上文界面响应的三个方法中,关于他们被回调的时机,有个前提是子视图没有处理,即子视图的界面响应方法返回结果为false。这就涉及到Android系统的事件传递机制了。...那么,如果用户将手指触摸到屏幕上,会触发按下行为,该行为作为事件首先传递到根视图中,之后根视图再将该事件传递给子视图,子视图再将该事件传递给子视图的子视图,这样按照加载时的嵌套顺序一层层传递事件,称之为事件分发...boolean dispatchTouchEvent (MotionEvent event) 当某个事件被分发到该视图时,系统回调视图中的该方法。返回结果表示当前事件是否被处理。...boolean onInterceptTouchEvent(MotionEvent event) 当某个事件被分发到该视图后,系统会回调视图中的该方法,根据其返回结果判断是否拦截该事件交由当前视图处理...返回结果为true时,表示拦截该事件,将会回调当前视图的onTouchEvent(). boolean onTouchEvent (MotionEvent event) 当某个事件轮到该视图被处理时,

    42700

    Android 开发艺术探索笔记二

    FLAG_NOT_FOCUSABLE:表示不需要获取焦点,也不需要接收各种输入事件,同时启用FLAG_NOT_TOUCH_MODE 最终事件直接会传递给下层具有焦点的window FLAG_NOT_TOUCH_MODE...,系统会将当前window区域以外的单击事件传递给底层的window,当前区域内的单击事件自己处理,一般需要开启此标记,否则window将无法收到单击事件。...的init方法,PWM的init方法会在android:ui线程中运行,它的优先级要高于android:display线程,因此android:display要等待init方法执行完毕后,android...输入系统的中转站 通过窗口触摸而产生的触摸事件,InputManagerService会对触摸事件进行管理,寻找最合适的窗口来处理触摸反馈事件 Surface管理 窗口并不具有绘制功能,每个窗口都需要一块...ThreadLocal使用场景 当某些数据以线程为作用域并且不同线程具有不同数据副本使用ThreadLocal,比如要获取当前线程的Looper,但不同线程有不同Looper。

    1.8K10

    山川湖海 - Android无障碍功能优化实践

    其实主要源于 Android原生UI 对于 无障碍 并不是 强制性 的,所以大多数国内开发者在初入 Android 时甚至都没法关注到 无障碍功能 这个事,所以一直导致在国内这个事情似乎并不是那么重要,...对于 Android原生UI 而言,如果应用主要使用的是 [系统组件],那么在无障碍下,体验一般不会太差,比如常见的 Text , Button 。在无障碍下都会读取相应的显示文本信息作为描述。...与 原生UI 相比,Compose 在无障碍上的要求就 [严格] 了不少,如果你使用的是 非Text 组件,那么必须传递相应的 contentDescription ,当然这个值也可以传递为 null...isChecked = isSelect } } 手动发送无障碍事件 但某些情况下,我们不可能每次都像上述那要去设置吧,每次点击开关时,都走一遍上述设置代理的逻辑吧...比如如下: 其会自动将一些认为可以优化的 View 标注出来,有些是触摸按钮太小,有些是对比度不够,在开发过程中,我们可以借此来实现快速调整。

    94120

    自定义View从入门到上天

    ,不会占用主线程的资源。...中关掉硬件加速,这会导致自定义View时,canvas的某些方法不能正常使用,为了让自定义View达到更好的表现效果,建议不要关掉有用到自定义View界面的硬件加速(因为在View层面只能关闭硬件加速,...图文混排 涉及到图文混排的自定义View,一定要将排版和显示这两件事情分开,因为排版耗时但不涉及到UI的更新,可以在线程中处理,但显示必须要更新UI,所以在onDraw方法里面尽量不要做耗时和逻辑处理...同时显示也有技巧,为了节省内存,可以考虑做缓存,一个控件可能不只一页内容,可以在内存中缓存当前页和当前页的前、后两页,当滑动时,始终按照这种策略更新缓存内容就可以了,这样既达到了节省内存、又提高效率的目的...Android中的自定义属性 公共技术点之 View 事件传递 Android 触摸及手势操作GestureDetector 通过Spannable对象设置textview的样式 Android 5.0

    1.2K20

    Android 面试之必问Android基础

    onTouchEvent:方法返回值为true表示当前视图可以处理对应的事件;返回值为false表示当前视图不处理这个事件,它会被传递给父视图的onTouchEvent方法进行处理。...当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。...例如进行网络操作时或是更新UI时,如果运行时间较长,就不能直接在主线程中运行,因为这样会阻塞这个进程中其他的组件,我们可以将这样的组件分配到新建的线程中或是其他的线程中运行。...Android 规定访问 UI 只能在主线程中进行,因为 Android 的 UI 控件不是线程安全的,多线程并发访问会导致 UI 控件处于不可预期的状态。为什么系统不对 UI 控件的访问加上锁机制?...缺点有两个:加锁会让 UI 访问的逻辑变得复杂;其次锁机制会降低 UI 访问的效率。如果子线程访问 UI,那么程序就会抛出异常。

    77921

    Android 面试之必问Android基础

    onTouchEvent:方法返回值为true表示当前视图可以处理对应的事件;返回值为false表示当前视图不处理这个事件,它会被传递给父视图的onTouchEvent方法进行处理。...当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。...例如进行网络操作时或是更新UI时,如果运行时间较长,就不能直接在主线程中运行,因为这样会阻塞这个进程中其他的组件,我们可以将这样的组件分配到新建的线程中或是其他的线程中运行。...Android 规定访问 UI 只能在主线程中进行,因为 Android 的 UI 控件不是线程安全的,多线程并发访问会导致 UI 控件处于不可预期的状态。为什么系统不对 UI 控件的访问加上锁机制?...缺点有两个:加锁会让 UI 访问的逻辑变得复杂;其次锁机制会降低 UI 访问的效率。如果子线程访问 UI,那么程序就会抛出异常。

    70920

    Android 面试之必问Android基础

    onTouchEvent:方法返回值为true表示当前视图可以处理对应的事件;返回值为false表示当前视图不处理这个事件,它会被传递给父视图的onTouchEvent方法进行处理。...当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。...例如进行网络操作时或是更新UI时,如果运行时间较长,就不能直接在主线程中运行,因为这样会阻塞这个进程中其他的组件,我们可以将这样的组件分配到新建的线程中或是其他的线程中运行。...Android 规定访问 UI 只能在主线程中进行,因为 Android 的 UI 控件不是线程安全的,多线程并发访问会导致 UI 控件处于不可预期的状态。为什么系统不对 UI 控件的访问加上锁机制?...缺点有两个:加锁会让 UI 访问的逻辑变得复杂;其次锁机制会降低 UI 访问的效率。如果子线程访问 UI,那么程序就会抛出异常。

    62240

    iOS 中的事件响应

    的触摸事件不会调用,当手势识别失败时才开始调用 touchesBegan 函数。...UIGestureRecognizer 响应触摸事件的,区别在于当触摸事件发生时, 使用第一个方法可以立即控制 UIGestureRecognizer 是否对其处理,且不会修改 UIGestureRecognizer...当倒计时结束前,如果用户的手指发生了移动,直接滚动内容视图,不会将该事件传递给对应的子视图; 当倒计时结束时,如果用户的手指位置没有改变,则调用自身的 -touchesShouldBegin:withEvent...:inContentView:方法询问是否将事件传递给对应的子视图 (如果返回 NO, 则该事件不会传递给对应的子视图,如果返回 YES,则该事件会传递给对应的子视图,默认为 YES); 当事件被传递给子视图后...var delaysContentTouches: Bool // 是否可以取消内容视图被触摸,默认为YES,如果设置为NO,则一旦开始跟踪事件,即使手指进行移动也不会取消已经传递给子视图的事件,即滚动视图不会再滚动

    2.8K11

    求职笔记-iOS篇

    UIWindow的主要作用: 作为最顶层的视图容器,存放app的视图; 传递触摸和键盘等事件; KVO与Notification的异同 KVO和Notification本质都是观察者模式。...,管理触摸、手势等交互事件; 模型树/逻辑树(目标帧) :CALayer - modelLayer(),不涉及响应链(通过视图层级关系传递触摸事件的机制) **呈现树/动画树(当前帧) **:presentationLayer...RunLoop 此段,部分摘自文章 简单运行执行runlooprun函数并不会让系统停住等待事件,而是需要在运行runloop之前添加source,只有在有source的情况下线程才会停下来监听各种事件...; 当在其他线程上面执行selector时,目标线程须有一个活动的run loop。...UIApplication对象是第一个接收到时间的对象,它决定事件如何被处理。触摸事件分发到主窗口,窗口再分发到对应出发触摸事件的 View。其他的事件通过其他途径分发给其他对象变量做处理。

    1.2K60

    Android View的事件分发机制

    触摸事件 在用户触摸屏幕时,总是离用户触摸点最近的控件来响应触摸事件,如果最近的控件没有实现响应事件,那这个事件会不断的向父类传递,直到有view响应时,就会将触摸反馈的事件流传递给这个view的onTouchEvent...()方法,如下图: 如果CustmoView中不响应onTouchEvent(),那面事件会传递给LayoutView中,如果在LayoutView中响应了onTouchEvent(),那面事件就不会再传递给...Android 自定义触摸反馈事件时,通常都是如下的写法: public class MyView { // ......每次MotionEvent事件都会先询问上级视图是否需要拦截本次事件流,一但上级视图返回了true,那么后续的事件流就都会直接传递给这个视图的onTouchEvent()方法,不会再传递给之后的视图了。...1. onInterceptEvent() 函数中可以在最开始ACTION_DOWN时返回false,然后再之后的事件流中来判断是否需要开始拦截本次事件流,也就是说可以在之后事件流的过程中来判断是否达到触发拦截条件

    35510

    线程与更新UI,细谈原理

    进入正题,大家应该都听过这样一句话——“UI更新要在主线程,子线程更新UI会崩溃”。久而久之就感觉这是个真理,甚至被认为是“官方结论”。 但是如果问你,官方什么时候在哪里说过这句话,你会不会有点懵。...如果设置为固定值,是不会崩溃的,见案例2,所以是不是跟布局改变的逻辑有关呢? 延时3秒。如果不延时的话,即使是wrap_content也不会崩溃,见案例1,所以是不是跟某些类的加载进度有关呢?...."); } } 可以看到是因为当前线程currentThread不是mThread的时候,就会崩溃,报的错误是 “只有创建视图层次结构的原始线程才能触摸它的视图” ,看到这里是不是猜到一些了...翻译的还是比较准确的,只有创建视图的原始线程才能修改这个视图,听起来也蛮有道理的,我创造了你才有权利改变你,有那味了。...检查线程,其实就是检查更新UI操作的当前线程是不是当初创建UI的那个线程,这样就保证了线程安全,因为UI控件本身不是线程安全的,但是加锁又显得太重,会降低View加载效率,毕竟是跟交互相关的。

    85320

    035android初级篇之android的ViewGroup与View

    事件的基本流程如下: 事件分配给相应视图,视图处理它,并通知相关监听器。 操作过程中如果发生视图的尺寸变化,则该视图用调用requestLayout()方法,向父控件请求再次布局。...如果requestLayout()或invalidate()有一个被调用,框架会对视图树进行相关的测量、布局和绘制。 注意,视图树是单线程操作,直接调用其它视图的方法必须要在UI线程里。...跨线程的操作必须使用句柄Handler。 焦点处理: 框架处理焦点的转移,来响应用户输入。isFocusable()函数表示视图是否能接受焦点。...public boolean onTouchEvent(MotionEvent event) 此函数用于响应触摸屏事件。...public void requestLayout() 当某些东西发生改变后,当前View层次结构无效了,调用此函数对View的层次结构进行重新布局。

    55530

    React Native 新架构是如何工作的?

    在主线程中渲染 当 UI 线程上有高优先级事件时,渲染器能够在 UI 线程上同步执行所有渲染流水线。 默认或连续事件中断 在这个场景中,UI 线程的低优先级事件中断了渲染步骤。...React 和 React Native 渲染器能够中断渲染步骤,并把它的状态和一个在 UI 线程执行的低优先级事件合并。在这个例子中渲染过程会继续在后台线程中执行。...不相干的事件中断 渲染步骤是可中断的。在这个场景中, UI 线程的高优先级事件中断了渲染步骤。React 和渲染器是能够打断渲染步骤的,并把它的状态和 UI 线程执行的高优先级事件合并。...在 UI 线程渲染步骤是同步执行的。 来自 JavaScript 线程的后台线程批量更新 在后台线程将更新分派给 UI 线程之前,它会检查是否有新的更新来自 JavaScript。...这样,当渲染器知道新的状态要到来时,它就不会直接渲染旧的状态。 C++ 状态更新 更新来自 UI 线程,并会跳过渲染步骤。更多细节请参考 React Native 渲染器状态更新。

    2.8K10

    手把手教你读懂源码,View的Touch事件传递流程详细剖析

    这里需要注意的是: 当getWindow().superDispatchTouchEvent(ev)返回true时,即Activity的子View拦截了TouchEvent事件,那么接下来就不会再传递给...View的onFilterTouchEventForSecurity方法 如果被其他窗口遮挡,该方法返回false,表示需要过滤触摸事件,就会跳过dispatchTouchEvent方法中的if...isTransformedTouchPointInView方法 判断视图有scrollTo或scrollBy造成的滚动偏移也需要计算在内,并判断触摸点是否在当前子视图内。...当View没有被其他窗口遮挡时,判断mOnTouchListener是否为空,即判断该View有没有绑定OnTouchListener监听器。...事件从ViewGroup传递给子View时,其中ViewGroup可以通过onInterceptTouchEvent()方法对事件进行拦截,停止其往下传递,如果拦截(即返回true)后该事件会直接走到该

    92970

    2021年Android面试题及答案收集(不断更新中)

    ViewPager Android的事件传递(分发)机制 Bitmap的使用及内存优化 使用View绘制视图 Android内存泄漏及管理 Android设计模式之MVC JVM运行原理详解 Android...在优先级别最低的线程中进行,所以当应用繁忙时,GC就不会被调用; Java堆内存不足时,主GC会被调用,当应用线程正在运行,并在运行过程中创建新对象时,若这时内存空间不足,JVM会强制调用主GC,以便回收内存用于新的分配...Android的事件传递(分发)机制 基础概念: 事件分发的对象:点击事件(Touch事件),当用户触摸屏幕时(view或viewGroup派生的控件),将产生点击事件(Touch事件),Touch事件的相关细节...传递过程中的协作方法: public boolean dispatchTouchEvent(MotionEvent ev):事件分发处理函数,通常会在Activity层根据UI的情况,把事件传递给相应的...使用View绘制视图 View类是Android平台中各种控件的父类,是UI(用户界面)的基础构件,View相当于屏幕上的一块矩形区域,其重复绘制这个区域和处理事件,View是所有Weight类(组件类

    90720

    山川湖海 - Android无障碍功能优化实践

    而 无障碍功能 的适配在国外却是相对比较常见的一个事,甚至于某些国家如果不做适配可能会无法上架; 纵观业内,腾讯系产品在这方面做的比较好,当然这与他们内部标准的开发规则及庞大的 用户群体 也有关系。...其实主要源于 Android原生UI 对于 无障碍 并不是 强制性 的,所以大多数国内开发者在初入 Android 时甚至都没法关注到 无障碍功能 这个事,所以一直导致在国内这个事情似乎并不是那么重要,...对于 Android原生UI 而言,如果应用主要使用的是 [系统组件],那么在无障碍下,体验一般不会太差,比如常见的 Text , Button 。在无障碍下都会读取相应的显示文本信息作为描述。...与 原生UI 相比,Compose 在无障碍上的要求就 [严格] 了不少,如果你使用的是 非Text 组件,那么必须传递相应的 contentDescription ,当然这个值也可以传递为 null...比如如下: 添加描述 其会自动将一些认为可以优化的 View 标注出来,有些是触摸按钮太小,有些是对比度不够,在开发过程中,我们可以借此来实现快速调整。

    81421
    领券