欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();
            }
        });
    }
....

效果如下:
View被其它View遮挡显示出来

大体效果就是在不隐藏上层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哈哈~

相关标签: view