zoukankan      html  css  js  c++  java
  • android gridview几个重要属性(android:listSelector自带内部padding分析)

    一、android:scrollbarStyle  决定状态条的位置
        常用属性outsideOverlay,滚动条在最外层,gridview设置的padding在滚动条的内侧
     
    二、android:stretchMode  决定怎么分配剩余的空间
     
    spacingWidth
         除去griditem和gridview的左右padding,剩余的空间totalSpace用中间的空余空间去扩充,这里的中间的分割空间总数n = columns - 1,这n个空间平分totalSpace
    spacingWidthUniform
         除去griditem和gridview的左右padding,剩余的空间totalSpace用n= columns + 1个空间去平分。与spacingWidth的区别就是分割空间多了两个,就是Gridview左右两边分别有一个,而且还不包括padding。
    columnWidth
         除去gridview的左右padding和horizontalspacing,用列的宽度去填满剩余空间,就是把剩余的空间平均分给每列的宽度。
     
    三、android:listSelector   设置每个Item的按下效果,这个属性有点坑,具体如下解释

        很多时候我们都会自定义gridview的每个Item的布局,点击效果也会使用自己的,不使用系统的。正常情况下如果自定义item比每个Gridview内部的item的要小,那么我们按下gridview的item时会响应系统的那个按下效果,但是如果我们自定义的item和gridview的item一样大,而且设置了点击事件,这个时候就点不中系统的按下效果了。 那么问题来了,本来视觉上没什么问题,但是我们发现gridview的两边多了一些padding(这里即使设置了gridview的padding,这个padding也会累加),原来发现系统默认的listSelctor自带有一个padding,这个padding会累加到gridview的padding上去。

        解决上面问题的办法,自己设置一个listSelector去把系统的替换了。接下来看下这个listSelector怎么影响那个padding的。
     
    1. 系统方法AbsListView的setSelector中设置了一个变量mSelectionRightPadding 
    public void setSelector(Drawable sel) {
        if (mSelector != null) {
            mSelector.setCallback(null);
            unscheduleDrawable(mSelector);
        }
        mSelector = sel;
        Rect padding = new Rect();
        sel.getPadding(padding);
        mSelectionLeftPadding = padding.left;
        mSelectionTopPadding = padding.top;
        mSelectionRightPadding = padding.right;
        mSelectionBottomPadding = padding.bottom;
        sel.setCallback(this);
        updateSelectorState();
    }
    2. AbsListView的onMeasure中改变了mListPading的值,这里真是fuck么,搞一个临时变量来改值,搞不懂要闹那样。
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mSelector == null) {
            useDefaultSelector();
        }
        final Rect listPadding = mListPadding;
        listPadding.left = mSelectionLeftPadding + mPaddingLeft;
        listPadding.top = mSelectionTopPadding + mPaddingTop;
        listPadding.right = mSelectionRightPadding + mPaddingRight;
        listPadding.bottom = mSelectionBottomPadding + mPaddingBottom;
        // 省略其他代码
    }
    3. GridView的makeRow方法中把mListPading累加了
    private View makeRow(int startPos, int y, boolean flow) {
        final int columnWidth = mColumnWidth;
        final int horizontalSpacing = mHorizontalSpacing;
    
        final boolean isLayoutRtl = isLayoutRtl();
    
        int last;
        int nextLeft;
    
        if (isLayoutRtl) {
            nextLeft = getWidth() - mListPadding.right - columnWidth -
            ((mStretchMode == STRETCH_SPACING_UNIFORM) ? horizontalSpacing : 0);
        } else {
            nextLeft = mListPadding.left +
            ((mStretchMode == STRETCH_SPACING_UNIFORM) ? horizontalSpacing : 0);
        }  // 这里累加了,顺便可以看到spacingWidthUniform熟悉的作用
    
        if (!mStackFromBottom) {
            last = Math.min(startPos + mNumColumns, mItemCount);
        } else {
            last = startPos + 1;
            startPos = Math.max(0, startPos - mNumColumns + 1);
    
            if (last - startPos < mNumColumns) {
                final int deltaLeft = (mNumColumns - (last - startPos)) * (columnWidth +                                        horizontalSpacing);
                nextLeft += (isLayoutRtl ? -1 : +1) * deltaLeft;
            }
        }
         // 省略其他代码
    }
     
     
  • 相关阅读:
    字节面试:谈谈索引为什么能提高查询性能?
    阿里云服务器(ECS)上搭建rocketmq
    如何在 CentOS 8 上安装 Apache Maven
    147 01 Android 零基础入门 02 Java面向对象 07 Java多态 05 接口(重点)05 关于多接口中重名默认方法处理的解决方案
    146 01 Android 零基础入门 02 Java面向对象 07 Java多态 05 接口(重点)04 接口成员--默认方法 & 静态方法
    145 01 Android 零基础入门 02 Java面向对象 07 Java多态 05 接口(重点)03 接口成员--抽象方法&常量
    tcp循环发消息
    tcp基本语法
    界面开发控件DevExpress WPF开发指南
    高性能H5/JS开发框架DevExtreme 2021新版首发
  • 原文地址:https://www.cnblogs.com/popfisher/p/5191239.html
Copyright © 2011-2022 走看看