国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

RecycleView 與 Elevation

neu / 2604人閱讀

摘要:以前一直用,因為可以搞定絕大部分需求。如果只用做透明的分割線,復寫就可以實現了。列表本身如果對分割線的不敏感,復寫就可以。陰影是子打在父上的子必須設置父必須比子稍大一些,父不要用,在子上用屬性

RecycleView

以前一直用ListView,因為ListView可以搞定絕大部分需求。最近項目UI做了很大調整,需要寬度不同的Item混排,記錄一下遇到的問題。
類似這樣效果

寬度不同的Item混排-SpanSizeLookup

這個很簡單,一個方法就搞定了

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 List itemInfos = 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;
            }
        }
    }
}
Elevation

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

相關文章

  • 數字高程模型(Digital Elevation Model) DEM 切片以及數據發布展示學習筆

    摘要:是一套庫,用來渲染地球,區域地圖,和多種要素,不需要安裝任何插件就能在支持最新標準的瀏覽器上運行,支持硬件加速,非常適合動態數據在圖層上的展示,是一個跨平臺,開源,非常有前途的表現層庫。 Cesiumjs 是一套javascript庫,用來渲染3D地球,2D區域地圖,和多種GIS要素,不需要安裝任何插件就能在支持最新HTML5標準的瀏覽器上運行,支持WebGL硬件加速,非常適合動態數據...

    FleyX 評論0 收藏0

發表評論

0條評論

neu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<