这次打算来梳理一下 Android Tv 中的按键点击事件 KeyEvent 的分发处理流程。...() 分发,具体是如何递归寻找的这部分代码待研究。...上面这段代码能看懂么?...通常情况下,都会含有 return super,因为我们没有必要对所有按键都进行拦截,有些按键仍旧需要继续分发处理,因为 Android 系统默认对很多特殊按键都进行了处理。...参考 Android View框架总结(九)KeyEvent事件分发机制 Android按键事件传递流程(二)
所以,系统已经实现的相关的逻辑,所以就需要看看系统的实现代码。...//由dispatchKeyEvent进行焦点的分发,如果dispatchKeyEvent方法返回true,那么下面的焦点查找步骤就不会继续了。...//所以这里的dispatchKeyEvent方法执行的是ViewGroup的dispatchKeyEvent()方法 if (mView.dispatchKeyEvent(event)) {...另外,就是从系统层面给所有的view添加focusable属性,也就是解析的时候给view都加上这个属性。 最后就是焦点的显示,可能也需要给所有的view添加获取焦点后的放大或加边框显示。...有的我做了。
在processKeyEvent中,首先走了mView的dispatchKeyEvent,也就是从DecorView开始进行KeyEvent的分发。...1. dispatchKeyEvent 首先走DecorView的dispatchKeyEvent,之后会依次从Activity->ViewGroup->View的方向分发KeyEvent。...@Override public boolean dispatchKeyEvent(KeyEvent event) { ......再看看View的dispatchKeyEvent public boolean dispatchKeyEvent(KeyEvent event) { ......2. focusSearch 如果dispatchKeyEvent没有消费掉这个KeyEvent,会由系统来处理焦点的移动。
() 【/frameworks/base/core/java/android/internal/policy/DecorView.java】 从此开始,DecorView开始进行KeyEvent的分发...重写了父类FrameLayout的dispatchKeyEvent()方法,但不会执行 super.dispatchKeyEvent()了 //2. ...@Override public boolean dispatchKeyEvent(KeyEvent event) { final int keyCode = event.getKeyCode...()方法 就是来自Window.Callback public boolean dispatchKeyEvent(KeyEvent event) { onUserInteraction..., KeyEvent.Callback, AccessibilityEventSource { public boolean dispatchKeyEvent(KeyEvent
Android7.0 中不设置背景也是可以的,那么它的代码肯定做了处理。...View.LAYOUT_DIRECTION_INHERIT); } 重点只需要看 mDecorView = createDecorView(mBackgroundView); 可以看到不管 mBackground 变量是否为空,最终都执行了这句代码...@Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode()...super.dispatchKeyEvent(event); } if (event.getAction() == KeyEvent.ACTION_DOWN...} 从上面的代码中我们看到了KeyEvent.KEYCODE_BACK 和 MotionEvent.ACTION_OUTSIDE,没错这里有对返回键和其他事件的处理。
下面从源码(我看的是android-22)上看看到底发生了什么事情导致返回键不能消失弹出框: 先看看弹出框显示的时候代码showAsDropDown,里面有个preparePopup方法。...(KeyEvent event) { // 这个方法里面实现了返回键处理逻辑,会调用dismiss if (event.getKeyCode() == KeyEvent.KEYCODE_BACK...-1 : animStyle; a.recycle(); setBackgroundDrawable(bg); } 有些版本没有,android6.0版本preparePopup...View.LAYOUT_DIRECTION_INHERIT); mPopupWidth = p.width; mPopupHeight = p.height; } 这里实现返回键监听的代码是...mDecorView = createDecorView(mBackgroundView),这个并没有受到那个mBackground变量的控制,所以这个版本应该没有我们所描述的问题,感兴趣的可以自己去尝试一下
实现 实现的方案常用的有两个: 重写dispatchKeyEvent(KeyEvent event)方法 重写onKeyDown(int keyCode, KeyEvent event)方法 方案一...@Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK...something else System.exit(0); return true; } return false; } 代码很简单...方案二 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode ==...不支持流程图等高级功能 总的来说,基本功能都是有的,界面比较干净,这个是优点也是缺点了,相对而言,更适合把MarkDown语法熟记于心的人。 PS: 你可以关注的我Github、CSDN和微博
上一篇中我们已经一起学了怎么简单粗暴的撸个支持动态布局的网格控件出来,但在上一篇的介绍中,并没有学习实现网格控件的滑动效果,所以本篇就来讲讲,要如何让我们的网格控件可以支持自定义滑动策略。 效果 ?...那么下面就开始我们今天的内容了: 第六步:内嵌 OverScroller 自定义滑动策略 首先,我们的网格控件是继承自 FrameLayout,那么它本身就是没有支持滑动的效果的,但是我们的网格控件又需要支持多屏显示...而 Tv 应用由于都是通过遥控器事件即 KeyEvent 来进行 ui 的交互,那么,理所当然,要查看 HorizontalScrollView 的滑动原理的话,就需要跟着 dispatchKeyEvent...//HorizontalScrollView#dispatchKeyEvent() public boolean dispatchKeyEvent(KeyEvent event) { // 1....由于 Tv 应用都是通过遥控器控制,因此滑动的时机就在 dispatchKeyEvent()中进行检测就行了: @Override public boolean dispatchKeyEvent(KeyEvent
搜索,可以搜到,不过我找到一个可以知道系统所有广播的办法:我的 sdk 是1.5 的,进入sdk 主目录,然后进入platforms\android-1.5\data 目录,里面有 activity_actions.txt...从这里面我们可以找到屏幕关闭的广 播:android.intent.action.SCREEN_OFF 。...:name=".ScreenOffListener"> android:name="android.intent.action.SCREEN_OFF...可是,广播怎么都收不到。郁闷了。 换个方法!写一个activity ,在里面注册这个 BroadcastReceiver 。然后再次测试,结果。。。嘿嘿,成功收到广播。...截获键盘的代码: @Override public boolean dispatchKeyEvent(KeyEvent event) { return true; } Endcall 没必要截获,
将TabHost的标签放在底部 直接上代码 主代码: 1 package sdut; 2 3 import com.example.sdutfriends.R; 4 5 import android.app.AlertDialog...; 9 import android.os.Bundle; 10 import android.view.KeyEvent; 11 import android.view.Window; 12 import...} 68 }); 69 } 70 71 //设置 返回键的 按钮响应事件 72 @Override 73 public boolean dispatchKeyEvent...KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_BACK) 76 { 77 new...90 } 91 92 return super.dispatchKeyEvent(event); 93 } 94 } layout代码 1 <?
--openGrok可以 很快的找到所搜索的内容在整个源码中使用的地方 用一张图可以很清晰的看出各个部件的id ?...在KeyguardBottomAreaView.java中有关于按钮点击后打开相机的操作,代码目录为 \android\frameworks\base\packages\SystemUI\src\com...(KeyEvent event) { 。。。。。...//如果按键抬起,且为长按事件 if (event.getAction() == KeyEvent.ACTION_UP &&(event.getFlags() & KeyEvent.FLAG_LONG_PRESS...} return super.dispatchKeyEvent(event); 2,二级界面-----keyguardSecurity安全界面 ?
; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder...; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater...volume adjustment return super.dispatchKeyEvent(event); } else if (keyCode == KeyEvent.KEYCODE_BACK...} return true; } show(sDefaultTimeout); return super.dispatchKeyEvent...canSeekBackward(); boolean canSeekForward(); int getAudioSessionId(); } } 上面的代码
文能静坐弹吉他,武能通宵写代码 这一节内容,我们来聊聊 dispatchKeyEvent。...中的 ViewPostImeInputStage ,这个内部类的代码稍长,因为不论是触屏还是按键,都是在这里进行初始的分发处理,在此,我们只重点关注按键事件以及焦点的处理: android中,InputEvent 只有两个子类,一个是 KeyEvent 按键事件,另一个是 MotionEvent 触摸事件。...event = (KeyEvent)q.mEvent;// 获取到该按键事件信息,我们常见的 KeyCode,Acton,RepeatCount 等信息都包含在里面 // Deliver...if (mView.dispatchKeyEvent(event)) {// mView 实际上就是 DecorView,这里看到如果 dispatchKeyEvent 返回 true,会直接返回,这里的按键事件分发后面单独一篇讲解
目前Android系统中主流的音乐播放器都支持线控的功能,线控设备包括有线耳机和蓝牙耳机或蓝牙车机,当不方便操作手机的时候可以通过线控来控制音乐的播放暂停以及切歌。 ? ?...实现线控很简单,通过下面代码即可。...、KeyEvent.KEY_MEDIA_PAUSE等等;通过event.getAction()取出按键操作进行判断是何种行为,如KeyEvent.ACTION_UP、KeyEvent.ACTION_DOWN...PendingIntent.getBroadcast(mContext, 0, mediaButtonIntent, PendingIntent.FLAG_CANCEL_CURRENT); //由于非线程安全,这里要把所有的事件都放到主线程中处理...原来MediaSession本来就是存在的,并非是Android5.0后新出来的API,只不过之前都是通过RemoteControlClient进行了封装,了解了这一点后看到了一线希望,两种方法的屏显信息结构体
△ 多种 Android 设备 要知道并非所有的用户都使用手机触摸屏与您的应用交互,一部分用户可能使用的是键盘和触控笔等,甚至一部分用户有 无障碍 需求。...如果您的应用中有聊天功能、反馈表单、简报注册或任何需要发送文本的功能,那么默认的换行行为肯定不是您所期望的,不用担心的是您所预期的发送功能很容易实现。...完整代码如下所示: override fun onKeyUp(keyCode: Int, event: KeyEvent?)...完整代码如下所示: override fun onKeyDown(keyCode: Int, event: KeyEvent?)...而且这些模拟器更新的不仅是只支持使用两个手指,如果您的硬件允许,可以支持多达 10 个触摸点。 您看到的所有这些变化都不是 Surface Duo 模拟器所特有的,它们也适用于其他可折叠模拟器。
Android系统定义了一套屏幕坐标规则,该规则不仅适用于当前的屏幕交互,在后文提及的动画绘制及其他屏幕相关操作等都同样适用。...参数二android.view.KeyEvent类的实例化对象event。...这就用到在加载界面一文中启动Activity所使用的android.content.Intent意图类了。...在打包所有的数据后,就可以在当前界面Activity中继续调用startActivity(Intent intent)系列方法启动Intent意图参数中指定的另一界面Activity了。...参数二是根据启动界面不同关闭状态所返回的结果值,默认为android.app.Activity.RESULT_CANCELED,另外也可以为android.app.Activity.RESULT_FIRST_USER
此外,SCREEN_OFF广播监听必须是动态注册的,如果在AndroidManifest.xml中静态注册将无法接收到SCREEN_OFF广播,这点在Android官方文档中有明确说明,即需要通过如下代码注册...(keyCode, event); } Home键与Recent键(调出最近打开应用的按键)的点击事件是在framework层进行处理的,因此onKeyDown与dispatchKeyEvent都捕获不到点击事件...关于这两个按键的屏蔽方法,网上相关的资料有很多,有的用到了反射,有的通过改变Window的标志位和Type等,总的来说这些方法只对部分android版本有效,有的则完全无法编译通过。...Android 4.4 之后加入的Immersive Full-Screen Mode 允许用户在应用全屏的情况下,通过在原有的状态栏/导航栏区域内做向内滑动的手势来实现短暂调出状态栏和导航栏的操作,且不会影响应用的正常全屏...这个“半透明化”包括了状态栏和通知栏,当开发者让应用支持这个新特性的时候,状态栏和导航栏可以单独/同时变为渐变的半透明样式,如下图: ?
在我们平时的软件开发中,仅靠系统提供的那些组件来实现界面是远远不够的,在很多情况下我们都需要自己来绘制软件界面。在本章中我们就将学习Android中和绘制图形及位图显示和效果有关的知识。 ...Android SDK提供了对基本图形以及位图的绘制,所有的绘图操作通常都是在View类的onDraw()方法中进行的。...一般情况下,应用程序的组件都是在相同的GUI线程中绘制的,这个主应用程序线程同时也用来处理所有的用户交互(例如,按钮单击或者文本输入)操作。...程序运行效果如下图1.1.6所示。 1.2.2 改变图像透明度 Android系统支持的颜色由RGB三原色(红、绿、蓝)再加上一个Alpha四个值组成。...SurfaceView封装的Surface支持使用所有标准Canvas方法进行绘图,同时也完全支持的OpenGL ES库。
//在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。...; import android.util.Log; import android.view.KeyEvent; import android.webkit.GeolocationPermissions...; import android.util.Log; import android.view.KeyEvent; import android.webkit.GeolocationPermissions...//在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。...; import android.util.Log; import android.view.KeyEvent; import android.webkit.GeolocationPermissions
基本逻辑就是:定义一个BaseActivity,在这个Activity中绑定广播,在广播的onReceive方法中调用finish();然后以后的Activity都继承这个Activity,退出时发送广播...,退出BaseActivity,父activity都退出了,子activity肯定退出。...代码如下: import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent...import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.Toast...SysApplication.getInstance().addActivity(this); btn = (Button) findViewById(R.id.acticityc_btn); //关闭所有的
领取专属 10元无门槛券
手把手带您无忧上云