RecyclerView計(jì)算滑動(dòng)距離

1

二話不說(shuō),上圖先淤毛!

RecyclerView已經(jīng)出來(lái)許久了今缚,估計(jì)現(xiàn)在沒(méi)多少人使用ListView或者GridView了吧?

這篇文章講解如何計(jì)算寬高相同或不同Item的RecyclerView滑動(dòng)距離低淡,所謂的滑動(dòng)距離意思如下圖姓言。

大概思路就是先得出正在移出屏幕Item的

position,再得出該Item的寬或高蔗蹋,再得出該Item還有多少部分未移出屏幕何荚,拿

position乘寬或者高減去未移出屏幕的距離,就可以算出滑動(dòng)的距離了(?????)

先看下定義的變量和常量

//豎著
private static final int MANAGER_LINEAR_VERTICAL = 0;
//橫著一行
private static final int MANAGER_LINEAR_HORIZONTAL = 1;
//Grid 豎著
private static final int MANAGER_LINEAR_GRIDVIEW_VERTICAL = 2;
//Grid 橫著
private static final int MANAGER_LINEAR_GRIDVIEW_HORIZONTAL = 3;
//豎著不同
private static final int MANAGER_LINEAR_VERTICAL_ = 4;
//橫著不同
private static final int MANAGER_LINEAR_HORIZONTAL_ = 5;
//形態(tài)變量
private int intType = 0;
//item的寬/高
private int itemW;
private int itemH;
private int iResult;
//存放item寬或高
private Map<Integer, Integer> mMapList = new HashMap<>();
private int iposition;

Item布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_tk"/>
    <TextView
        android:id="@+id/tv_position"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/iv"
        android:layout_alignTop="@+id/iv"
        android:background="@color/colorPrimary"
        android:textColor="#e5e5e6"
    />
</RelativeLayout>

一猪杭、計(jì)算寬高相同Item

//該方法用于監(jiān)聽(tīng)mRecyclerView的滑動(dòng)事件
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
    }
});

在上面監(jiān)聽(tīng)中調(diào)用下面計(jì)算方法餐塘,可計(jì)算出VERTICAL豎著布局的滑動(dòng)距離

//找到即將移出屏幕Item的position,position是移出屏幕item的數(shù)量
int position = linearLayoutManager.findFirstVisibleItemPosition();
//根據(jù)position找到這個(gè)Item
View firstVisiableChildView = linearLayoutManager.findViewByPosition(position);
//獲取Item的高
int itemHeight = firstVisiableChildView.getHeight();
//算出該Item還未移出屏幕的高度
int itemTop = firstVisiableChildView.getTop();
//position移出屏幕的數(shù)量*高度得出移動(dòng)的距離
int iposition = position * itemHeight;
//減去該Item還未移出屏幕的部分可得出滑動(dòng)的距離
iResult = iposition - itemTop;

若是HORIZONTAL橫著的RecyclerView則需要稍加改動(dòng)調(diào)用下面方法就能計(jì)算出滑動(dòng)距離因?yàn)槭菣M著的所以要拿到item的寬,用getRight()方法算出未移出屏幕的距離皂吮,但橫著的RecyclerView取到的第一個(gè)Item Position為零戒傻,所以隨后算總距離的時(shí)候要加上一個(gè)Item的寬度

//找到即將移出屏幕Item的position,position是移出屏幕item的數(shù)量
int position = linearLayoutManager.findFirstVisibleItemPosition();
//根據(jù)position找到這個(gè)Item
View firstVisiableChildView = linearLayoutManager.findViewByPosition(position);
//獲取Item的寬
int itemWidth = firstVisiableChildView.getWidth();
//算出該Item還未移出屏幕的高度
int itemRight = firstVisiableChildView.getRight();
//position移出屏幕的數(shù)量*高度得出移動(dòng)的距離
int iposition = position * itemWidth;
//因?yàn)闄M著的RecyclerV第一個(gè)取到的Item position為零所以計(jì)算時(shí)需要加一個(gè)寬
iResult = iposition - itemRight + itemWidth;

二、計(jì)算Grid排列相同Item

豎著的Grid蜂筹,注釋很認(rèn)真的寫(xiě)了(⊙o⊙)需纳,大部分還是一樣的

//得出spanCount幾列或幾排
int itemSpanCount = gridLayoutManager.getSpanCount();
//得出的position是一排或一列總和
int position = gridLayoutManager.findFirstVisibleItemPosition();
//需要算出才是即將移出屏幕Item的position
int itemPosition = position / itemSpanCount ;
//因?yàn)槭窍嗤腎tem所以取那個(gè)都一樣
View firstVisiableChildView = gridLayoutManager.findViewByPosition(position);
int itemHeight = firstVisiableChildView.getHeight();
int itemTop = firstVisiableChildView.getTop();
int iposition = itemPosition * itemHeight;
iResult = iposition - itemTop;

橫著的Grid大家可以下Demo看一下,也是有注釋的

三狂票、計(jì)算不同Item

思路:用Map按Position記錄了每個(gè)Item的寬或高候齿,通過(guò)

findFirstVisibleItemPosition()方法動(dòng)態(tài)計(jì)算滑動(dòng)距離

public int unlikeVertical() {
    int itemWH = 0;
    int itemTR = 0;
    int distance = 0;
    int position = linearLayoutManager.findFirstVisibleItemPosition();
    View firstVisiableChildView = linearLayoutManager.findViewByPosition(position);
    //判斷是橫著還是豎著,得出寬或高
    if (intType == MANAGER_LINEAR_VERTICAL_) {
        itemWH = firstVisiableChildView.getHeight();
    } else if (intType == MANAGER_LINEAR_HORIZONTAL_) {
        itemWH = firstVisiableChildView.getWidth();
    }
    //一層判斷mMapList是否為空闺属,若不為空則根據(jù)鍵判斷保證不會(huì)重復(fù)存入
    if (mMapList.size() == 0) {
        mMapList.put(position, itemWH);
    } else {
        if (!mMapList.containsKey(position)) {
            mMapList.put(position, itemWH);
            Log.d("poi", mMapList + "");
        }
    }
    //判斷是橫著還是豎著慌盯,得出未滑出屏幕的距離
    if (intType == MANAGER_LINEAR_VERTICAL_) {
        itemTR = firstVisiableChildView.getTop();
    } else if (intType == MANAGER_LINEAR_HORIZONTAL_) {
        itemTR = firstVisiableChildView.getRight();
    }
    //position為動(dòng)態(tài)獲取,目前屏幕Item位置
    for (int i = 0; i < position; i++) {
        //iposition移出屏幕的距離
        iposition = iposition + mMapList.get(i);
    }
    //根據(jù)類(lèi)型拿iposition減未移出Item部分距離掂器,最后得出滑動(dòng)距離
    if (intType == MANAGER_LINEAR_VERTICAL_) {
        distance = iposition - itemTR;
    } else if (intType == MANAGER_LINEAR_HORIZONTAL_) {
        distance = iposition - itemTR + itemWH;
    }
    //item寬高
    itemW = firstVisiableChildView.getWidth();
    itemH = firstVisiableChildView.getHeight();
    //歸零
    iposition = 0;
    return distance;
}

Demo地址:github.com/NathansLiu/…

My JianShu:www.reibang.com/u/ae7a687f5…

My JueJin:https://juejin.im/user/59a0ca42f265da2491510f10

寫(xiě)完啦亚皂!

3
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市国瓮,隨后出現(xiàn)的幾起案子灭必,更是在濱河造成了極大的恐慌,老刑警劉巖乃摹,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禁漓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡孵睬,警方通過(guò)查閱死者的電腦和手機(jī)播歼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掰读,“玉大人秘狞,你說(shuō)我怎么就攤上這事叭莫。” “怎么了烁试?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵雇初,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我减响,道長(zhǎng)靖诗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任辩蛋,我火速辦了婚禮呻畸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悼院。我一直安慰自己,他們只是感情好咒循,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布据途。 她就那樣靜靜地躺著,像睡著了一般叙甸。 火紅的嫁衣襯著肌膚如雪颖医。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天裆蒸,我揣著相機(jī)與錄音熔萧,去河邊找鬼。 笑死僚祷,一個(gè)胖子當(dāng)著我的面吹牛佛致,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辙谜,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俺榆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了装哆?” 一聲冷哼從身側(cè)響起罐脊,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜕琴,沒(méi)想到半個(gè)月后萍桌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凌简,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年上炎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片号醉。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡反症,死狀恐怖辛块,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铅碍,我是刑警寧澤润绵,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站胞谈,受9級(jí)特大地震影響尘盼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烦绳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一卿捎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧径密,春花似錦午阵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惧眠,卻和暖如春籽懦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氛魁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工暮顺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秀存。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓捶码,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親应又。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宙项,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,082評(píng)論 25 707
  • 簡(jiǎn)介: 提供一個(gè)讓有限的窗口變成一個(gè)大數(shù)據(jù)集的靈活視圖。 術(shù)語(yǔ)表: Adapter:RecyclerView的子類(lèi)...
    酷泡泡閱讀 5,163評(píng)論 0 16
  • Tangram是阿里出品株扛、用于快速實(shí)現(xiàn)組合布局的框架模型尤筐,在手機(jī)天貓Android&iOS版 內(nèi)廣泛使用 該框架提...
    wintersweett閱讀 3,294評(píng)論 0 1
  • 這篇文章分三個(gè)部分,簡(jiǎn)單跟大家講一下 RecyclerView 的常用方法與奇葩用法洞就;工作原理與ListView比...
    LucasAdam閱讀 4,388評(píng)論 0 27
  • 牛軋?zhí)怯錾咸K打餅盆繁,特點(diǎn)是餅皮酥脆奶餡香濃,可以說(shuō)是長(zhǎng)生不老的一款私房爆款產(chǎn)品旬蟋。 不管是你咸甜黨還是香甜黨 這款好吃...
    謝鯊鯊閱讀 2,478評(píng)論 0 0