View被其它View遮挡显示出来

在写布局文件的时候,有的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哈哈~

猜你喜欢

转载自blog.csdn.net/zhe_ge_sha_shou/article/details/81042900
今日推荐