相关性分析分页怎么算offsett多少算ok

correlation 测量相关性模板_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
correlation 测量相关性模板
&&测量尺寸分析表格
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢javascript的offset、client、scroll使用方法详解
字体:[ ] 类型:转载 时间:
javascript的offset、client、scroll在使用过程中非常频繁,接下来将对此进行一一介绍,需要了解的朋友可以详细参考下
&offsetTop 指元素距离上方或上层控件的位置,整型,单位像素。 offsetLeft 指元素距离左方或上层控件的位置,整型,单位像素。 offsetWidth 指元素控件自身的宽度,整型,单位像素。 offsetHeight 指元素控件自身的高度,整型,单位像素。 网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWidth (包括边线的宽) 网页可见区域高:document.body.offsetHeight (包括边线的宽) 网页正文全文宽:document.body.scrollWidth 网页正文全文高:document.body.scrollHeight 网页被卷去的高:document.body.scrollTop 网页被卷去的左:document.body.scrollLeft 网页正文部分上:window.screenTop 网页正文部分左:window.screenLeft 屏幕分辨率的高:window.screen.height 屏幕分辨率的宽:window.screen.width 屏幕可用工作区高度:window.screen.availHeight 屏幕可用工作区宽度:window.screen.availWidth 这里说说四种浏览器对 document.body 的 clientHeight、offsetHeight 和 scrollHeight 的解释。 这四种浏览器分别为IE(Internet Explorer)、NS(Netscape)、Opera、FF(FireFox)。 clientHeight 四种浏览器对 clientHeight 的解释都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个工具条以下到状态栏以上的这个区域,与页面内容无关。 offsetHeight IE、Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框。 NS、FF 认为 offsetHeight 是网页内容实际高度,可以小于 clientHeight。 scrollHeight IE、Opera 认为 scrollHeight 是网页内容实际高度,可以小于 clientHeight。 NS、FF 认为 scrollHeight 是网页内容高度,不过最小值是 clientHeight 介绍: 1、offsetLeft 假设 obj 为某个 HTML 控件。 obj.offsetTop 指 obj 距离上方或上层控件的位置,整型,单位像素。 obj.offsetLeft 指 obj 距离左方或上层控件的位置,整型,单位像素。 obj.offsetWidth 指 obj 控件自身的宽度,整型,单位像素。 obj.offsetHeight 指 obj 控件自身的高度,整型,单位像素。 我们对前面提到的“上方或上层”与“左方或上层”控件作个说明。 例如: &div id="tool"& &input type="button" value="提交"& &input type="button" value="重置"& &/div& “提交”按钮的 offsetTop 指“提交”按钮距“tool”层上边框的距离,因为距其上边最近的是 “tool” 层的上边框。 “重置”按钮的 offsetTop 指“重置”按钮距“tool”层上边框的距离,因为距其上边最近的是 “tool” 层的上边框。 “提交”按钮的 offsetLeft 指“提交”按钮距“tool”层左边框的距离,因为距其左边最近的是 “tool” 层的左边框。 “重置”按钮的 offsetLeft 指“重置”按钮距“提交”按钮右边框的距离,因为距其左边最近的是“提交”按钮的右边框。 以上属性在 FireFox 中也有效。 另 外:我们这里所说的是指 HTML 控件的属性值,并不是 document.body,document.body 的值在不同浏览器中有不同解释(实际上大多数环境是由于对 document.body 解释不同造成的,并不是由于对 offset 解释不同造成的),点击这里查看不同点。 标题:offsetTop 与 style.top 的区别 预备知识:offsetTop、offsetLeft、offsetWidth、offsetHeight 我们知道 offsetTop 可以获得 HTML 元素距离上方或外层元素的位置,style.top 也是可以的,二者的区别是: 一、offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px。 二、offsetTop 只读,而 style.top 可读写。 三、如果没有给 HTML 元素指定过 top 样式,则 style.top 返回的是空字符串。 offsetLeft 与 style.left、offsetWidth 与 style.width、offsetHeight 与 style.height 也是同样道理。 标题:clientHeight、offsetHeight和scrollHeight 我们这里说说四种浏览器对 document.body 的 clientHeight、offsetHeight 和 scrollHeight 的解释,这里说的是 document.body,如果是 HTML 控件,则又有不同,点击这里查看。 这四种浏览器分别为IE(Internet Explorer)、NS(Netscape)、Opera、FF(FireFox)。 2、clientHeight clientHeight 大家对 clientHeight 都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个工具条以下到状态栏以上的这个区域,与页面内容无关。 offsetHeight IE、Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框。 NS、FF 认为 offsetHeight 是网页内容实际高度,可以小于 clientHeight。 scrollHeight IE、Opera 认为 scrollHeight 是网页内容实际高度,可以小于 clientHeight。 NS、FF 认为 scrollHeight 是网页内容高度,不过最小值是 clientHeight。 简单地说 clientHeight 就是透过浏览器看内容的这个区域高度。 NS、 FF 认为 offsetHeight 和 scrollHeight 都是网页内容高度,只不过当网页内容高度小于等于 clientHeight 时,scrollHeight 的值是 clientHeight,而 offsetHeight 可以小于 clientHeight。 IE、Opera 认为 offsetHeight 是可视区域 clientHeight 滚动条加边框。scrollHeight 则是网页内容实际高度。 同理 clientWidth、offsetWidth 和 scrollWidth 的解释与上面相同,只是把高度换成宽度即可。 但是 FF 在不同的 DOCTYPE 中对 clientHeight 的解释不同, xhtml 1 trasitional 中则不是如上解释的。其它浏览器则不存在此问题。 标题:scrollTop、scrollLeft、scrollWidth、scrollHeight 3、scrollLeft scrollTop 是“卷”起来的高度值,示例: &div class="width:100height:100background-color:#FF0000;overflow:" id="p"& &div class="width:50height:300background-color:#0000FF;" id="t"&如果为 p 设置了 scrollTop,这些内容可能不会完全显示。&/div& &/div& &script type="text/javascript"& var p = document.getElementById("p"); p.scrollTop = 10; &/script& 由于为外层元素 p 设置了 scrollTop,所以内层元素会向上卷。 scrollLeft 也是类似道理。 我们已经知道 offsetHeight 是自身元素的宽度。 而 scrollHeight 是内部元素的绝对宽度,包含内部元素的隐藏的部分。 上述中 p 的 scrollHeight 为 300,而 p 的 offsetHeight 为 100。 scrollWidth 也是类似道理。 IE 和 FireFox 全面支持,而 Netscape 和 Opera 不支持 scrollTop、scrollLeft(document.body 除外)。 标题:offsetTop、offsetLeft、offsetWidth、offsetHeight 4、clientLeft 返回对象的offsetLeft属性值和到当前窗口左边的真实值之间的距离,可以理解为边框的长度 一直以来对offsetLeft,offsetTop,scrollLeft,scrollTop这几个方法很迷糊,花了一天的时间好好的学习了一下.得出了以下的结果: 1.offsetTop : 当前对象到其上级层顶部的距离. 不能对其进行赋值.设置对象到页面顶部的距离请用style.top属性. 2.offsetLeft : 当前对象到其上级层左边的距离. 不能对其进行赋值.设置对象到页面左部的距离请用style.left属性. 3.offsetWidth : 当前对象的宽度. 与style.width属性的区别在于:如对象的宽度设定值为百分比宽度,则无论页面变大还是变小,style.width都返回此百分比,而offsetWidth则返回在不同页面中对象的宽度值而不是百分比值 4.offsetHeight : 与style.height属性的区别在于:如对象的宽度设定值为百分比高度,则无论页面变大还是变小,style.height都返回此百分比,而offsetHeight则返回在不同页面中对象的高度值而不是百分比值 5.offsetParent : 当前对象的上级层对象. 注意.如果对象是包括在一个DIV中时,此DIV不会被当做是此对象的上级层,(即对象的上级层会跳过DIV对象)上级层是Table时则不会有问题. 利用这个属性,可以得到当前对象在不同大小的页面中的绝对位置. 得到绝对位置脚本代码
代码如下:function GetPosition(obj) { var left = 0; var top = 0; while(obj != document.body) { left = obj.offsetL top = obj.offsetT obj = obj.offsetP } alert("Left Is : " + left + "\r\n" + "Top Is : " + top); } 6.scrollLeft : 对象的最左边到对象在当前窗口显示的范围内的左边的距离. 即是在出现了横向滚动条的情况下,滚动条拉动的距离. 7.scrollTop 对象的最顶部到对象在当前窗口显示的范围内的顶边的距离. 即是在出现了纵向滚动条的情况下,滚动条拉动的距离. 我们这里说说四种浏览器对 document.body 的 clientHeight、offsetHeight 和 scrollHeight 的解释,这里说的是 document.body,如果是 HTML 控件,则又有不同,点击这里查看。 这四种浏览器分别为IE(Internet Explorer)、NS(Netscape)、Opera、FF(FireFox)。 clientHeight 大家对 clientHeight 都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个工具条以下到状态栏以上的这个区域,与页面内容无关。 offsetHeight IE、Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框。 NS、FF 认为 offsetHeight 是网页内容实际高度,可以小于 clientHeight。 scrollHeight IE、Opera 认为 scrollHeight 是网页内容实际高度,可以小于 clientHeight。 NS、FF 认为 scrollHeight 是网页内容高度,不过最小值是 clientHeight。 简单地说 clientHeight 就是透过浏览器看内容的这个区域高度。 NS、 FF 认为 offsetHeight 和 scrollHeight 都是网页内容高度,只不过当网页内容高度小于等于 clientHeight 时,scrollHeight 的值是 clientHeight,而 offsetHeight 可以小于 clientHeight。 IE、Opera 认为 offsetHeight 是可视区域 clientHeight 滚动条加
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具  很多初学者对于JavaScript中的offset、scroll、client一直弄不明白,虽然网上到处都可以看一张图(图1),但这张图太多太杂,并且由于浏览器差异性,图示也不完全正确。
  不知道大家看到这张图的第一感觉如何,反正我的感觉就是&这次第,怎一个乱字了得&。
  既然我认为上图太多太乱,那么我就把offset、scroll、client分开说,希望能让大家彻底弄清楚,今天只说offset。
一、关于offset,我们要弄明白什么
  w3中offset相关页面是:
  在这里我们可以看到,关于offset共有5个东西需要弄清楚:
  1、offsetParent
  2、offsetTop
  3、offsetLeft
  4、offsetWidth
  5、offsetHeight
  我们根据难易程度把以上5点分为三类来讲解。
  在分析之前,先来看段测试代码:
&style type="text/css"&
border:20px solid #CCC;
margin:10px;
padding:40px;
background:#EEE;
width:<span style="background-color: #f5f5f5; color: #px;
height:<span style="background-color: #f5f5f5; color: #px;
padding:20px;
background:#F60;
border:5px solid #888;
&div id="test"&&/div&
var test = document.getElementById("test");
test.innerHTML = "&p&Browser:" + navigator.userAgent + "&/p&" +
"&p&offsetWidth:" + test.offsetWidth + "&/p&" +
"&p&offsetHeight:"+test.offsetHeight+"&/p&"+
"&p&offsetLeft:"+test.offsetLeft+"&/p&"+
"&p&offsetTop:"+test.offsetTop+"&/p&";
  这段代码在各个浏览器中的效果如图:
图二(IE6/7)
图三(IE8/9/10)
图四(Firefox)
图五(Chrome)
二、offsetWidth与offsetHeight
  大家可以看到,上面图二~图五中的共同点是 offsetWidth与offsetHeight是一致的,因此这里放到地起讲。
  中对的概述和描述是:
Returns the layout width of an element.
Typically, an element's offsetWidth is a measurement which includes the element borders, the element horizontal padding, the element vertical scrollbar (if present, if rendered) and the element CSS width.
  也就是元素的可视宽度,这个宽度包括元素的边框(border),水平padding,垂直滚动条宽度,元素本身宽度等。
  offsetHeight跟offsetWidth类似,只是方向改为垂直方向上的。
  只是我们的示例中没有水平和垂直滚动条。另外经过测试可以发现,即使元素加上水平或垂直滚动条,offsetWidth跟offsetHeight的值是不会更改的,因为浏览器渲染时把滚动条的宽度(或高度)算在了元素本身的宽度(或高度)中了。
  通过代码及图中数值,我们不难看出:
  offsetWidth=(border-width)*2+(padding-left)+(width)+(padding-right)
  offsetHeight=(border-width)*2+(padding-top)+(height)+(padding-bottom)
  对这两个概念就总结到这里,大家现在弄明白了吗?
三、offsetLeft与offsetTop
  offsetWidth与offsetHeight有个特点,就是这两个属性的值只与该元素有关,与周围元素(父级和子级元素无关)。
  然而,offsetLeft与offsetTop却不是这样,这两个属性与offsetParent有关,但在我们讲到offsetParent之前,我们先不管offsetParent是什么及怎么判断,我们只要知道offsetLeft和offsetTop与offsetParent有关就行了,上面的示例中offsetParent就是body。
  MSDN上对offsetLeft的定义是:
Retrieves the calculated left position of the object relative to the layout or coordinate parent, as specified by the offsetParent property
  也就是返回对象元素边界的左上角顶点相对于offsetParent的左上角顶点的水平偏移量。从这个定义中我们可以明确地知道offsetLeft与当前元素的margin-left和offsetParent的padding-left有关。也就是说应该是:
  offsetLeft=(offsetParent的padding-left)+(中间元素的offsetWidth)+(当前元素的margin-left)。
  offsetTop=(offsetParent的padding-top)+(中间元素的offsetHeight)+(当前元素的margin-top)。
  但通过上面的例子我们可以看到,当offsetParent为body时,对于offsetLeft与offsetTop的值有三种,分别是:IE6/7中的40,IE8/9/10 和 Chrome中的70,以及FireFox中的50。
  通过这些数值我们可以知道,当offsetParent为body时情况比较特殊:
  在IE8/9/10及Chrome中,offsetLeft = (body的margin-left)+(body的border-width)+(body的padding-left)+(当前元素的margin-left)。
  在FireFox中,offsetLeft = (body的margin-left)+(body的padding-left)+(当前元素的margin-left)。
四、offsetParent
  终于到offsetParent了。
  offsetParent属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素。 如果这个容器元素未进行CSS定位, 则offsetParent属性的取值为根元素的引用。
  总的来说两条规则:
  1、如果当前元素的父级元素没有进行CSS定位(position为absolute或relative),offsetParent为body。
  2、如果当前元素的父级元素中有CSS定位(position为absolute或relative),offsetParent取最近的那个父级元素。
  上面的示例就是第1条说的情况,我们来验证一下:
  我们把JS改为(添加了一行代码:红色部分):
var test = document.getElementById("test");
test.innerHTML = "&p&Browser:" + navigator.userAgent + "&/p&" +
"&p&offsetParent:" + test.offsetParent.tagName + "&/p&" +
"&p&offsetWidth:" + test.offsetWidth + "&/p&" +
"&p&offsetHeight:"+test.offsetHeight+"&/p&"+
"&p&offsetLeft:"+test.offsetLeft+"&/p&"+
"&p&offsetTop:"+test.offsetTop+"&/p&";
  FireFox下的效果为:
  在其他浏览器中效果相同,都是body。
  我们再来验证一下第2条,测试HTML如下:
&!DOCTYPE html&
&title&Demo&/title&
&style type="text/css"&
padding:0;
background:#EEE;
div,ul,li {
height:20px;
line-height:20px;
width:<span style="background-color: #f5f5f5; color: #px;
height:<span style="background-color: #f5f5f5; color: #px;
padding:20px;
background:#F60;
border:10px solid #888;
#divtest {
margin:30px;
position:relative;
left:50px;
padding:20px;
&div id="divtest"&
&li&Test&/li&
&li&Test&/li&
&div id="test"&
var test = document.getElementById("test");
test.innerHTML = "&p&Browser:" + navigator.userAgent + "&/p&" +
"&p&offsetParent:" + test.offsetParent.tagName + "&/p&" +
"&p&offsetWidth:" + test.offsetWidth + "&/p&" +
"&p&offsetHeight:"+test.offsetHeight+"&/p&"+
"&p&offsetLeft:"+test.offsetLeft+"&/p&"+
"&p&offsetTop:"+test.offsetTop+"&/p&";
  在FireFox中效果为:
  在其他浏览器中offsetParent也是一致的。
  在这里我们也可以看到,第三点中给出的offsetLeft的计算公式是适用的。
  以上的总结希望能对大家有所帮助,在看完本文内容后再回过头来看文章开头部分的那张图(只看offset)部分,是不是清楚了很多?
  最后,对于offsetParent为body的情况,现在的主流浏览器IE8/9/10和Chrome及Firefox都跟定义
&&&&& offsetLeft=(offsetParent的padding-left)+(中间元素的offsetWidth)+(当前元素的margin-left)。
  offsetTop=(offsetParent的padding-top)+(中间元素的offsetHeight)+(当前元素的margin-top)。
  的不一样,对于这一点我也没有弄明白,如果有朋友知道请不吝赐教。
阅读(...) 评论()[Android学习笔记]理解焦点处理原理的相关记录
焦点处理相关记录
以下所涉及的焦点部分,只是按键移动部分,不明确包含Touch Focus部分
需解决问题
控件的下一个焦点是哪?
当用户通过按键(遥控器等)触发焦点切换时,事件指令会通过底层进行一系列处理。 在ViewRootImpl.java中有一个方法,deliverKeyEventPostIme(...),因为涉及到底层代码,所以没有详细的跟踪分析此方法的调用逻辑,根据网上的资料,按键相关的处理会经过此方法。
private void deliverKeyEventPostIme(QueuedInputEvent q) {
& & // Handle automatic focus changes.
& & if (event.getAction() == KeyEvent.ACTION_DOWN) {
& & & & int direction = 0;
& & & & switch (event.getKeyCode()) {
& & & & & & case KeyEvent.KEYCODE_DPAD_LEFT:
& & & & & & & & if (event.hasNoModifiers()) {
& & & & & & & & & & direction = View.FOCUS_LEFT;
& & & & & & & & }
& & & & & & & &
& & & & & & case KeyEvent.KEYCODE_DPAD_RIGHT:
& & & & & & & & if (event.hasNoModifiers()) {
& & & & & & & & & & direction = View.FOCUS_RIGHT;
& & & & & & & & }
& & & & & & & &
& & & & & & ...
& & & & if (direction != 0) {
& & & & & & View focused = mView.findFocus();
& & & & & & if (focused != null) {
& & & & & & & & View v = focused.focusSearch(direction);
& & & & & & & & if (v != null && v != focused) {
& & & & & & & & & &.....
& & & & & & & & & & if (v.requestFocus(direction, mTempRect)) {
& & & & & & & & & & & & ...finishInputEvent(q, true);
& & & & & & & & & & & &
& & & & & & & & & & }
& & & & & & & & }
& & & & & & & & ...
& & & & & & }
由此方法可以看出,最主要的两个核心过程:
View v = focused.focusSearch(direction);
v.requestFocus(direction, mTempRect)
接下来详细的分析下,看看过程中进行了什么操作
在具体分析前,首先我们先明确下相关变量的定义
View mView : 主体View[DecorView]
//一般把主View&DecorView&添加到WindowManagerImpl中(通过addView)
//WindowManagerImpl.java
& & private void addView(View view...) {
& & & & ViewRootI
& & & & root = new ViewRootImpl(view.getContext());
& & & & ...
& & & & root.setView(view, wparams, panelParentView);
& & & & ...
//ViewRootImpl.java
public void setView(View view....) {
& & synchronized (this) {
& & & & if (mView == null) {
& & & & & & mView =
& & & & & & ...
所以mView是一个DecorView类型的变量.
View focused :
& & View focused = mView.findFocus();&br&
& & //PhoneWindow.java
& & private final class DecorView extends FrameLayout implements RootVie.... {
& & & & ...
& & //FrameLayout.java
& & public class FrameLayout extends ViewGroup {
& & & & ...
& & //ViewGroup.java
& & //mFocused记录的是当前被焦点选中的view
& & @Override
& & public View findFocus() {
& & if (DBG) {
& & & & System.out.println(&Find focus in & + this + &: flags=&
& & & & & & & & + isFocused() + &, child=& + mFocused);
& & if (isFocused()) {
& & if (mFocused != null) {
& & & & return mFocused.findFocus();
所以最终得到的focused为当前页面中得到焦点的view.
在明确的相关变量后,我们开始View v = focused.focusSearch(direction)的具体分析.
//View.java
public View focusSearch(int direction) {
//如果存在父控件,则执行父控件的focusSearch方法
& &if (mParent != null) {
& & & & &return mParent.focusSearch(this, direction);
& & &} else {
&//ViewGroup.java
&public View focusSearch(View focused, int direction) {
& & &//判断是否为顶层布局,若是则执行对应方法,若不是则继续向上寻找,说明会从内到外的一层层进行判断,直到最外层的布局为止
& & &if (isRootNamespace()) {
& & & & &return FocusFinder.getInstance().findNextFocus(this, focused, direction);
& & &} else if (mParent != null) {
& & & & &return mParent.focusSearch(focused, direction);
说明在这个过程中,其实是从里层开始一直遍历到最外层布局,然后在最外层布局将处理交给了FocusFinder中的方法.
FocusFinder.getInstance().findNextFocus(this, focused, direction);
那我们来看看此方法具体做了什么操作
//FocusFinder.java
public final View findNextFocus(ViewGroup root, View focused, int direction) {
& & return findNextFocus(root, focused, null, direction);
//FocusFinder.java
private View findNextFocus(ViewGroup root, View focused, Rect focusedRect, int direction) {
& & View next =
& & if (focused != null) {
& & & & next = findNextUserSpecifiedFocus(root, focused, direction);
& & if (next != null) {
& & ArrayList&View& focusables = mTempL
& & & & focusables.clear();
& & & & root.addFocusables(focusables, direction);
& & & & if (!focusables.isEmpty()) {
& & & & & & next = findNextFocus(root, focused, focusedRect, direction, focusables);
& & } finally {
& & & & focusables.clear();
发现在findNextFocus的执行过程的开始,先执行了findNextUserSpecifiedFocus(...)方法,由代码可以看出,此方法先去判断特定Id值是否存在,若存在则查询出Id对应的view.其实这些Id就是xml里通过android:nextFocusUp=&...&等或者代码特别指定的焦点顺序.所以在此过程先判断,若存在,说明下个焦点已经找到,直接返回.
//FocusFinder.java
private View findNextUserSpecifiedFocus(ViewGroup root, View focused, int direction) {
& & // check for user specified next focus
& & View userSetNextFocus = focused.findUserSetNextFocus(root, direction);
& & if (userSetNextFocus != null && userSetNextFocus.isFocusable()
& & & & & & && (!userSetNextFocus.isInTouchMode()
& & & & & & & & & & || userSetNextFocus.isFocusableInTouchMode())) {
& & & & return userSetNextF
//View.java
View findUserSetNextFocus(View root, int direction) {
& & switch (direction) {
& & & & case FOCUS_LEFT:
& & & & & & if (mNextFocusLeftId == View.NO_ID)
& & & & & & return findViewInsideOutShouldExist(root, mNextFocusLeftId);
& & & & case FOCUS_RIGHT:
& & & & & & if (mNextFocusRightId == View.NO_ID)
& & & & & & return findViewInsideOutShouldExist(root, mNextFocusRightId);
& & & & case FOCUS_UP:
& & & & & & if (mNextFocusUpId == View.NO_ID)
& & & & & & return findViewInsideOutShouldExist(root, mNextFocusUpId);
& & & & case FOCUS_DOWN:
& & & & & & if (mNextFocusDownId == View.NO_ID)
& & & & & & return findViewInsideOutShouldExist(root, mNextFocusDownId);
& & & & case FOCUS_FORWARD:
& & & & & & if (mNextFocusForwardId == View.NO_ID)
& & & & & & return findViewInsideOutShouldExist(root, mNextFocusForwardId);
& & & & case FOCUS_BACKWARD: {
& & & & & & if (mID == View.NO_ID)
& & & & & & final int id = mID;
& & & & & & return root.findViewByPredicateInsideOut(this, new Predicate&View&() {
& & & & & & & & @Override
& & & & & & & & public boolean apply(View t) {
& & & & & & & & & & return t.mNextFocusForwardId ==
& & & & & & & & }
& & & & & & });
如果上面过程没有查询到,则会执行到findNextFocus(...)方法.在这个方法中,先通过offsetDescendantRectToMyCoords(...)方法获得焦点控件的位置矩阵.然后通过比较得到下一个焦点的控件。具体的比较规则可以查看findNextFocusInRelativeDirection(...)方法与findNextFocusInAbsoluteDirection(...)方法.
//FocusFinder.java
private View findNextFocus(ViewGroup root, View focused, Rect focusedRect,
& & & & int direction, ArrayList&View& focusables) {
& & if (focused != null) {
& & & & if (focusedRect == null) {
& & & & & & focusedRect = mFocusedR
& & & & // fill in interesting rect from focused
& & & & focused.getFocusedRect(focusedRect);
& & & & root.offsetDescendantRectToMyCoords(focused, focusedRect);
& & } else {
& & & & if (focusedRect == null) {
& & & & & & focusedRect = mFocusedR
& & & & & & // make up a rect at top left or bottom right of root
& & & & & & switch (direction) {
& & & & & & & & case View.FOCUS_RIGHT:
& & & & & & & & case View.FOCUS_DOWN:
& & & & & & & & & & setFocusTopLeft(root, focusedRect);
& & & & & & & & & &
& & & & & & & & case View.FOCUS_FORWARD:
& & & & & & & & & & if (root.isLayoutRtl()) {
& & & & & & & & & & & & setFocusBottomRight(root, focusedRect);
& & & & & & & & & & } else {
& & & & & & & & & & & & setFocusTopLeft(root, focusedRect);
& & & & & & & & & & }
& & & & & & & & & &
& & & & & & & & case View.FOCUS_LEFT:
& & & & & & & & case View.FOCUS_UP:
& & & & & & & & & & setFocusBottomRight(root, focusedRect);
& & & & & & & & & &
& & & & & & & & case View.FOCUS_BACKWARD:
& & & & & & & & & & if (root.isLayoutRtl()) {
& & & & & & & & & & & & setFocusTopLeft(root, focusedRect);
& & & & & & & & & & } else {
& & & & & & & & & & & & setFocusBottomRight(root, focusedRect);
& & & & & & & & & &
& & & & & & & & }
& & & & & & }
& & switch (direction) {
& & & & case View.FOCUS_FORWARD:
& & & & case View.FOCUS_BACKWARD:
& & & & & & return findNextFocusInRelativeDirection(focusables, root, focused, focusedRect,
& & & & & & & & & & direction);
& & & & case View.FOCUS_UP:
& & & & case View.FOCUS_DOWN:
& & & & case View.FOCUS_LEFT:
& & & & case View.FOCUS_RIGHT:
& & & & & & return findNextFocusInAbsoluteDirection(focusables, root, focused,
& & & & & & & & & & focusedRect, direction);
& & & & default:
& & & & & & throw new IllegalArgumentException(&Unknown direction: & + direction);
查找焦点的过程,主要是从View的focusSearch(...)方法开始,从当前焦点开始逐层往外,最终在最外层布局执行FocusFinder中的核心方法来获得下个焦点所在的视图view.
如果需要指定跳转,可以在逐层focusSearch(...)的时候,返回特定的view

我要回帖

更多关于 相关性分析计算公式 的文章

 

随机推荐