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設(shè)置點擊事件,點擊時調(diào)用底層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,調(diào)用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);

我們找一個子類的實現(xiàn)看下

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在無法確定因果關(guān)系時,數(shù)據(jù)為我們提供了解決問題的新方法,數(shù)據(jù)中所包含的信息可以幫助我們消除不確定性,而數(shù)據(jù)之間的相...
    一匹蒙古馬閱讀 442評論 1 1
  • 2017年開年參加的第一次培訓(xùn),很榮幸我參加了包翔老師的包子鋪工作型PPT訓(xùn)練營。想用發(fā)現(xiàn)之旅分享下自己的心情。 ...
    Sysuyang閱讀 701評論 0 3
  • 繼續(xù)著重于英語學(xué)習(xí)+應(yīng)用的相互提升,制作了第一個聽譯的視頻字幕,收獲不小。 健身: 堅持每天1個小時以上的鍛煉時間...
    大鵬元帥閱讀 227評論 0 1
  • 今晚狀態(tài)不佳,晚飯后渾身沒勁。我們家大蔡就帶著倆小蔡出去散步,讓我可以安靜休息一會。散步回來后給他們洗澡泡牛奶,然...
    Vera112閱讀 605評論 0 49

友情鏈接更多精彩內(nèi)容