View被其它View遮挡显示出来
程序员文章站
2022-05-24 20:35:46
...
在写布局文件的时候,有的View会放在其它View的上层,通常情况下显示底层View可以让上层的View隐藏,有没有方法不让上层View隐藏而让底层View显示呢?
这里有一个方法可以做到bringToFront
,这里看下效果,在布局文件中写了两个TextView,其中一个遮挡住下面的TextView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/low_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:gravity="center"
android:text="我是底层TextView" />
<TextView
android:id="@+id/upper_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:background="#000000"
android:gravity="center"
android:text="我是上层TextView"
android:textColor="#ffffff" />
</RelativeLayout>
为上层TextView设置点击事件,点击时调用底层TextView的bringToFront
方法
....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.upper_tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findViewById(R.id.low_tv).bringToFront();
}
});
}
....
效果如下:
大体效果就是在不隐藏上层TextView的情况下,我们点击上层TextView,调用bringToFront
方法,底层TextView显示在上层了。
我们大体来分析下源码中这个方法是如何做到的了:
首先看下View中这个方法:
View中
public void bringToFront() {
if (mParent != null) {
mParent.bringChildToFront(this);
}
}
很简单的两句,这里mParent就是View的容器View,也就是ViewGroup之类的View。
接着我们跟进去,可以看到ViewParent中声明了这个方法
ViewParent中
public void bringChildToFront(View child);
我们找一个子类的实现看下
ViewGroup中
@Override
public void bringChildToFront(View child) {
final int index = indexOfChild(child);
if (index >= 0) {
removeFromArray(index);
addInArray(child, mChildrenCount);
child.mParent = this;
requestLayout();
invalidate();
}
}
到这里我们就明白了,首先找到子View的位置,从ViewTree中移除子View,再将子View添加到上层,重新绘制ViewGroup显示。是不是很简单了O(∩_∩)O哈哈~
上一篇: 【ASP.NET】5.百度富文本编辑器UEditor之存入数据库
下一篇: Spring事件监听机制