摘要:以前一直用,因為可以搞定絕大部分需求。如果只用做透明的分割線,復寫就可以實現了。列表本身如果對分割線的不敏感,復寫就可以。陰影是子打在父上的子必須設置父必須比子稍大一些,父不要用,在子上用屬性
RecycleView
以前一直用ListView,因為ListView可以搞定絕大部分需求。最近項目UI做了很大調整,需要寬度不同的Item混排,記錄一下遇到的問題。
類似這樣效果
這個很簡單,一個方法就搞定了
int maxSpanSize = 2; GridLayoutManager manager = new GridLayoutManager(mContext, maxSpanSize, GridLayoutManager.VERTICAL, false); manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { HomeItemInfo itemInfo = homeItemInfoList.get(position); if (itemInfo.isTwoItem()) { return 1;// 1/maxSpanSize, 這里代表占最大寬度的1/2 } else { return 2;// 2/maxSpanSize, 這里代表與最大寬度等寬 } } });分割線 ItemDecoration
onDrawOver
繪制在圖層的最上層
onDraw
繪制圖層在ItemView以下,所以如果繪制區域與ItemView區域相重疊,會被遮擋
getItemOffsets
設置ItemView的內嵌偏移長度
RecycleView的ItemDecoration 用起來比ListView的Divider還是復雜很多。
如果只用做透明的分割線,復寫getItemOffsets就可以實現了。列表本身如果對分割線的不敏感,復寫onDrawOver就可以。一些復雜的分割線需要同時復寫getItemOffsets、onDrawOver,計算還是有些麻煩的。下面分享下getItemOffsets的計算。
public class RecycleDivider extends RecyclerView.ItemDecoration { private int rightMargin = 100;//px, item距離右邊的margin private int leftMargin = 100;//px, item距離左邊的margin private int verticalDivider = 20;//px, 豎直方向分割線的寬度 private int horizontalDivider = 10;//px, 水平方向分割線的寬度 private ListElevationitemInfos = new ArrayList<>(); public RecycleDivider() { } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { GridLayoutManager layoutManager = (GridLayoutManager) parent.getLayoutManager(); GridLayoutManager.SpanSizeLookup lookup = layoutManager.getSpanSizeLookup(); GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) view.getLayoutParams(); int childPosition = parent.getChildAdapterPosition(view); int spanCount = layoutManager.getSpanCount(); int position = parent.getChildAdapterPosition(view);//得到它在總數里面的位置 int spanIndex = lookup.getSpanIndex(position, layoutManager.getSpanCount());//獲取每排的位置 int spanSize = lookup.getSpanSize(position);//獲取它所占有的比重,上面講的 if (layoutManager.getOrientation() == GridLayoutManager.VERTICAL) {//這里只處理豎直方向的列表 //豎直方向 if (layoutManager.getSpanSizeLookup().getSpanGroupIndex(childPosition, spanCount) == 0) {//第一排的需要上面 outRect.top = horizontalDivider; } outRect.bottom = horizontalDivider; //水平方向,這里只適合一行兩個item的情況 //每個item的寬度是均分的,如果每個item的outRect.left, outRect.right加起來的和不一樣,會導致item大小不一致 outRect.left = verticalDivider / 2; outRect.right = verticalDivider / 2; boolean isRight = spanIndex + spanSize == spanCount;//最右 boolean isLeft = spanIndex == 0;//最左 if (isLeft) { outRect.left = leftMargin; } if (isRight) { outRect.right = rightMargin; } } } }
Android從5.0開始支持陰影,5.0之前可以用CardView,但是CardView用padding實現,對界面會有影響,可以只在5.0以上支持陰影。
陰影是子View打在父View上的
子View必須設置Background
父View必須比子View稍大一些,父View不要用padding,在子View上用Margin屬性
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69225.html
摘要:是一套庫,用來渲染地球,區域地圖,和多種要素,不需要安裝任何插件就能在支持最新標準的瀏覽器上運行,支持硬件加速,非常適合動態數據在圖層上的展示,是一個跨平臺,開源,非常有前途的表現層庫。 Cesiumjs 是一套javascript庫,用來渲染3D地球,2D區域地圖,和多種GIS要素,不需要安裝任何插件就能在支持最新HTML5標準的瀏覽器上運行,支持WebGL硬件加速,非常適合動態數據...
閱讀 3457·2021-11-17 17:00
閱讀 3818·2021-08-09 13:46
閱讀 2866·2019-08-30 15:54
閱讀 627·2019-08-30 13:54
閱讀 2945·2019-08-29 17:13
閱讀 3218·2019-08-29 14:00
閱讀 2975·2019-08-29 11:11
閱讀 1379·2019-08-26 10:15