Android控件与布局——基础控件Space

        最近在用原生的控件和布局绘制一些界面并使用,虽然这些都是Android基本知识,但是有的时候真的感觉力不从心,感觉有必要对Android常用的控件和布局做一个系统的了解。后续一个月甚至更多的时间都会围绕这个主题展开,毕竟这里面还是有不少高级控件的,我也会尽量结合应用深入的进行了解。

项目GitHub地址入口

上一篇:Switch    下一篇:TextView

今天是六一儿童节,我们来学习一个相对简单一点的控件Space,下面就先来看看它的官方文档介绍:

/**
 * Space is a lightweight View subclass that may be used to create gaps between components
 * in general purpose layouts.
 */

Space是一个轻量级的View子类,通常将其用于创建组件之间间隙的目的

可见这个控件主要用于协助布局使用,有点类似ConstraintLayout中的guideLine的作用,这个后面我们会说到,下面我们就来看看Space的具体显示样式:

 <Space
        android:id="@+id/space_test"
        android:layout_width="20dp"
        android:layout_height="match_parent" />

运行之后,界面上什么都没有,但是在设计Design中,我们的控件是添加了的:

 

下面看一下它的构造方法一探究竟,Space一共有四个构造方法,但是都会调用下面的这个: 

 /**
     * {@inheritDoc}
     */
    public Space(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        if (getVisibility() == VISIBLE) {
            setVisibility(INVISIBLE);
        }
    }

我想,看到这里就不用多说了,Space在创建的时候默认是Invisible的,所以你设置什么也没有用,你设置了以下属性,它也会强行把你变为不可见。

android:visibility="visible"

那我们为其添加一个背景,并且在逻辑代码中把其转为可见的状态:

 <Space
        android:id="@+id/space_test"
        android:background="@color/colorPrimary"
        android:layout_width="20dp"
        android:layout_height="match_parent" />
testSpace=findViewById(R.id.space_test);
testSpace.setVisibility(View.VISIBLE);

运行之后还是什么都没有,这个时候真的要抓狂了,我们还是只能在源码中找到答案,因为背景以及显示的样式肯定是通过draw()方法绘制在出来的,所以我们重点看一下Space的draw()方法实现:

  /**
     * Draw nothing.
     *
     * @param canvas an unused parameter.
     */
    @Override
    public void draw(Canvas canvas) {
    }

WTF,它居然什么都没有干,这样也就不难解释为什么你设置什么它都不会显示出来的情况了,好了,我们再回到最开始的关于Space的文档介绍:

 /*Space is a lightweight View subclass that may be used to create gaps between components in general purpose layouts. */

Space是一个轻量级的View子类,通常将其用于创建组件之间间隙的目的

这个时候再回过来看一下,好像描述的很有道理,是一个直接继承View的轻量级的用于创建组件之间空隙的布局的控件 ,所以只需要重写onMeasure()获取尺寸即可,不要只想draw这些耗时的渲染工作。这也是这个控件的主要用途之一。单单从上面的介绍来看,这个Space完全可以用控件的以下属性来替代:

        android:layout_marginLeft="x"
        android:layout_marginTop="y"
        android:layout_marginRight="m"
        android:layout_marginBottom="n"

下面就来举一个在布局适配中经常使用的且这几个属性很难解决的布局问题:我们想在屏幕垂直方向2/5到3.5/5显示一个TextView。下面就两种方式简单理一下思路:

  • 使用布局属性:先计算屏幕的高度,计算TextView的高度,计算TextView到顶部的高度
  • 使用Space:TextView上下放一个Space,上面Space占比2/5,下面占比1.5/5即可

下面只给出方式2的实现,方式不推荐也不使用:

    <Space
        android:id="@+id/space_test_top"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2" />

    <TextView
        android:id="@+id/title_book"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1.5"
        android:gravity="center"
        android:text="我是用于Space的测试文本"
        android:textAllCaps="false"
        android:textSize="25sp"
        android:textStyle="bold" />

    <Space
        android:id="@+id/space_test_bottom"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1.5" />

 可见,使用任何布局我们都可以完成适配,并且使用Space没有渲染操作,效率很高。好了,到这里,关于Space就介绍完了。祝大家六一儿童节快乐。

注:欢迎扫码关注

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章