背景
最近在熟悉项目中,发现一个api:bringChildToFront,之前没怎么用过,具体分析下。 原文地址: http://www.debuglive.cn/article/892833399977279488
http://blog.debuglive.cn/archives/androidtvbringchildtofront-shi-yong-chang-jing
bringChildToFront
在项目中会发现很多这样的api调用,这个有什么目的呢? ViewGroup(下面简写vg)中绘制子view是有顺序的,内部定义了子view保存数组
// Child views of this ViewGroup
private View[] mChildren;
这个方法是调整子view在vg绘制顺序
,让传递进来的view最后绘制。手机开发中好像没用到吧。TV端就看到很多地方有调用了。
原因:通过拿到焦点的view会做一个放大效果,如果按照之前绘制顺序,放大之后,后面绘制的view会压在它上面,就是经常说的被挤压了,或者放大显示不全。通过改变顺序,让聚焦的view放大后最后绘制,就压在其他view的上面。
v.getParent().bringChildToFront(v);
graph LR
getParent-->bringChildToFront
@Override
public void bringChildToFront(View child) {
// 拿到子view在数组中对应的索引
final int index = indexOfChild(child);
// 如果小于0就是这个view不属于当前vg(找不到嘛!)
if (index >= 0) {
// 从vg中view数组移除这个索引对应的子view
removeFromArray(index);
// 把子view放到vg子view数组的末尾
addInArray(child, mChildrenCount);
// 因为removeFromArray中移除了子view的mParent,这里补回去
child.mParent = this;
// 重绘(刷新)
requestLayout();
invalidate();
}
}
效果图
把聚焦那个view顶起来
了,不会被旁边的view压着。