Space控件是在Android 4.0中加入,是个空白的view,一般用于填充View组件中的间隙。

support-v4包里提供了兼容低版本的Space控件。

#源码分析 Space控件源码非常简单,先来看看

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.*/@Overridepublic 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;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(getDefaultSize2(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize2(getSuggestedMinimumHeight(), heightMeasureSpec));}
}
复制代码

该控件直接继承View组件,基本每个View控件都有onDraw方法用来绘制自身,而Space控件onDraw方法进行了一个空的实现。

Space控件在布局中只占位置,而不去绘制渲染。 组件中的间隙用Space控件填充比用其它控件填充可以提高绘制效率。

##应用场景

下面是UI提供的两张效果图,图一是没有软键盘的效果,图二是有软键盘的效果。

需要注意的是,当键盘弹出的时候,并没有把上面的toolbar挤掉。而是压缩了原有的布局。 这时候我们需要让activity配置windowSoftInputMode为adjustResize,而不是使用默认值

 <activityandroid:name="..."android:windowSoftInputMode="adjustResize" />
复制代码

中间的布局并没有完全居中,而是居中偏上。直接定义相对父容器居中不太理想, marginTop之类的又不太容易适配。 所以我采取了比较容易适配的方式。

我把中间布局上下两端用Space填充,又通过weight控制,当键盘弹出的时候会自动压缩Space空间,这样适配就非常简单了。

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_login"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.troila.tdv.ui.SettingIPActivity"><includeandroid:id="@+id/toolbar"layout="@layout/toolbar" /><android.support.v4.widget.Spaceandroid:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="4"/><LinearLayoutandroid:layout_gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:background="@drawable/setting_bg"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center"android:layout_marginBottom="@dimen/login_bottom_15"android:layout_marginTop="@dimen/login_top_15"android:textStyle="bold"android:textSize="@dimen/text_large"android:textColor="@color/white"android:text="配置服务器信息"/><include layout="@layout/divider"/><LinearLayoutandroid:paddingTop="@dimen/login_top_20"android:paddingBottom="@dimen/login_bottom_15"android:weightSum="6"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="0dp"android:layout_weight="2"android:layout_height="wrap_content"android:text="服务器IP地址"android:textColor="@color/white"android:textSize="@dimen/text_normal"android:gravity="end"/><com.troila.tdv.ui.widget.ClearableEditTextandroid:textColor="@color/white"android:inputType="numberDecimal"android:id="@+id/et_ip"android:layout_marginStart="10dp"android:layout_marginLeft="10dp"android:layout_width="0dp"android:layout_weight="3"android:digits="0123456789."android:maxLines="1"android:layout_height="wrap_content" /></LinearLayout><LinearLayoutandroid:paddingTop="@dimen/login_top_10"android:paddingBottom="@dimen/login_bottom_15"android:weightSum="6"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="0dp"android:layout_weight="2"android:textColor="@color/white"android:textSize="@dimen/text_normal"android:layout_height="wrap_content"android:text="端口号"android:gravity="end"/><com.troila.tdv.ui.widget.ClearableEditTextandroid:textColor="@color/white"android:inputType="number"android:maxLines="1"android:id="@+id/et_port"android:layout_marginStart="10dp"android:layout_marginLeft="10dp"android:layout_width="0dp"android:layout_weight="3"android:layout_height="wrap_content" /></LinearLayout><Buttonandroid:id="@+id/btn_next"android:layout_width="wrap_content"android:layout_gravity="center"android:textStyle="bold"android:text="下一步"android:layout_marginBottom="@dimen/login_bottom_15"android:background="@drawable/selector_login"android:textColor="@color/white"android:textSize="@dimen/text_normal"android:layout_height="wrap_content" /></LinearLayout><android.support.v4.widget.Spaceandroid:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="6"/>
</LinearLayout>
复制代码

更多精彩请关注微信公众账号likeDev。

[Android]Space控件的应用场景相关推荐

  1. android space控件 变成线条,学Android Space控件,只看这篇文章就行了

    Space Space is a lightweight View subclass that may be used to create gaps between components in gen ...

  2. Android神奇“控件”-----RemoteViews

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明 http://blog.csdn.net/wrg_20100512/article/details/53940485 好 ...

  3. Android 原生控件之三 ProgressBar

    Android 原生控件之三 ProgressBar 相关 来源 开始 不确定的进度 确定的进度 XML属性 1.android:animationResolution 2.android:indet ...

  4. Android开源控件收集整理

    一 .基本控件 TextView HTextView 一款支持TextView文字动画效果的Android组件库.GitHub - hanks-zyh/HTextView: Animation eff ...

  5. Android开源控件ViewPager Indicator的使用方法

     1月16日厦门 OSC 源创会火热报名中,奖品多多哦   摘要 Android开源控件ViewPager Indicator的使用介绍 ViewPagerIndicator 目录[-] 1. V ...

  6. 日历控件的android代码,Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...

  7. 时间选择控件在不同场景下的应用

    时间选择控件在产品设计中是一个非常常见且通用的元素,在各种产品中几乎都有应用.随着各种App和网站类产品在不同操作场景中的渗透发展,我们在进行产品设计时也应更追求功能实现方式的"恰如其分&q ...

  8. android 获取控件高度_安卓开发入门教程UI控件_ImageView

    什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...

  9. xamarin.android 控件,Android 库控件 - Xamarin | Microsoft Docs

    Xamarin Android 库控件Xamarin.Android Gallery control 03/15/2018 本文内容 Gallery是一种布局小组件,用于显示水平滚动列表中的项,并将当 ...

最新文章

  1. autohotkey快捷键
  2. 人脑如何模拟NLP?
  3. 7、实例:计算课程结束的日期
  4. IDEA使用从Eclipse过来的快捷键
  5. gojs 部分功能实现
  6. Flutter入门进阶之旅(七)GestureDetector
  7. 创建hadoop账号
  8. talib python文档_TALib中文文档代码实现
  9. jenkins中配置git下载代码
  10. 调试EasyDarwin开源项目EasyCamera-HK接入海康IPCamera 摄像机所遇到的大坑
  11. U盘引导启动LINUX
  12. erpc的设计和工作机制
  13. [面试笔试整理1]:深度学习机器学习面试问题准备(必会)
  14. python+tkinter仿制win10标准型计算器(中文版)完美教学
  15. 怎么在多层循环中直接跳出循环
  16. 怎么去学习绘画格子裙?该怎么画格子裙?
  17. 基于IC5000如何利用iSYSTEM winIDEA烧写+调试程序
  18. MySQL 统计上一个自然周 周一到周日的数据 为空则补0实现
  19. web前端期末大作业:旅游网页设计与实现——个人旅游博客(4页)HTML+CSS
  20. 阴霾“强势霸屏”长三角 天际上演“失踪的太阳”

热门文章

  1. android 利用eclipse观察内存变化情况
  2. PHP起点 - PHP常量
  3. org.simpleframework.xml.core.Persister
  4. MMC检测到此管理单元发生一个错误。建议关闭并重新启动MMC
  5. [翻译]XNA 3.0 Game Programming Recipes之twenty-one
  6. Log binomial 回归在队列中的应用
  7. Jenkins 设置镜像_Windows Docker Agent 镜像可以常规使用了
  8. 光流 | 基于LK(Lucas-Kanade)光流算法的运动目标检测
  9. 嵌入式笔录(3)-电容,频率与幅度基础
  10. NLP面试时,项目经历要怎么讲?