Space is a lightweight View subclass that may be used to create gaps between components in general purpose layouts.
Space 是一个轻量级的 View 子类,可用于在通用布局中的组件之间创建间隙。
介绍
Space经常用于组件之间的缝隙,其draw()
为空,减少了绘制渲染的过程。组件之间的距离使用Space会提高了绘制效率,特别是对于动态设置间距会很方便高效。
正是因为draw()
为空,对该view没有做任务绘制渲染,所以不能对Space设置背景色。
选择
Space控件在android中有三个,分别是
android.support.v7.widget.Space
android.support.v4.widget.Space
android.widget.Space
其中v7包的Space已经废弃,android.widget.Space
是android4.0才添加的,而v4包的Space是为了兼容低版本的 android 系统。但是现在谷歌已经放弃了android2.3和3.0,所以android.support.v4.widget.Space
和android.widget.Space
任君选择其一,内部实现代码都一样,
源码分析
package android.support.v4.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
public class Space extends View {
public Space(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (getVisibility() == VISIBLE) {
setVisibility(INVISIBLE);
}
}
public Space(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public Space(Context context) {
this(context, null);
}
/**
* Draw nothing.
*
* @param canvas an unused parameter.
*/
@Override
public void draw(Canvas canvas) {
}
/**
* Compare to: {@link View#getDefaultSize(int, int)}
* If mode is AT_MOST, return the child size instead of the parent size
* (unless it is too big).
*/
private static int getDefaultSize2(int size, int measureSpec) {
int result = size;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST:
result = Math.min(size, specSize);
break;
case MeasureSpec.EXACTLY:
result = specSize;
break;
}
return result;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(
getDefaultSize2(getSuggestedMinimumWidth(), widthMeasureSpec),
getDefaultSize2(getSuggestedMinimumHeight(), heightMeasureSpec));
}
}
从源码中,我们可以看到Space的实现代码很简洁。只是对控件的显示方式默认为INVISIBLE
并重新计算view的宽高。
使用
- 在xml使用。注意,使用v4包的Space需要在gradle中导入v4包,或者导入v7、v13包。因为v7包内含有v4包,v13包内也含有v4包。
<Space
android:layout_width="1dp"
android:layout_height="10dp" />
- 在java代码使用。
Space space = new Space(this);
space.setMinimumWidth(1);
space.setMinimumHeight(10);