日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用开发—通用的GridView网格分割线

發(fā)布時間:2023/12/19 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用开发—通用的GridView网格分割线 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

注:本文基于 Android RecyclerView 使用完全解析 體驗(yàn)藝術(shù)般的控件 中關(guān)于GridView網(wǎng)格分割線部分代碼擴(kuò)展而來。

原接口代碼:

import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.LayoutManager; import android.support.v7.widget.RecyclerView.State; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View;public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {private static final int[] ATTRS = new int[]{android.R.attr.listDivider};private Drawable mDivider;public DividerGridItemDecoration(Context context) {final TypedArray a = context.obtainStyledAttributes(ATTRS);mDivider = a.getDrawable(0);a.recycle();}@Overridepublic void onDraw(Canvas c, RecyclerView parent, State state) {drawHorizontal(c, parent);drawVertical(c, parent);}private int getSpanCount(RecyclerView parent) {// 列數(shù)int spanCount = -1;LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {spanCount = ((GridLayoutManager) layoutManager).getSpanCount();} else if (layoutManager instanceof StaggeredGridLayoutManager) {spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount();}return spanCount;}public void drawHorizontal(Canvas c, RecyclerView parent) {int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getLeft() - params.leftMargin;final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth();final int top = child.getBottom() + params.bottomMargin;final int bottom = top + mDivider.getIntrinsicHeight();mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}}public void drawVertical(Canvas c, RecyclerView parent) {final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getTop() - params.topMargin;final int bottom = child.getBottom() + params.bottomMargin;final int left = child.getRight() + params.rightMargin;final int right = left + mDivider.getIntrinsicWidth();mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}}private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {// 如果是最后一列,則不需要繪制右邊if ((pos + 1) % spanCount == 0) {return true;}} else if (layoutManager instanceof StaggeredGridLayoutManager) {int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();if (orientation == StaggeredGridLayoutManager.VERTICAL) {// 如果是最后一列,則不需要繪制右邊if ((pos + 1) % spanCount == 0) {return true;}} else {childCount = childCount - childCount % spanCount;if (pos >= childCount)// 如果是最后一列,則不需要繪制右邊return true;}}return false;}private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) {LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {childCount = childCount - childCount % spanCount;if (pos >= childCount)// 如果是最后一行,則不需要繪制底部return true;} else if (layoutManager instanceof StaggeredGridLayoutManager) {int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();// StaggeredGridLayoutManager 且縱向滾動if (orientation == StaggeredGridLayoutManager.VERTICAL) {childCount = childCount - childCount % spanCount;// 如果是最后一行,則不需要繪制底部if (pos >= childCount)return true;} else {// 如果是最后一行,則不需要繪制底部if ((pos + 1) % spanCount == 0) {return true;}}}return false;}@Overridepublic void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {int spanCount = getSpanCount(parent);int childCount = parent.getAdapter().getItemCount();// 如果是最后一行,則不需要繪制底部if (isLastRaw(parent, itemPosition, spanCount, childCount)) {outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);} else if (isLastColum(parent, itemPosition, spanCount, childCount)) {// 如果是最后一列,則不需要繪制右邊outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());} else {outRect.set(0, 0, mDivider.getIntrinsicWidth(),mDivider.getIntrinsicHeight());}} }

擴(kuò)展后的代碼:

import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.LayoutManager; import android.support.v7.widget.RecyclerView.State; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View;public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {private static final int[] ATTRS = new int[]{android.R.attr.listDivider};private Drawable mDivider;private Paint mColorPaint;private int mDividerHeight = 1;public DividerGridItemDecoration(Context context) {final TypedArray a = context.obtainStyledAttributes(ATTRS);mDivider = a.getDrawable(0);a.recycle();}public DividerGridItemDecoration(Context context, int color, int height) {this(context);mColorPaint = new Paint();mColorPaint.setColor(color);mDividerHeight = height;}@Overridepublic void onDraw(Canvas c, RecyclerView parent, State state) {drawHorizontal(c, parent);drawVertical(c, parent);}private int getSpanCount(RecyclerView parent) {// 列數(shù)int spanCount = -1;LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {spanCount = ((GridLayoutManager) layoutManager).getSpanCount();} else if (layoutManager instanceof StaggeredGridLayoutManager) {spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount();}return spanCount;}public void drawHorizontal(Canvas c, RecyclerView parent) {int childCount = parent.getChildCount();int spanCount = getSpanCount(parent);int count = 0;if (childCount % spanCount != 0) {count = childCount;} else {count = childCount - spanCount;}for (int i = 0; i < count; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getLeft() - params.leftMargin;final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth();final int top = child.getBottom() + params.bottomMargin;final int bottom = top + mDivider.getIntrinsicHeight();if (mColorPaint != null) {c.drawRect(left, top, right, top + mDividerHeight, mColorPaint);} else {mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}}}public void drawVertical(Canvas c, RecyclerView parent) {final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getTop() - params.topMargin;final int bottom = child.getBottom() + params.bottomMargin;final int left = child.getRight() + params.rightMargin;final int right = left + mDivider.getIntrinsicWidth();if (mColorPaint != null) {c.drawRect(left, top, left + mDividerHeight, bottom, mColorPaint);} else {mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}}}private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {// 如果是最后一列,則不需要繪制右邊if ((pos + 1) % spanCount == 0) {return true;}} else if (layoutManager instanceof StaggeredGridLayoutManager) {int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();if (orientation == StaggeredGridLayoutManager.VERTICAL) {// 如果是最后一列,則不需要繪制右邊if ((pos + 1) % spanCount == 0) {return true;}} else {childCount = childCount - childCount % spanCount;if (pos >= childCount)// 如果是最后一列,則不需要繪制右邊return true;}}return false;}private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) {LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {childCount = childCount - childCount % spanCount;if (pos >= childCount)// 如果是最后一行,則不需要繪制底部return true;} else if (layoutManager instanceof StaggeredGridLayoutManager) {int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();// StaggeredGridLayoutManager 且縱向滾動if (orientation == StaggeredGridLayoutManager.VERTICAL) {childCount = childCount - childCount % spanCount;// 如果是最后一行,則不需要繪制底部if (pos >= childCount)return true;} else {// 如果是最后一行,則不需要繪制底部if ((pos + 1) % spanCount == 0) {return true;}}}return false;}@Overridepublic void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {int spanCount = getSpanCount(parent);int childCount = parent.getAdapter().getItemCount();// 如果是最后一行,則不需要繪制底部if (isLastRaw(parent, itemPosition, spanCount, childCount)) {outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);} else if (isLastColum(parent, itemPosition, spanCount, childCount)) {// 如果是最后一列,則不需要繪制右邊outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());} else {outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight());}} }

擴(kuò)展的內(nèi)容:

  • 最后一行不畫分割線。通常我們的需求是邊框都不進(jìn)行分割的繪制,而原來的代碼沒有做這部分的處理。(原接口只處理了最后一列的情況)
  • 支持分割線的顏色和寬度繪制的定制化。(原接口只支持系統(tǒng)屬性分割線的繪制)。繪制方式:DividerGridItemDecoration(Context context, int color, int height) 通過傳遞color和height進(jìn)行繪制定制化。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Android应用开发—通用的GridView网格分割线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久草免费在线视频观看 | 日本aaa级片 | 你懂的在线观看视频 | 久久精品国产网红主播 | 爱爱亚洲| 中文久久久久 | 日韩人妻一区二区三区 | 国产精品成人免费看片 | 性猛交ⅹxxx富婆video | 久久久久久久久久久久久国产 | 国产毛片高清 | 伊人影院在线播放 | 亚洲色图2| 日本毛片在线 | 日韩精品一区二区亚洲av性色 | 爱搞逼综合 | 色臀| www日本免费 | 小日子的在线观看免费第8集 | 午夜黄色福利视频 | 成人av免费在线看 | 亚洲天堂久久新 | 全部毛片永久免费看 | 国产剧情一区 | 超碰色偷偷 | 精品国产成人av在线免 | 制服丝袜手机在线 | 亚洲日本激情 | 黄色的网站免费看 | 天天爱av| 鸭子av | 手机看片日韩日韩 | 天天干夜夜艹 | 少妇一区二区三区四区 | 波多野结衣先锋影音 | 免费人成在线观看网站 | 鲁丝av | 精品国产乱子伦 | 好吊色视频一区二区 | 黄色av免费在线播放 | 污网在线观看 | 国产精品影院在线观看 | 亚洲精品久久一区二区三区777 | 一区二区三区亚洲 | 亚洲欧洲日本在线 | 日韩在线观看免费网站 | 精品人人妻人人澡人人爽牛牛 | 精品国产一区二区三区四区阿崩 | 麻豆成人免费视频 | 性xxxx18 | 成人乱人乱一区二区三区一级视频 | 亚洲午夜精品久久久久久app | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 亚洲AV成人无码久久 | 欧美午夜网站 | 中文字幕 视频一区 | 久久精品国产露脸对白 | 91精品国产闺蜜国产在线闺蜜 | 国产精品xxx在线观看www | 欧美偷拍第一页 | 亚洲黄色小说网 | 性生活一级大片 | 中文字幕视频在线 | www.久久99 | 亚洲一区h| 凹凸日日摸日日碰夜夜 | 亲嘴扒胸摸屁股激烈网站 | 狠狠干2023| 伊人五月婷婷 | 99精品视频在线免费观看 | 丰满人妻av一区二区三区 | 动漫艳母在线观看 | 日本亲与子乱人妻hd | 久久理论视频 | 日本少妇喂奶漫画 | 6080久久 | 国产一级大片在线观看 | 在线一区二区视频 | 精品人妻久久久久一区二区三区 | 少妇伦子伦精品无吗 | 人人上人人干 | 天堂www中文在线资源 | 99热超碰在线 | 国产人人爱 | 打美女屁股网站 | 蜜桃av在线免费观看 | 精品综合久久久久 | 影音先锋激情 | 99爱视频在线观看 | 亚洲欧美精品aaaaaa片 | 91jk制服白丝超短裙大长腿 | 成人里番精品一区二区 | 欧美大片aaa | 可以免费看的黄色网址 | 青青草91久久久久久久久 | 大黑人交交护士xxxxhd | 黄网在线免费 | 欧美特级黄色 | 天堂网站 |