目前业界上主要的轻量化方法如下: 蒸馏:将大模型蒸馏至小模型,思路是先训练好一个大模型,输入原始数据得到logits作为小模型的soft label,而原始数据的标签则为hard label,使用soft...我们团队对这些轻量化方法都进行了尝试,简单总结如下: 蒸馏:可以很好地将大模型的能力教给小模型,将12层BERT蒸馏至2层BERT,可以达到非常接近的效果。但这种方法需要先训练出一个大模型。...这些工具都不适合使用,那就让我们自己来动手剪枝吧: 简单方法:直接改配置文件的参数设置,不加载谷歌pretrain好的语言模型,使用自己的数据重新pretrain语言模型,再加载该模型进行task-specific...终极方法:在pretrain阶段,取通用BERT模型前n维参数进行赋值再train一遍;在fine-tune阶段,就可以直接加载train好的模型进行微调。 下面进入了超级简单的代码环节!...取前n维向量的剪枝方法是否过于粗暴?是有点,我们也简单尝试过,对权重根据绝对值进行排序裁剪,但结果相差不大。
, 如果设置了 , 则执行被用户设置的 触摸监听器 OnTouchListener ; 如果用户设置的 触摸监听器 OnTouchListener 触摸方法返回 true , 此时该分发方法的返回值就是...// 如果用户设置的 触摸监听器 OnTouchListener 触摸方法返回 true // 此时该分发方法的返回值就是 true result...= true; } } } 如果上述 li.mOnTouchListener.onTouch(this, event) 执行的触摸监听器触摸方法返回值为 true , 则不会调用...View 组件自己的 onTouchEvent 方法了 , 在 onTouchEvent 方法中会调用 点击监听器的方法 ; 如果用户的 触摸监听器 OnTouchListener 返回 true...result && onTouchEvent(event)) { result = true; } } } 方法一 : 最简单的方法是 让 触摸事件
我们上代码验证,我们先写一个最简单的Activity, ? 很简单的布局文件 ? 很简单的按钮点击 此时我们运行程序,点击按钮,控制台会打印 “btn clicked!” 日志,一切正常。...这里分三步,第一步,如果是触摸开始类型ACTION_DOWN事件,会回调onUserInteraction()方法,所以在项目中可以考虑将一些需要用户开始触摸时就执行的代码放到此方法中;第二步,将触摸事件...下面我们将onTouchListener的返回值改为false,并重写EventBtn onTouchEvent方法,并返回true。 ? 运行App,点击按钮,查看打印的日志, ? ...这也验证了我们关于View触摸事件传递的第二部分,触摸事件ev优先被onTouchListener消费,然后再让传递给onTouchEvent消费。 ...现在我们通过代码验证我们关于View触摸事件传递机制的结论,为了进一步佐证我们的结论,我们还得去查看View的框架源码,我们打开View的源码,找到dispatchTouchEvent方法, ?
: 首先,View 的源代码中已经给我们写了一个 onTouchEvent 方法用于处理最直接的触摸事件,我们可以在官方文档中看到对这个方法的介绍: public boolean onTouchEvent...接下来介绍一个配合这个方法使用的类:VelocityTracker(速度追踪类),这个类用于获取触摸移动的时候的速度,一般来说,我们会在 onTouchEvent 中使用这个类,先看看官方文档的说明:...也就是说这个 View 的OnTouchEvent方法对于当前的触摸事件(在这一次触摸事件手指松开之前)已经失效了 */ return true; } } 这个自定义控件只能在代码中新建...,不能再布局文件中使用,因为我们只写了一个构造方法,并且这里我们利用 GetInfFromMotionEvent 接口将得到的触摸信息传递出去,接下就是MainActivity.java: import...所以说 OnTouchListener 接口和 View 中自带的 onTouchEvent 方法是不能同时使用的。有兴趣的小伙伴可以自己去试验一下。Ok,这个问题就解决了。
2、ViewGroup的dispatchTouchEvent 如果要很好掌握Touch事件处理,这部分要重点学习,而且不同Android版本的实现不一致,本文仍然使用最新的Android 7.1...如果event为空,则将动作设为ACTION_CANCEL,接着用一个for循环不断向下传递触摸事件,然后再清除所有触摸目标,最后在回收拷贝的对象。...从最开始到这里,我们大概分析了一下事件分发流程,通过调用Activity的dispatchTouchEvent方法,事件会首先被派发到最顶级的DecorView也就是ViewGroup,再由ViewGroup...OnTouchListener监听器 当前View一旦执行了setOnTouchListener方法,该View的mOnTouchListener就不为空,就会调用OnTouchListener...Android事件分发机制全图 这一块的内容详细分析确实比较麻烦,但是整体疏通以后看起来大体还算比较简单的。如果有疑问,欢迎留言一起相互探讨共同进步。
触屏事件 三类简单触屏事件: 单击事件:OnClickListener 长按事件:OnLongClickListener 触摸事件:OnTouchListener 这些方法都是View类的,所以像TextView...这样看似不是按钮的组件也可以使用这些监听。...触摸事件 触摸事件有onTouch方法有参数MotionEvent event,通过对象event方法getX()和getY()可以获取触摸出横纵坐标。...触摸事件第一下必须点在组件上,之后手指可以滑向组件之外,并且可以得到时时的坐标。 简单地说,为一个飞机加上监听之后,我们必须手指放在飞机上才可以拖动飞机。...对最上面的TextView加上触摸监听器,并显示坐标。 xml代码: <?xml version="1.0" encoding="utf-8"?
某天,项目收尾时,愕然发现在某页 Google Map 与当前页面滑动冲突,最直接的表现结果便是,手指触摸地图进行滑动时,地图视觉卡顿且页面会随着手指滑动而滑动,顿时很蛋疼,脑海第一想法事件分发,拦截丫的不就好了吗...,最直接的,触摸地图的时候,父容器别管我不就好了。...首先,重写 SupportMapFragment ,这里主要通过 dispatchTouchEvent 进行事件分发,也可以简单理解为在这里我们去控制地图与父容器之间事件传递。...listener) { mListener = listener; } public interface OnTouchListener { public..." android:layout_width="match_parent" android:layout_height="match_parent" /> 最后,实例化地图的同时告诉父容器
ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢?...的一个final的内部类并且继承FrameLayout的,也是Window界面的最顶层的View对象,这是什么意思呢?...enabled,除非你手动设置为disabled 第三个条件就是OnTouchListener接口的onTouch()方法的返回值了,如果调用了setTouchListener()设置OnTouchListener...()的值 现在你了解了View的onTouchEvent()方法和onTouch()的关系了吧,为什么Android提供了处理Touch事件onTouchEvent()方法还要增加一个OnTouchListener...事件是从最顶层的View一直分发到手指touch的最里层的View,如果最里层View消费了ACTION_DOWN事件(设置onTouchListener,并且onTouch()返回true 或者onTouchEvent
; ② 触摸监听器 : 自定义组件实现 OnTouchListener 触摸监听器 , 并重写 onTouch 方法 ; ③ 创建手势识别对象 : 创建 GestureDetector 对象 , 传入本组件作为手势监听器...; mGestureDetector = new GestureDetector(context, this); ④ 为组件设置触摸监听器 : 为本自定义组件设置触摸监听器 ; setOnTouchListener...触摸事件传递给 GestureDetector : 在 View.OnTouchListener 触摸监听器的 onTouch 触摸回调方法中 , 将触摸事件传递给 mGestureDetector 处理...触摸滑动操作 : ① onScroll 方法 : 触摸滑动主要在 GestureDetector.OnGestureListener 监听器中的 onScroll 方法中实现 , 该方法是触摸滑动事件...0 , 对应的图片也向下滑动 , 解码区域的 top 和 bottom 增加 ; ③ 解码区域限制 : 解码的最底部不能超过图片高度 , 解码的最顶部不能小于 0 ; 分别针对这两种情况进行各种限制
public void onClick(View v) { Log.i(null, "OnClickListener--onClick--"+v); } } 到此基础示例的代码编写完成...也就是说当点击View时事件派发每一个down,up的action顺序是先触发最父级控件(这里为LinearLayout)的dispatchTouchEvent->onInterceptTouchEvent...3-1 从ViewGroup的dispatchTouchEvent方法说起 前一篇的3-2小节说在Android中你只要触摸控件首先都会触发控件的dispatchTouchEvent方法(其实这个方法一般都没在具体的控件类中...在dispatchTouchEvent(MotionEvent ev)这段代码中使用变量intercepted来标记ViewGroup是否拦截Touch事件的传递,该变量类似第一步的mFirstTouchTarget...具体总结如下: Android事件派发是先传递到最顶级的ViewGroup,再由ViewGroup递归传递到View的。
页面布局,相对布局 按钮位于父窗体的下方使用android:layout_alignParentBottom=”true” 图片位于按钮的上方,填充父窗体,使用android:layout_above=...,参数:Color.WHITE白色 调用ImageView对象的setOnTouchListener()方法,参数:OnTouchListener对象,这个类是一个接口类型,因此直接new它创建匿名内部类实现方法...onTouch() 在onTouch(View v,MotionEvent event)方法里面 参数:View对象是被触摸的对象,MotionEvent对象是触摸事件对象 调用MotionEvent对象的...getAction()方法,获取触摸事件 switch判断这个事件 事件为MotionEvent.ACTION_DOWN是手指第一次触摸屏幕 事件为MotionEvent.ACTION_MOVE是手指在屏幕上移动...事件为MotionEvent.ACTION_UP是手指离开屏幕 当手指触摸屏幕时 定义手指开始位置的坐标startX startY 调用MotionEvent对象的getX() 和 getY()方法,
在事件处理中,如果需要识别复杂的手势操作,可以使用GestureDetector来实现;如果只需要处理简单的触摸事件,可以直接使用MotionEvent。...但总得来说可以归为两类。...参考简答: onTouchListener.onTouch: onTouch() 方法,用于处理触摸事件。...当一个View设置了OnTouchListener,它的onTouch方法会在触摸事件发生时首先被调用。...当没有设置 OnTouchListener,或者OnTouchListener的onTouch方法返回false时,系统会调用View的onTouchEvent方法来处理触摸事件。
3-2 从View的dispatchTouchEvent方法说起 在Android中你只要触摸控件首先都会触发控件的dispatchTouchEvent方法(其实这个方法一般都没在具体的控件类中,而在他的父类...4-2-2 简单修改onTouchEvent返回值为true 将TestButton类的onTouchEvent方法修改如下,其他和基础代码保持不变: @Override public boolean...4-2-3 简单修改onTouchEvent返回值为false 将TestButton类的onTouchEvent方法修改如下,其他和基础代码保持不变: @Override public boolean...4-2-5 简单修改dispatchTouchEvent返回值为false 将TestButton类的dispatchTouchEvent方法修改如下,其他和基础代码保持不变: @Override...综合得出Android View的触摸屏事件传递机制有如下特征: 触摸控件(View)首先执行dispatchTouchEvent方法。
上一篇中,我说明了Android中Activity和View触摸事件的传递流程,现在我们来继续学习MotionEvent在View的容器ViewGroup中的传递过程。 ...很明显,我们的按钮的触摸事件和它的父容器的触摸事件,都触发了,这是因为,我们EventBtn的onTouchListener方法和onTouchEvent方法都返回false,没有消费触摸事件,事件会向上继续传递...为了搞清楚上面的问题,我们继续来到View的dispatchTouchEvent方法中,我们看到下面的一段代码 ? ...同样,我们可以利用代码来验证我们上面的结论,我们打开EventBtn类中dispatchTouchEvent方法中的日志打印代码,同时我们将btn3的onTouchListener方法返回true,消费掉触摸事件...关于Android中ViewGroup的触摸事件传递就介绍到这里,难免很多地方有错误纰漏,但是我能够坚持把这些写出来,我觉得我已经有一点小小的提高了,很开心~~
大伙第一反应绝对是Google提供给我们的GestureDetector类,没错今天我们就使用使用这个类来给大家完毕以上的需求!...第一:将主逻辑代码类继承FragmentActivity类并实现OnGestureListener监听和OnTouchListener监听,同一时候在onCreate方法中创建GestureDetector...监听时是须要您实现其方法的。...e) {} 能够看到OnTouchListener仅仅能监听到三种触摸事件,即按下。...e) { firstScroll = true;// 设定是触摸屏幕后第一次scroll的标志 return false; } 通过在onTouch()方法中调用gestureDetector.onTouchEvent
一、带着问题出发 我们手触摸点击屏幕的时候,触摸、点击事件是如何分发的呢? 布局中的控件是如何获取到按键事件的呢?...二、说在前面 下面来大体说下事件分发涉及到的几个类和相关方法: Android的事件分发顺序是:Activity ----> ViewGroup ----> View 涉及到的几个重要方法...intercept 值为true,则进行事件拦截,执行的是super.dispatchTouchEvent(event),也就是View的dispatchTouchEvent(ev)方法,这个下面会分析...intercept 值为false,则会遍历ViewGroup的子view,如果是处于子View的触摸区域,则会调用子view的dispatchTouchEvent(); 五、View的事件分发机制...六、最后总结 通过上面简单的代码跟读,我们知道点击Activity时,点击事件最先传递到Activity.java dispatchTouchEvent()中进行分发,dispatchTouchEvent
具体到LinearLayout的编码实现,对应的便是LinearLayout.LayoutParams的leftMargin参数,若该参数为正数,则视图页面拉出了一段空白;若该参数为负数,则视图页面隐藏了一段内容...所以我们可以给视图添加触摸监听器OnTouchListener,在触摸坐标发生变化的同时,给菜单子页面隐入隐出对应的宽度,从而达到抽屉式拉出菜单的效果。...下面是一个简单侧滑的代码例子: import com.example.exmslidingmenu.util.MetricsUtil; import android.annotation.SuppressLint...setMode为LEFT_RIGHT时使用。 setSecondaryShadowDrawable : 设置第二个菜单的背景图像。setMode为LEFT_RIGHT时使用。...下面是SlidingMenu的Activity主页面代码示例: import android.os.Bundle; import android.support.v4.app.Fragment; import
; ViewGroup | dispatchTransformedTouchEvent 方法中 , 传入的子组件为空 , 表示事件被拦截了 , 或消费不成功 , 此时需要消费自己的触摸事件 , 调用父类..., 会调用 View 的 OnTouchListener 方法 , OnTouchListener 是在 View 的 ListenerInfo mListenerInfo 成员中的 OnTouchListener...// 如果用户设置的 触摸监听器 OnTouchListener 触摸方法返回 true // 此时该分发方法的返回值就是 true result...// 如果用户设置的 触摸监听器 OnTouchListener 触摸方法返回 true // 此时该分发方法的返回值就是 true result...View 组件自己的 onTouchEvent 方法 // 因此 , 如果用户的 触摸监听器 OnTouchListener 返回 true // 则 用户的 点击监听器 OnClickListener
前言 在Android开发中,Android的事件传递可谓比较重要,是一块比较重要的知识体系,不管是日常开发还是面试中熟悉整套的传递机制都尤为重要,Android 事件传递 其实是Android输入子系统的一部分...,主要表达APP端接收并传递由IMS捕获到的输入事件的流程,例如 按键Key事件、触摸touch事件等 image.png Android输入子系统到APP端事件传递 作为一个Android研发来说,SystemServer...()方法中实例化 ViewRootImpl 的setView()比较重要,他接收DecorView的实例引用,并进行各种InputStage的实例化,代码简化后如下 public void setView...最终会调用到输入焦点的3个方法:使用setKeyListener注册的监听器的onKey,之后是onKeyDown和onKeyUp,或者调用activity的onKeyDown和onKeyUp方法,也就是兜底处理无人处理的...则认为是一个点击事件 走OnClick 总结 Android事件由IMS负责捕获,例如触摸、按键、鼠标等事件,捕获到事件后WMS配合判断当前应该分发给哪个Window SystemServer与APP端的事件传递通过
存放补间动画的XML文件 2.如何使用这些资源 我们所有的资源文件都会在R.java文件下生成一个资源id,我们可以通过这个资源id来完成资源的访问,使用情况有两种:Java代码中使用和XML代码中使用...因为外部类不能直接访问用户界面 类中的组件,要通过构造方法将组件传入使用;这样导致的结果就是代码不够简洁!...2.Android回调的事件处理机制详解: 在Android中基于回调的事件处理机制使用场景有两个: 1)自定义view 常见View组件的回调 android为GUI组件提供了一些事件处理的回调方法...简单的流程大概是这样: 当我们一个手指触摸屏幕 ——> 触发ACTION_DOWN事件 接着有另一个手指也触摸屏幕 ——> 触发ACTION_POINTER_DOWN事件,如果还有其他手指触摸,继续触发...我们通过几十行的代码就可以完成 我们的异步操作,而且进度可控;相比起Handler,AsyncTask显得更加简单,快捷~当然,这只适合 简单的异步操作,另外,实际异步用的最多的地方就是网络操作,图片加载
领取专属 10元无门槛券
手把手带您无忧上云