中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android RecyclerView實現懸浮吸頂、分隔線、到底提示效果

發布時間:2020-10-23 01:36:18 來源:腳本之家 閱讀:202 作者:MrChen的成長之路 欄目:移動開發

本文中所有效果通過ItemDecoration實現,通過此實現的可以與業務解耦,讓RecyclerView的模板更加簡潔,不關心任何輔助性ui,github地址

一、頂部吸附效果圖

Android RecyclerView實現懸浮吸頂、分隔線、到底提示效果

二、頂部不吸附效果圖

Android RecyclerView實現懸浮吸頂、分隔線、到底提示效果

三、不滿一屏效果

Android RecyclerView實現懸浮吸頂、分隔線、到底提示效果

四、核心實現點

1、為什么通過ItemDecoration能夠實現,原理?

①通過getItemOffsets()方法獲取當前模板view的left、top、right、bottom邊距,這些留出的間距用于繪制這些輔助性ui。

// RecyclerView的measure child方法
public void measureChild(@NonNull View child, int widthUsed, int heightUsed) {
      final LayoutParams lp = (LayoutParams) child.getLayoutParams();
  //將getItemOffsets()獲取的值累加到測量值之中
      final Rect insets = mRecyclerView.getItemDecorInsetsForChild(child);
      widthUsed += insets.left + insets.right;
      heightUsed += insets.top + insets.bottom;
      final int widthSpec = getChildMeasureSpec(getWidth(), getWidthMode(),
          getPaddingLeft() + getPaddingRight() + widthUsed, lp.width,
          canScrollHorizontally());
      final int heightSpec = getChildMeasureSpec(getHeight(), getHeightMode(),
          getPaddingTop() + getPaddingBottom() + heightUsed, lp.height,
          canScrollVertically());
      if (shouldMeasureChild(child, widthSpec, heightSpec, lp)) {
        child.measure(widthSpec, heightSpec);
      }
    }

②通過onDrawOver()繪制懸浮視圖,繪制的ui在所有子視圖之上。

@Override
  public void draw(Canvas c) {
    super.draw(c);
 //在RecyclerView繪制完之后回調onDrawOver()方法
    final int count = mItemDecorations.size();
    for (int i = 0; i < count; i++) {
      mItemDecorations.get(i).onDrawOver(c, this, mState);
    }
 }

③通過onDraw()方法繪制分割線等視圖。

 public void onDraw(Canvas c) {
    super.onDraw(c);
 //先回調onDraw()方法,在繪制RecyclerView子view
    final int count = mItemDecorations.size();
    for (int i = 0; i < count; i++) {
      mItemDecorations.get(i).onDraw(c, this, mState);
    }
  }

2、“到底提示” 的繪制

由于在getItemOffsets()獲取不到子視圖的寬高,此時還沒有measure,在getItemOffsets()添加高度后,如果不滿一屏需要在onDraw()方法中進行修正,修正方式為:
反射修改mDecorInsets屬性,重置在getItemOffsets()方法中設置的值。

private void setDecorInsetsBottom(RecyclerView.LayoutParams param, int bottom) {
    try {
      // 找到RecyclerView.LayoutParams中的mDecorInsets屬性值
      Field filed = RecyclerView.LayoutParams.class.getDeclaredField("mDecorInsets");
      filed.setAccessible(true);
      Rect decorRect = (Rect) filed.get(param);
      decorRect.bottom = bottom;
    } catch (Exception e) {
    }
  }

總結

以上所述是小編給大家介紹的Android RecyclerView實現懸浮吸頂、分隔線、到底提示效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴城市| 南溪县| 封开县| 林周县| 泾源县| 蒲江县| 长兴县| 乌拉特中旗| 曲水县| 昌乐县| 夏邑县| 克什克腾旗| 定边县| 文水县| 九龙县| 清水河县| 和平县| 沙田区| 营口市| 新野县| 塔城市| 军事| 乐东| 正蓝旗| 红桥区| 辽宁省| 郎溪县| 巴林右旗| 迁安市| 汉阴县| 文登市| 龙南县| 二连浩特市| 桦甸市| 沙坪坝区| 商城县| 哈巴河县| 华容县| 绥中县| 阳信县| 永平县|