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哈哈~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在无法确定因果关系时,数据为我们提供了解决问题的新方法,数据中所包含的信息可以帮助我们消除不确定性,而数据之间的相...
    一匹蒙古马阅读 2,761评论 1 1
  • 2017年开年参加的第一次培训,很荣幸我参加了包翔老师的包子铺工作型PPT训练营。想用发现之旅分享下自己的心情。 ...
    Sysuyang阅读 3,717评论 0 3
  • 继续着重于英语学习+应用的相互提升,制作了第一个听译的视频字幕,收获不小。 健身: 坚持每天1个小时以上的锻炼时间...
    大鹏元帅阅读 1,417评论 0 1
  • 今晚状态不佳,晚饭后浑身没劲。我们家大蔡就带着俩小蔡出去散步,让我可以安静休息一会。散步回来后给他们洗澡泡牛奶,然...
    Vera112阅读 3,599评论 0 49