精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

安卓當下最流行的吸頂效果的實現(下)

移動開發 Android
今天接著上次讓我使用ItemDecoration來完成可推動的懸浮導航欄的效果。

接上文

***步:首先我們來寫一個類,它起標記的作用,來放每一個item的對應的懸浮欄的字符串

  1. public class NameBean {   
  2.     String name;   
  3.    
  4.     public String getName() {   
  5.         return name;   
  6.     }   
  7.    
  8.     public void setName(String name) {   
  9.         this.name = name;   
  10.     }   

 

第二步:自定義一個SectionDecoration 類 繼承 RecyclerView的ItemDecoration

  1. public class SectionDecoration extends RecyclerView.ItemDecoration {   
  2.     private static final String TAG = "SectionDecoration";   
  3.    
  4.     private List<NameBean> dataList;   
  5.    
  6.     private DecorationCallback callback;   
  7.     private TextPaint textPaint;   
  8.     private Paint paint;   
  9.     private int topGap;   
  10.     private int alignBottom;   
  11.     private Paint.FontMetrics fontMetrics;   
  12.    
  13.    
  14.     public SectionDecoration(List<NameBean> dataList, Context context, DecorationCallback decorationCallback) {   
  15.         Resources res = context.getResources();   
  16.         this.dataList = dataList;   
  17.         this.callback = decorationCallback;   
  18.         //設置懸浮欄的畫筆---paint   
  19.         paint = new Paint();   
  20.         paint.setColor(res.getColor(R.color.colorGray));   
  21.    
  22.         //設置懸浮欄中文本的畫筆   
  23.         textPaint = new TextPaint();   
  24.         textPaint.setAntiAlias(true);   
  25.         textPaint.setTextSize(DensityUtil.dip2px(context, 14));   
  26.         textPaint.setColor(Color.DKGRAY);   
  27.         textPaint.setTextAlign(Paint.Align.LEFT);   
  28.         fontMetrics = new Paint.FontMetrics();   
  29.         //決定懸浮欄的高度等   
  30.         topGap = res.getDimensionPixelSize(R.dimen.sectioned_top);   
  31.         //決定文本的顯示位置等   
  32.         alignBottom = res.getDimensionPixelSize(R.dimen.sectioned_alignBottom);   
  33.     }   
  34.    
  35.     @Override   
  36.     public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {   
  37.         super.getItemOffsets(outRect, view, parent, state);   
  38.         int pos = parent.getChildAdapterPosition(view);   
  39.         Log.i(TAG, "getItemOffsets:" + pos);   
  40.         String groupId = callback.getGroupId(pos);   
  41.         if (groupId.equals("-1")) return;   
  42.         //只有是同一組的***個才顯示懸浮欄   
  43.         if (pos == 0 || isFirstInGroup(pos)) {   
  44.             outRect.top = topGap;   
  45.             if (dataList.get(pos).getName() == "") {   
  46.                 outRect.top = 0;   
  47.             }   
  48.         } else {   
  49.             outRect.top = 0;   
  50.         }   
  51.     }   
  52.    
  53.     @Override   
  54.     public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {   
  55.         super.onDraw(c, parent, state);   
  56.         int left = parent.getPaddingLeft();   
  57.         int right = parent.getWidth() - parent.getPaddingRight();   
  58.         int childCount = parent.getChildCount();   
  59.         for (int i = 0; i < childCount; i++) {   
  60.             View view = parent.getChildAt(i);   
  61.             int position = parent.getChildAdapterPosition(view);   
  62.             String groupId = callback.getGroupId(position);   
  63.             if (groupId.equals("-1")) return;   
  64.             String textLine = callback.getGroupFirstLine(position).toUpperCase();   
  65.             if (textLine == "") {   
  66.                 float top = view.getTop();   
  67.                 float bottom = view.getTop();   
  68.                 c.drawRect(lefttopright, bottom, paint);   
  69.                 return;   
  70.             } else {   
  71.                 if (position == 0 || isFirstInGroup(position)) {   
  72.                     float top = view.getTop() - topGap;   
  73.                     float bottom = view.getTop();   
  74.                     //繪制懸浮欄   
  75.                     c.drawRect(lefttop - topGap, right, bottom, paint);   
  76.                     //繪制文本   
  77.                     c.drawText(textLine, left, bottom, textPaint);   
  78.                 }   
  79.             }   
  80.         }   
  81.     }   
  82.    
  83.     @Override   
  84.     public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {   
  85.         super.onDrawOver(c, parent, state);   
  86.         int itemCount = state.getItemCount();   
  87.         int childCount = parent.getChildCount();   
  88.         int left = parent.getPaddingLeft();   
  89.         int right = parent.getWidth() - parent.getPaddingRight();   
  90.         float lineHeight = textPaint.getTextSize() + fontMetrics.descent;   
  91.    
  92.         String preGroupId = "";   
  93.         String groupId = "-1";   
  94.         for (int i = 0; i < childCount; i++) {   
  95.             View view = parent.getChildAt(i);   
  96.             int position = parent.getChildAdapterPosition(view);   
  97.    
  98.             preGroupId = groupId;   
  99.             groupId = callback.getGroupId(position);   
  100.             if (groupId.equals("-1") || groupId.equals(preGroupId)) continue;   
  101.    
  102.             String textLine = callback.getGroupFirstLine(position).toUpperCase();   
  103.             if (TextUtils.isEmpty(textLine)) continue;   
  104.    
  105.             int viewBottom = view.getBottom();   
  106.             float textY = Math.max(topGap, view.getTop());   
  107.             //下一個和當前不一樣移動當前   
  108.             if (position + 1 < itemCount) {   
  109.                 String nextGroupId = callback.getGroupId(position + 1);   
  110.                 //組內***一個view進入了header   
  111.                 if (nextGroupId != groupId && viewBottom < textY) {   
  112.                     textY = viewBottom;   
  113.                 }   
  114.             }   
  115.             //textY - topGap決定了懸浮欄繪制的高度和位置   
  116.             c.drawRect(left, textY - topGap, right, textY, paint);   
  117.             //left+2*alignBottom 決定了文本往左偏移的多少(加-->向左移)   
  118.             //textY-alignBottom  決定了文本往右偏移的多少  (減-->向上移)   
  119.             c.drawText(textLine, left + 2 * alignBottom, textY - alignBottom, textPaint);   
  120.         }   
  121.     }   
  122.    
  123.    
  124.     /** 
  125.      * 判斷是不是組中的***個位置 
  126.      * 
  127.      * @param pos 
  128.      * @return 
  129.      */   
  130.     private boolean isFirstInGroup(int pos) {   
  131.         if (pos == 0) {   
  132.             return true;   
  133.         } else {   
  134.             // 因為是根據 字符串內容的相同與否 來判斷是不是同意組的,所以此處的標記id 要是String類型   
  135.             // 如果你只是做聯系人列表,懸浮框里顯示的只是一個字母,則標記id直接用 int 類型就行了   
  136.             String prevGroupId = callback.getGroupId(pos - 1);   
  137.             String groupId = callback.getGroupId(pos);   
  138.             //判斷前一個字符串 與 當前字符串 是否相同   
  139.             if (prevGroupId.equals(groupId)) {   
  140.                 return false;   
  141.             } else {   
  142.                 return true;   
  143.             }   
  144.         }   
  145.     }   
  146.    
  147.     //定義一個借口方便外界的調用   
  148.     interface DecorationCallback {   
  149.         String getGroupId(int position);   
  150.    
  151.         String getGroupFirstLine(int position);   
  152.     }   

 

第三步:在向list集合中先把每一個item的 起“標記”作用的字符串都加進去

  1. setPullAction(comingslist); 
  1. private void setPullAction(List<WaitMVBean.DataBean.ComingBean> comingslist) {   
  2.         dataList = new ArrayList<>();   
  3.    
  4.         for (int i = 0; i < comingslist.size(); i++) {   
  5.             NameBean nameBean = new NameBean();   
  6.             String name0 = comingslist.get(i).getComingTitle();   
  7.             nameBean.setName(name0);   
  8.             dataList.add(nameBean);   
  9.         }   
  10.     } 

 

第四步:在setAdapter() 前,為RecyclerView添加ItemDecoration:

  1. recyclerView.addItemDecoration(new SectionDecoration(dataList,mContext, new SectionDecoration.DecorationCallback() {   
  2.                //返回標記id (即每一項對應的標志性的字符串)   
  3.                 @Override   
  4.                 public String getGroupId(int position) {   
  5.                     if(dataList.get(position).getName()!=null) {   
  6.                         return dataList.get(position).getName();   
  7.                     }   
  8.                     return "-1";   
  9.                 }   
  10.    
  11.                 //獲取同組中的***個內容   
  12.                 @Override   
  13.                 public String getGroupFirstLine(int position) {   
  14.                     if(dataList.get(position).getName()!=null) {   
  15.                         return dataList.get(position).getName();   
  16.                     }   
  17.                     return "";   
  18.                 }   
  19.             })); 

 

這樣就完成了~

再看一眼最終效果感受一下:

責任編輯:龐桂玉 來源: 安卓開發精選
相關推薦

2017-01-13 11:10:41

Android吸頂效果開發

2022-07-28 14:33:32

webviewweb頁面

2023-10-11 08:14:43

iPhoneTabs標簽頁

2020-08-19 10:22:45

CIOIT試點項目技術

2011-05-03 10:40:58

Ubuntu 11.0應用

2014-02-04 19:44:23

編程語言開發

2014-02-19 10:34:48

JavaScript代碼規范

2018-01-31 11:10:21

安卓操作系統手機屏幕

2011-01-04 18:04:49

PHP

2021-07-13 06:51:16

H5web開發吸頂

2011-03-21 13:01:10

2010-07-20 09:49:07

分布式文件系統

2017-07-14 14:50:00

架構框架前端

2013-11-11 11:34:56

UbuntuLinux發行版Unity

2021-07-28 14:25:01

編程語言開發JavaScript

2018-03-13 09:34:30

人工智能編程語言Python

2023-03-31 11:21:10

網絡協議LoRaWAN

2017-06-27 14:02:09

前端框架Bootstrap

2016-10-21 17:13:16

開發Java

2011-03-23 10:50:21

LAMPWeb開發
點贊
收藏

51CTO技術棧公眾號

国产又大又长又粗又黄| 久久精品电影一区二区| 精品视频在线观看一区| 午夜影院免费视频| 奇米精品一区二区三区在线观看一| 亚洲欧美日韩在线一区| 亚洲一二三不卡| 成人观看网址| 日本一二三不卡| 999视频在线观看| youjizz在线视频| 国产高清一区| 亚洲精品影视在线观看| 8x8x成人免费视频| 久草免费在线视频| 国产精品美女久久福利网站| 国产精品二区三区四区| 91青青草视频| 欧美网站在线| 这里只有视频精品| 在线免费看黄色片| 欧美成a人片免费观看久久五月天| 一区二区三区在线观看视频| 欧美一区二区在线视频观看| 精品人妻无码一区二区| 日韩高清在线不卡| 91丨九色丨国产丨porny| 国产精品国产三级国产| 亚洲曰本av电影| 无码人妻一区二区三区线| 国模大胆一区二区三区| 中文字幕亚洲一区二区三区| 欧美肉大捧一进一出免费视频| 成人国产精品| 欧美性猛交xxxxx免费看| 男女h黄动漫啪啪无遮挡软件| 四虎国产精品永远| 国产99久久久精品| 国产一区二区香蕉| 一级成人黄色片| 雨宫琴音一区二区在线| 久久影院资源网| 日本成人免费在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲| 一本久久精品一区二区| 玩弄中年熟妇正在播放| 欧美野外wwwxxx| 亚洲欧美日韩国产中文在线| 亚洲精品一区国产精品| 国产精品久久久久久久龚玥菲| 成人午夜av在线| 2019国产精品视频| 国产精品视频a| 蜜桃一区二区三区四区| 日韩av免费在线播放| 97免费在线观看视频| 在线欧美亚洲| 97精品一区二区三区| 国产精品theporn动漫| 黄色日韩精品| 久久久久久国产精品| 久久亚洲AV无码| 韩国一区二区三区在线观看| 欧美精品一二区| 欧美另类视频在线观看| 欧美人与禽猛交乱配视频| 久久成人综合视频| 中日韩美女免费视频网站在线观看 | 玖玖精品视频| 国产mv久久久| 中文字幕欧美在线观看| 美女脱光内衣内裤视频久久网站 | 中国一级特黄视频| 美美哒免费高清在线观看视频一区二区| 欧洲亚洲妇女av| 亚洲天堂五月天| 久久国产麻豆精品| 成人精品一区二区三区| 国产黄色片免费| 成人网在线免费视频| 国产伦精品一区二区三区免| 偷拍25位美女撒尿视频在线观看| 久久亚洲捆绑美女| 亚洲黄色成人久久久| 国产在线高清视频| 亚洲国产欧美日韩另类综合 | 七七久久电影网| 精品日韩中文字幕| 2025韩国理伦片在线观看| 日韩大陆av| 精品国产在天天线2019| 人妻丰满熟妇av无码久久洗澡| 国产精品嫩模av在线| 日韩在线观看你懂的| 国产97免费视频| 亚洲制服av| 成人激情免费在线| 香蕉视频免费看| 国产精品久久久久影院亚瑟| 真实国产乱子伦对白视频| 在线男人天堂| 4438x成人网最大色成网站| 欧美一区免费视频| av在线播放亚洲| freexxx性亚洲精品| 色嗨嗨av一区二区三区| 人妻体体内射精一区二区| 欧美理论电影在线精品| 久久久国产精品视频| 日本在线观看中文字幕| 麻豆精品在线视频| 黄色99视频| www视频在线免费观看| 狠狠色狠色综合曰曰| 国产乱码一区二区三区四区| 欧美综合自拍| 欧美另类在线播放| 中文字幕 国产| 97精品久久久午夜一区二区三区 | www.四虎精品| 日产精品一区二区| 国产69精品久久久久久| 国产免费久久久| 国产亚洲一区二区在线观看| 丰满人妻一区二区三区53号| 高清av一区| 亚洲裸体xxxx| 日本中文字幕网| 国产曰批免费观看久久久| 日本一区二区高清视频| av福利导福航大全在线| 欧美一区二区美女| 成人性视频免费看| 久热精品在线| 鲁丝一区鲁丝二区鲁丝三区| 国产极品人妖在线观看| 欧美一区二区三区男人的天堂| 亚洲精品视频网址| 久久中文在线| 久久日韩精品| 黄在线观看免费网站ktv| 日韩一级完整毛片| www.av成人| 久久精品免费观看| 亚洲午夜精品一区二区| 无码 人妻 在线 视频| 97久久中文字幕| 在线亚洲国产精品网| 东京热一区二区三区四区| 成人国产电影网| 男人天堂av片| 哺乳一区二区三区中文视频| 欧美日韩成人网| 精品国产av一区二区| 一区二区欧美视频| 四虎国产精品免费| 亚洲欧美亚洲| 国产精品久久久久久久久久久久午夜片 | 青青草国产一区二区三区| 在线观看日韩视频| 在线观看中文字幕2021| 国产精品入口麻豆九色| 精品亚洲一区二区三区四区| 久久亚洲在线| 亚洲自拍偷拍视频| 免费在线播放电影| 亚洲国产精品中文| 日本熟女毛茸茸| 亚洲国产经典视频| 亚洲va在线va天堂va偷拍| 91精品秘密在线观看| 亚洲综合日韩在线| 91禁在线看| 亚洲欧美日韩精品久久| 综合久久中文字幕| 亚洲三级电影网站| 天堂www中文在线资源| 噜噜噜91成人网| 色女人综合av| 久久久精品区| 97超级碰在线看视频免费在线看 | 久久好看免费视频| 精品国产黄色片| 精品福利视频导航| 99精品99久久久久久宅男| 欧美多人猛交狂配| 久久精选视频| 亚洲午夜精品福利| 国产精品成人自拍| 国产精品91在线观看| 免费在线观看黄| 亚洲国产精品免费| 中文字幕久久久久| 亚洲一区二区综合| 女女互磨互喷水高潮les呻吟 | 亚洲国产精品综合小说图片区| 国产精品福利导航| 麻豆国产91在线播放| 真人抽搐一进一出视频| 欧美日韩在线二区| av免费精品一区二区三区| 国产高清不卡| 色综合久久88| porn视频在线观看| 精品国产一区二区亚洲人成毛片| 中文字幕男人天堂| 亚洲午夜国产一区99re久久| 日本一卡二卡在线播放| 成人免费va视频| 8x8x成人免费视频| 葵司免费一区二区三区四区五区| 51xx午夜影福利| 成人网18免费网站| 精品综合在线| 亚洲一区二区三区日本久久九| 国产精品久久久久久久久久小说| 四季久久免费一区二区三区四区| 亚洲人成五月天| 国产综合在线播放| 4hu四虎永久在线影院成人| 中文字幕一区在线播放| 一区2区3区在线看| 我要看一级黄色录像| 久久精品亚洲麻豆av一区二区 | 中文字幕人妻互换av久久| 午夜欧美大尺度福利影院在线看 | 亚洲国产婷婷综合在线精品| www亚洲色图| 久久午夜免费电影| 中文字幕一区二区人妻电影丶| 国产一区在线精品| 在线观看国产一级片| 91精选在线| 精品一区二区三区欧美| 日韩视频第二页| 最新国产乱人伦偷精品免费网站| 亚洲第一页在线视频| 久久久综合色| 亚洲精品中字| 日韩欧美字幕| 神马影院午夜我不卡| 狠狠做六月爱婷婷综合aⅴ| 久热国产精品视频一区二区三区| 林ゆな中文字幕一区二区| 99在线影院| 日韩高清在线观看一区二区| 亚洲在线观看视频| 日韩精品视频一区二区三区| 2020国产精品久久精品不卡| 欧美高清一级片| av一区观看| 51vv免费精品视频一区二区| 97超碰人人看人人| 6080亚洲理论片在线观看| 91黄色精品| eeuss国产一区二区三区四区| 99国产超薄肉色丝袜交足的后果| 亚洲一区二区三区在线免费 | 北条麻妃视频在线| 久久永久免费| 亚洲天堂av线| 激情五月播播久久久精品| 国产999免费视频| 岛国精品在线播放| 在线观看国产免费视频| 久久久久久久久久美女| 日本污视频网站| 亚洲欧美一区二区三区极速播放| tube国产麻豆| 亚洲国产一区二区三区青草影视| 精品成人av一区二区在线播放| 欧美视频免费在线观看| 欧美一区二区三区网站| 欧美日韩中文一区| 国产富婆一级全黄大片| 亚洲精品久久久一区二区三区| 日韩一区av| 日韩中文字幕在线免费观看| 牛牛电影国产一区二区| 2019亚洲男人天堂| 福利一区二区免费视频| 91精品免费| 亚洲香蕉视频| 性欧美18一19内谢| 亚洲高清在线| 不卡的av中文字幕| 国产不卡视频一区| 成人性生交大免费看| 黄色污污网站在线观看| 亚洲一区二区美女| 丁香六月婷婷综合| 91精品国产91久久久久久一区二区 | 欧美日韩国产电影| 99久久婷婷国产一区二区三区| 精品999久久久| 国产美女视频一区二区三区| 免费av一区二区| 成人性生交大片免费网站| 成人亲热视频网站| 欧美深夜视频| 成人短视频在线看| 国产美女精品| 性生活在线视频| 久久精品一区八戒影视| 久久久久97国产| 欧美伊人久久久久久久久影院| 精品人妻一区二区三区蜜桃| 亚洲视频日韩精品| 黄色美女视频在线观看| 国产精品一区二区三区免费视频| 九九热hot精品视频在线播放| 亚洲国产综合自拍| 亚洲影视综合| 免费看三级黄色片| 国产精品天天看| 日日夜夜综合网| 日韩欧美国产电影| 97电影在线观看| 5566成人精品视频免费| 亚洲日本va| 亚洲自拍偷拍一区二区三区| 老司机精品视频网站| 亚洲熟女一区二区| 亚洲视频综合在线| 国内av在线播放| 日韩av在线免费观看一区| 牛牛精品在线| 成人免费淫片视频软件| 成人嫩草影院| 午夜dv内射一区二区| 91在线精品一区二区| 国产一级视频在线观看| 制服丝袜亚洲色图| 日本福利在线| 国产精品久久久久av免费| 秋霞影视一区二区三区| 18禁网站免费无遮挡无码中文| 国产盗摄女厕一区二区三区| 摸摸摸bbb毛毛毛片| 欧美日韩精品在线观看| 日本黄色一区二区三区| 欧美俄罗斯性视频| 在线播放一区二区精品视频| 欧美另类videosbestsex日本| 国产一区在线精品| 欧产日产国产v| 欧美一区二区视频网站| 午夜精品一区二区三区四区 | 爱福利视频一区| 成人黄页网站视频| 亚洲精品乱码视频| 免费看日韩精品| 国产又黄又粗又猛又爽的| 欧美色网一区二区| 夜级特黄日本大片_在线| 国产精品美女在线观看| 波多野结衣的一区二区三区| 午夜在线观看av| 国产精品美女久久久久久久久 | 中老年在线免费视频| 久久久久久久免费| 久久成人亚洲| 第一次破处视频| 欧美日韩一区二区三区免费看| a天堂中文在线88| 国产美女久久久| 婷婷综合伊人| 中国男女全黄大片| 婷婷开心激情综合| 久久久久久久久亚洲精品| 国产91在线视频| 久久亚洲在线| 免费黄视频在线观看| 天天色天天操综合| 成人网视频在线观看| 国产在线视频不卡| 国产一区视频在线观看免费| 日韩精品人妻中文字幕有码| 欧美性生交大片免费| 天天影视久久综合| 成人免费在线看片| 久久激情婷婷| 免费高清在线观看电视| 亚洲国产婷婷香蕉久久久久久| 偷拍精品精品一区二区三区| 国产免费色视频| 99久精品国产| 亚洲一区二区影视| 欧美国产视频一区二区| 伊人春色之综合网| 天堂网成人在线| 欧美性xxxx极品高清hd直播| 免费黄色在线| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 国产91精品一区| 久久精品一本久久99精品| 电影一区二区在线观看| 国产原创精品在线| 亚洲成人久久影院| 欧美极品视频|