View被其它View遮挡显示出来

在写布局文件的时候,有的View会放在其它View的上层,通常情况下显示底层View可以让上层的View隐藏,有没有方法不让上层View隐藏而让底层View显示呢?
这里有一个方法可以做到bringToFront,这里看下效果,在布局文件中写了两个TextView,其中一个遮挡住下面的TextView




    

    


为上层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遮挡显示出来_第1张图片
点击后效果

大体效果就是在不隐藏上层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被其它View遮挡显示出来)