一、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;
}
} // 省略其他代码 }

更多相关文章

  1. Android电话系统之GSMCallTracker
  2. Fuschia 是什么样的一个操作系统
  3. 从零开始--系统深入学习android
  4. Android:adb发送系统广播及自定义广播
  5. Android面临困境:系统现碎片化 开发者兴趣下滑
  6. Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
  7. Android之系统启动机理
  8. Android系统移植:开发概述
  9. Android 系统蓝牙 控制手机端音乐暂停 (AVRCP)

随机推荐

  1. Android使用StaticLayout实现文本绘制自
  2. [置顶] (柯昌合)Android Sqlite 持久化框
  3. Android 相机2之常用工具代码(预览方向、
  4. android实现前置后置摄像头相互切换
  5. android intent 传数据
  6. 文件多线程下载实现
  7. android SDK manager 闪退
  8. Android查询所有联系人和根据号码查询联
  9. android系统常用Uri
  10. Android01--开发环境搭建