檢測View是否在屏幕中可見的總結(jié)

前言:昨天項(xiàng)目迭代增加一個(gè)功能臀防,對(duì)一個(gè)View在用戶看到的時(shí)候增加動(dòng)畫抢蚀,該View是在list作為footerView添加進(jìn)去的牛隅,需要判斷一個(gè)view對(duì)于用戶是否可見俘侠,也自己實(shí)踐了一下,總結(jié)總結(jié)薇搁。

網(wǎng)上查到的方法斋扰,有一個(gè)提到重寫view中“onWindowVisibilityChanged”的方法,來判斷是否可見啃洋,具體如下:

@Override

protected voidonWindowVisibilityChanged(intvisibility) {

super.onWindowVisibilityChanged(visibility);

if(visibility == View.VISIBLE){

//開始某些任務(wù)

if(!isCover()){

if(onViewVisibilityListener!=null){

onViewVisibilityListener.onVisible();

}

}

}else if(visibility ==INVISIBLE|| visibility ==GONE){

//停止某些任務(wù)

if(onViewVisibilityListener!=null){

onViewVisibilityListener.onInVisible();

}

}

}

ps:吐槽一下簡書這個(gè)編輯器對(duì)于代碼的規(guī)范化真的和屎一樣传货,當(dāng)然可能我自己沒學(xué)會(huì)掌握~

大寫的BUT,據(jù)我測試得出宏娄,該方法在第一次加載View的時(shí)候就觸發(fā)了(visibility== View.VISIBLE)问裕,然后隨著滑動(dòng)滑出滑入屏幕丫都沒有再次觸發(fā),網(wǎng)上查閱的對(duì)于該方法的解釋是:

onWindowVisibilityChanged(int) 當(dāng)窗口中包含的可見的view發(fā)生變化時(shí)觸發(fā)

經(jīng)過測試得出孵坚,該方法在在第一次加載繪制view時(shí)會(huì)被調(diào)用粮宛,然后在view被銷毀或者掛起時(shí)再被調(diào)用(如從當(dāng)前界面跳轉(zhuǎn)到其他activity時(shí)),詳細(xì)查閱以及跟蹤了其源代碼發(fā)現(xiàn)卖宠,調(diào)用該方法的地方主要在


銷毀時(shí)


加載時(shí)


網(wǎng)上查閱這兩個(gè)方法的解釋如下


妥妥的我是懶人

所以此方法不能有效的監(jiān)聽改View是否在屏幕中可見巍杈,這個(gè)時(shí)候需要用到另一個(gè)方法

getGlobalVisibleRect(Rect r)

該方法是獲取視圖在屏幕坐標(biāo)中的可視區(qū)域,然后根據(jù)其返回的區(qū)域坐標(biāo)來進(jìn)行判斷是否被是否被遮住顯示不全逗堵。

cover= getGlobalVisibleRect(rect);

if(cover) {

if(rect.width() >= getMeasuredWidth() && rect.height() >= getMeasuredHeight()) {

//沒有被覆蓋

return!cover;

}

}

return true;

上述代碼只有在該View一半在屏幕中一半在屏幕外的時(shí)候才會(huì)返回true秉氧,其他都會(huì)返回false。

同時(shí)還有一個(gè)方法是:

getLocalVisibleRect(Rect r)

該方法是獲取視圖本身可見的坐標(biāo)區(qū)域蜒秤,坐標(biāo)以自己的左上角為原點(diǎn)(0汁咏,0)

該方法在該View一直在屏幕底部沒有顯示的時(shí)候亚斋,返回的下坐標(biāo)一直是view高度,如果從屏幕底部開始往上滑動(dòng)時(shí)攘滩,返回的下坐標(biāo)從0開始直到view的高度即View完全滑出屏幕帅刊。

所以機(jī)遇以上方法來進(jìn)行判斷View是否被遮擋,是否完全處于屏幕中漂问,結(jié)合View.getVisibility(),應(yīng)該可以滿足對(duì)于View是否可見的判斷赖瞒。(我使用的就是判斷是否被遮擋,如果被遮擋就出發(fā)動(dòng)畫蚤假,雖然有可能剛露個(gè)頭就觸發(fā)動(dòng)畫導(dǎo)致用戶還看不見栏饮,但是一般場景用戶不會(huì)一個(gè)位移一個(gè)位移的去滑動(dòng),如果遇到這樣變態(tài)的用戶磷仰,看不到動(dòng)畫效果也是他該E坻摇!T钇健)

題外話:

以上兩種方法都是主動(dòng)調(diào)用伺通,不是被動(dòng)調(diào)用,我們需要在view可見的時(shí)候觸發(fā)相應(yīng)的操作逢享,所以就需要在一個(gè)適當(dāng)?shù)臋C(jī)會(huì)主動(dòng)觸發(fā)去調(diào)用該方法判斷是否可見罐监,如果通過wihle(true)的方法,這又像小學(xué)生寫的代碼瞒爬,所以建議通過ListView的setOnScrollListener方法弓柱,在其回調(diào)

onScroll(AbsListView view, intfirstVisibleItem, intvisibleItemCount, inttotalItemCount)

方法時(shí)進(jìn)行判斷,因?yàn)楸敬涡枰獧z測的View是footerView疮鲫,就是放在最下面的View吆你,所以在onScroll中加了一個(gè)邏輯判斷

if(totalItemCount-visibleItemCount-firstVisibleItem>2){

return;

}

如果不是滑動(dòng)快到最下面的兩個(gè)View的時(shí)候(因?yàn)檫@個(gè)footerView是在倒數(shù)第二個(gè)View),就不進(jìn)行判斷俊犯,也算是減少一些無用的計(jì)算過程。

http://blog.sina.com.cn/s/blog_74c22b2101012urv.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伤哺,一起剝皮案震驚了整個(gè)濱河市燕侠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立莉,老刑警劉巖绢彤,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜓耻,居然都是意外死亡茫舶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門刹淌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饶氏,“玉大人讥耗,你說我怎么就攤上這事≌钇簦” “怎么了古程?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喊崖。 經(jīng)常有香客問我挣磨,道長,這世上最難降的妖魔是什么荤懂? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任茁裙,我火速辦了婚禮,結(jié)果婚禮上节仿,老公的妹妹穿的比我還像新娘晤锥。我一直安慰自己,他們只是感情好粟耻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布查近。 她就那樣靜靜地躺著,像睡著了一般挤忙。 火紅的嫁衣襯著肌膚如雪霜威。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天册烈,我揣著相機(jī)與錄音戈泼,去河邊找鬼。 笑死赏僧,一個(gè)胖子當(dāng)著我的面吹牛大猛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淀零,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼挽绩,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了驾中?” 一聲冷哼從身側(cè)響起唉堪,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肩民,沒想到半個(gè)月后唠亚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡持痰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年灶搜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡割卖,死狀恐怖前酿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情究珊,我是刑警寧澤薪者,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站剿涮,受9級(jí)特大地震影響言津,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜取试,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一悬槽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞬浓,春花似錦初婆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萨赁,卻和暖如春弊琴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杖爽。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工敲董, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慰安。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓腋寨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親化焕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萄窜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容