RecyclerView计算滑动距离

1

二话不说,上图先!

RecyclerView已经出来许久了,估计现在没多少人使用ListView或者GridView了吧?

这篇文章讲解如何计算宽高相同或不同Item的RecyclerView滑动距离,所谓的滑动距离意思如下图。

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

position,再得出该Item的宽或高,再得出该Item还有多少部分未移出屏幕,拿

position乘宽或者高减去未移出屏幕的距离,就可以算出滑动的距离了(๑•ᴗ•๑)

先看下定义的变量和常量

//竖着
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;
//形态变量
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>

一、计算宽高相同Item

//该方法用于监听mRecyclerView的滑动事件
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
    }
});

在上面监听中调用下面计算方法,可计算出VERTICAL竖着布局的滑动距离

//找到即将移出屏幕Item的position,position是移出屏幕item的数量
int position = linearLayoutManager.findFirstVisibleItemPosition();
//根据position找到这个Item
View firstVisiableChildView = linearLayoutManager.findViewByPosition(position);
//获取Item的高
int itemHeight = firstVisiableChildView.getHeight();
//算出该Item还未移出屏幕的高度
int itemTop = firstVisiableChildView.getTop();
//position移出屏幕的数量*高度得出移动的距离
int iposition = position * itemHeight;
//减去该Item还未移出屏幕的部分可得出滑动的距离
iResult = iposition - itemTop;

若是HORIZONTAL横着的RecyclerView则需要稍加改动调用下面方法就能计算出滑动距离因为是横着的所以要拿到item的宽,用getRight()方法算出未移出屏幕的距离,但横着的RecyclerView取到的第一个Item Position为零,所以随后算总距离的时候要加上一个Item的宽度

//找到即将移出屏幕Item的position,position是移出屏幕item的数量
int position = linearLayoutManager.findFirstVisibleItemPosition();
//根据position找到这个Item
View firstVisiableChildView = linearLayoutManager.findViewByPosition(position);
//获取Item的宽
int itemWidth = firstVisiableChildView.getWidth();
//算出该Item还未移出屏幕的高度
int itemRight = firstVisiableChildView.getRight();
//position移出屏幕的数量*高度得出移动的距离
int iposition = position * itemWidth;
//因为横着的RecyclerV第一个取到的Item position为零所以计算时需要加一个宽
iResult = iposition - itemRight + itemWidth;

二、计算Grid排列相同Item

竖着的Grid,注释很认真的写了(⊙o⊙),大部分还是一样的

//得出spanCount几列或几排
int itemSpanCount = gridLayoutManager.getSpanCount();
//得出的position是一排或一列总和
int position = gridLayoutManager.findFirstVisibleItemPosition();
//需要算出才是即将移出屏幕Item的position
int itemPosition = position / itemSpanCount ;
//因为是相同的Item所以取那个都一样
View firstVisiableChildView = gridLayoutManager.findViewByPosition(position);
int itemHeight = firstVisiableChildView.getHeight();
int itemTop = firstVisiableChildView.getTop();
int iposition = itemPosition * itemHeight;
iResult = iposition - itemTop;

横着的Grid大家可以下Demo看一下,也是有注释的

三、计算不同Item

思路:用Map按Position记录了每个Item的宽或高,通过

findFirstVisibleItemPosition()方法动态计算滑动距离

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是否为空,若不为空则根据键判断保证不会重复存入
    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为动态获取,目前屏幕Item位置
    for (int i = 0; i < position; i++) {
        //iposition移出屏幕的距离
        iposition = iposition + mMapList.get(i);
    }
    //根据类型拿iposition减未移出Item部分距离,最后得出滑动距离
    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.greatytc.com/u/ae7a687f5…

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

写完啦!

3
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,745评论 25 707
  • 简介: 提供一个让有限的窗口变成一个大数据集的灵活视图。 术语表: Adapter:RecyclerView的子类...
    酷泡泡阅读 5,148评论 0 16
  • Tangram是阿里出品、用于快速实现组合布局的框架模型,在手机天猫Android&iOS版 内广泛使用 该框架提...
    wintersweett阅读 3,268评论 0 1
  • 这篇文章分三个部分,简单跟大家讲一下 RecyclerView 的常用方法与奇葩用法;工作原理与ListView比...
    LucasAdam阅读 4,377评论 0 27
  • 牛轧糖遇上苏打饼,特点是饼皮酥脆奶馅香浓,可以说是长生不老的一款私房爆款产品。 不管是你咸甜党还是香甜党 这款好吃...
    谢鲨鲨阅读 2,471评论 0 0