C语言,C语言源代码到底是什么意思?Android TV 焦点原理源码解析
本文目录
C语言,C语言源代码到底是什么意思
现在的教学流程有问题
要是我肯定先拿一个可以正常运行的hello world来一边改
一边讲解
然后写个猜数字 控制台程序
接下来用MFC给他写个界面
让大家知道学习这些算法到底有什么用
再往后,我可能会一直教界面编程
直到你们感觉到自己的算法需要深入学习
然后再回过头去学算法
别用什么垃圾TC了,这都什么年代了
新手建议VC6即可,又可以学算法
也能开发MFC界面程序 对电脑配置要求也不搞
甚至绿色精简版就能用
然后写一些游戏相关的工具 或者网络相关的工具
不怕不懂,这样至少知道缺什么知识,然后去学
我最讨厌学一大堆,也不知道有什么用的
提不起兴趣,也没有积极主动性
我写的网游服务器在线人数实时显示。。。。
还有游戏辅助没写完 这里不能上图了,要是上那个估计会被删除回答
Android TV 焦点原理源码解析
相信很多刚接触AndroidTV开发的开发者,都会被各种焦点问题给折磨的不行。不管是学技术还是学习其他知识,都要学习和理解其中原理,碰到问题我们才能得心应手。下面就来探一探Android的焦点分发的过程。
Android焦点事件的分发是从ViewRootImpl的processKeyEvent开始的,源码如下:
源码比较长,下面我就慢慢来讲解一下具体的每一个细节。
dispatchKeyEvent方法返回true代表焦点事件被消费了。
ViewGroup的dispatchKeyEvent()方法的源码如下:
(2)ViewGroup的dispatchKeyEvent执行流程
(3)下面再来瞧瞧view的dispatchKeyEvent方法的具体的执行过程
惊奇的发现执行了onKeyListener中的onKey方法,如果onKey方法返回true,那么dispatchKeyEvent方法也会返回true
可以得出结论:如果想要修改ViewGroup焦点事件的分发,可以这么干:
注意:实际开发中,理论上所有焦点问题都可以通过给dispatchKeyEvent方法增加监听来来拦截来控制。
(1)dispatchKeyEvent方法返回false后,先得到按键的方向direction值,这个值是一个int类型参数。这个direction值是后面来进行焦点查找的。
(2)接着会调用DecorView的findFocus()方法一层一层往下查找已经获取焦点的子View。 ViewGroup的findFocus方法如下:
View的findFocus方法
说明:判断view是否获取焦点的isFocused()方法, (mPrivateFlags & PFLAG_FOCUSED) != 0 和view 的isFocused()方法是一致的。
其中isFocused()方法的作用是判断view是否已经获取焦点,如果viewGroup已经获取到了焦点,那么返回本身即可,否则通过mFocused的findFocus()方法来找焦点。mFocused其实就是ViewGroup中获取焦点的子view,如果mView不是ViewGourp的话,findFocus其实就是判断本身是否已经获取焦点,如果已经获取焦点了,返回本身。
(3)回到processKeyEvent方法中,如果findFocus方法返回的mFocused不为空,说明找到了当前获取焦点的view(mFocused),接着focusSearch会把direction(遥控器按键按下的方向)作为参数,找到特定方向下一个将要获取焦点的view,最后如果该view不为空,那么就让该view获取焦点。
(4)focusSearch方法的具体实现。
focusSearch方法的源码如下:
可以看出focusSearch其实是一层一层地网上调用父View的focusSearch方法,直到当前view是根布局(isRootNamespace()方法),通过注释可以知道focusSearch最终会调用DecorView的focusSearch方法。而DecorView的focusSearch方法找到的焦点view是通过FocusFinder来找到的。
(5)FocusFinder是什么?
它其实是一个实现 根据给定的按键方向,通过当前的获取焦点的View,查找下一个获取焦点的view这样算法的类。焦点没有被拦截的情况下,Android框架焦点的查找最终都是通过FocusFinder类来实现的。
(6)FocusFinder是如何通过findNextFocus方法寻找焦点的。
下面就来看看FocusFinder类是如何通过findNextFocus来找焦点的。一层一层往下看,后面会执行findNextUserSpecifiedFocus()方法,这个方法会执行focused(即当前获取焦点的View)的findUserSetNextFocus方法,如果该方法返回的View不为空,且isFocusable = true && isInTouchMode() = true的话,FocusFinder找到的焦点就是findNextUserSpecifiedFocus()返回的View。
(7)findNextFocus会优先根据XML里设置的下一个将获取焦点的View ID值来寻找将要获取焦点的View。
看看View的findUserSetNextFocus方法内部都干了些什么,OMG不就是通过我们xml布局里设置的nextFocusLeft,nextFocusRight的viewId来找焦点吗,如果按下Left键,那么便会通过nextFocusLeft值里的View Id值去找下一个获取焦点的View。
可以得出以下结论:
1. 如果一个View在XML布局中设置了focusable = true && isInTouchMode = true,那么这个View会优先获取焦点。
2. 通过设置nextFocusLeft,nextFocusRight,nextFocusUp,nextFocusDown值可以控制View的下一个焦点。
Android焦点的原理实现就这些。总结一下:
为了方便同志们学习,我这做了张导图,方便大家理解~
HRNet 源代码结构详解
HRNet 主要的模型结构,具体实现部分在 HighResolutionNet 类中有详细定义。 总体结构 按照顺序 可分为三部分: 具备 pretrain 模型的,可用模型结构: yaml 文件中,关于模型结构的关键部分,以 hrnet_w48 为例 HRNet 类定义,通过 config 指定的模型结构,实例化特定结构的模型,构建过程如下 transition layer 完成 stage 之间连接需要的 两种转换 以下为 hrnet_w48 的 transition 具体结构 stage1 产生 1/4 feature map,没有 branch 分支结构,采用与 resnet 完成一样的 _make_layer() 函数构建层 stage 2/3/4 为 HRNet 核心结构,用到了 HighResolutionModule ,内含 branch 构建和 特征 fuse 模块 实现下图红框中的,branch 并行 多 scale 特征提取 和 末端将 多 scale 特征通过 upsample/downsample 方式融合 上图红框中,每个横向的串行结构,如第1个红框 stage2 内,有2个横向的串行结构;由 num_blocks 决定串行 block 使用个数 根据 stage cfg 中指定的 branch 数量,构建多个并行的 branch,调用之前的 _make_one_branch() ,如 stage 2/3/4 各有 2/3/4 个 branches HighResolutionModule 末尾的特征融合层 以下图红框即 stage3 中 蓝色 branch 输出结果为例,其输出结果要转换成 4 种尺度的特征,用于每个 branch 末尾的特征融合
iOS源码解析—YYModel(NSObject+YYModel)
iOS源码解析—YYModel(YYClassInfo) 分析了如何根据OC的Class对象构建YYClassInfo对象,为接下来的JSON数据和Model转换作准备,这篇文章开始讲解NSObject+YYModel。 分析NSObject+YYModel.h文件,包括3个Category和一个protocol,分别是: 字典studentDic中的key对应原字典playerDic中的key,studentDic中的Model由playerDic中的value转化得到。 首先定义了两个类,_YYModelMeta和_YYModelPropertyMeta,分别封装了Model的信息和Model中各属性的信息。 _YYModelMeta维护了Class的相关信息,下面是注释: _YYModelMeta是通过YYClassInfo对象的信息构建得到的。首先调用metaWithClass:cls方法,该方法如下: 维护了一个键值对cache作为缓存,用cls作为key,调用CFDictionaryGetValue方法去缓存中查找,如果有,直接返回构建好的_____YYModelMeta对象,如果没有找到或者needUpdate属性标记为true,则根据cls创建一个新的_YYModelMeta对象,并且存入缓存。这样不需要每次都创建,提高了性能。 接下来看一下initWithClass:方法, 下面分析几个重要的方法: YYModel的总体思想是以Model属性的类型为准,如果JSON中对应名称的value的类型和Model属性类型不一致,会对value的类型进行转化,保证和Model属性的类型一致。如果兼容不了,不进行属性赋值。下面分析一下ModelSetValueForProperty方法: 该方法上文中提到该方法是用来JSON转成Model的过程中对Model中的属性进行赋值的方法,该方法做了部分基本类型的兼容: YYModel还提供了一些工具方法,下面简单分析一下: YYModel作为一个负责JSON数据和Model转化的库,十分易用和高效,特别是做了一些类型的兼容和转化,避免了服务端接口数据类型和客户端Model对象类型不兼容导致的问题,例如执行了不存在的方法而导致崩溃。另一方面,对YYModel的学习在一定程度也促进了对runtime机制的学习和了解。 关于YYModel的分析到这儿先告一段落,由于本人的iOS基础有待提升,再加上表达能力有限,文中许多地方的分析和思路,表达的不是很准确和清楚,希望通过今后的学习和练习,提升自己的水平。
更多文章:
nba2k14霍华德面补(nba2k14mc模式怎么打面补)
2024年6月28日 10:51
最近发现越来越多的人在学原画梦的课程,为什么会这么火,他们的课程好在哪?原画梦和涂鸦王国有什么区别
2024年7月22日 22:33
交管12123手机app下载(交管12123下载二维码在哪,12123交管官网下载app123在哪)
2024年5月19日 11:04
卧龙传说下载(有没有类似于炉石传说的手机游戏另外画质最好好点)
2024年3月12日 01:45
nba2k19手机中文版下载(NBA2K19手游在哪里可以下到啊)
2024年7月17日 11:57