最终效果



上一节讲述了对于最顶部返回图标,钱包,账单文字的实现,这一节我们来完成剩余的部分。

我们先来分析零钱这一栏。

首先,是一个水平布局,此布局的第一个控件是一个图标,后面是两个文本控件,最后以一个右箭头图标结尾。

代码如下:



零钱一栏布局代码



首先要注意,零钱这一栏的背景是纯白色,与钱包账单那一栏的浅灰色不同,所以我们增加了一个新的背景色为纯白#FFFFFF的垂直线性布局,用来放置这些背景色为白色的菜单。

之后,就是放置零钱图标,文字,金额的水平线性布局。并且在这个水平布局中,增加了一个padding的属性。

关于padding

padding是一个用来指定与子控件间距的属性。在线性布局内的内容,像图标,文字这些,都会向内部缩进padding属性里定义的距离。

padding属性会向上下左右等距离缩进,如果只要对单个方向缩进,则可以用paddingLeft,paddingTop,paddingRight,paddingBottom分别指定左上右下的缩进距离。

之后,再来看看金额这个文本控件。它有一个gravity属性right,这指明了这个文本控件的对齐方式是右对齐,然后它的宽度是match_parent。

是不是有些奇怪?为什么它的宽度已经是填充父窗体,也就是占用剩余的控件,为什么位于它后面的右箭头还能显示出来?

这就要提一下它的另一个属性,weight了。

关于weight

weight这个属性,指定了控件的权重,可以理解为渲染的优先级。控件默认的weight,也就是不加weight属性的时候,这个值默认为0,如果设置了这个值,且该值大于0,它就会在其他控件之后渲染。这也就是为什么金额控件明明在右箭头图片控件之前声明了宽度为match_parent,却并没有影响右箭头显示的原因。

weight还有一个用法,就是指定控件占用空间的比例。

我们先来看下面的代码



weight



view是一个基础控件,所有的控件都可以认为是view的扩展升级版。因为这里不用显示文字,也不显示图片,我们就用最基本的view控件作为示例。

另外有一个background属性,这个属性指定控件的背景色,它可以接受两种属性值,一种是#FFFFFF格式的颜色值,另一种可以是@drawable/xxx格式的图片。

根据代码,我们分析出了,一个水平布局,其中有3个控件,因为第一个控件,我们称为小红吧,她的宽度为match_parent,所以在她后面的小绿与小蓝不会显示在屏幕中。就像这样



小红



我们给小红加上weight属性,赋值为1,那么界面会如何变化呢?

小红因为权重值大于后面的小绿小蓝,暂且不管她了。小绿的宽度也是match_parent,所以先渲染出了小绿,同时挤走了小蓝。小红就更没有机会出场了,惨!



小绿的天下



这时候,我们想让小红,小绿,小蓝同时登场,怎么做呢?很简单,给他们都加上weight属性,并且赋值为1。

我们再来看看效果



同时出场



看看红绿蓝同时出现在屏幕上,三分天下,不偏不倚。

是不是说因为3个权重值一样,所以他们三个都有了展示的机会呢?

并不是,仔细想一下,不给他们仨指定weight属性的时候,他们的weight默认都是0,为什么只有小红显示出来了呢?

这时候,weight并不是指定渲染顺序了,而是指定该控件在占用父控件的比例。先看他们的权重值都为1,那么父控件LinearLayout的总宽度就可以看成3份,小红小绿小蓝各占一份,所以才那么平均。

我们把小红的权重改为2看下



红2,绿1,蓝1



小红不见了,只剩小绿小蓝平分秋色。

由此可见,在宽度都为match_parent,权重最小且值相同的情况下,控件会以相同的比例渲染到屏幕上,而其他权重较大的控件会被忽略。

我们再来改一下布局,把这仨货的宽度改成0dp



宽度都为0dp,红2,绿1,蓝1



此时小红也出现了,他的宽度刚好就是他的权重,小绿小蓝也是如此。

因此得知,在控件宽度都为0dp的情况下,权重不再表示渲染顺序,而代表他们宽度占用的比例。红2,绿1,蓝1,总比例为4,红占2/4,绿蓝各占1/4

回到钱包布局中,我们注意到右箭头图标还有一个tint属性,值是一个颜色。

tint用来改变图片的颜色,假如我用了一个黑色的箭头图标,但是有一些地方,需要用白色的箭头。那么可以再让美工切一张白色的图片,但是这样有个坏处就是会增加app的体积,这时候,我们就可以用tint属性来更改图片的颜色。



增加零钱菜单栏



金额随便改吧,别人暴富可能需要一夜,咱们暴富只要分分钟!

剩下的大同小异,就不再多说了。



半成品



注意银行卡后面是没有金额的,我们复用的零钱一栏,把银行卡这栏的金额文本框隐藏掉就可以了。

android:visibility="invisible"

visibility有3个值,分别为visible,invisible,gone。控件默认的visibility是visible,也就是显示,invisible和gone都是用来隐藏控件的,不同的是gone隐藏控件的同时,不会占用空间,invisible隐藏后不会释放占用的空间。这里我们不能用gone,因为需要依靠金额文本框占位,如果用了gone,右箭头就会跑到"银行卡"三字的后面去了。



半成品代码



再来看看零钱通一栏的收益字样。

文字是橙色,所以设置了textcolor属性,主要是它有一个圆角矩形的边框。我们可以设置它的background属性,并给予一个颜色值,但是这种方式是没有圆角矩形效果的。

我们可以通过xml文件来定义一个圆角矩形,当然,也可以通过切图的方式来实现,但是用代码更加灵活。



工程目录



点击界面右方的竖排三点按钮,打开工程目录视图。之后在该视图最顶部的三点按钮出长按,出现操作菜单。

点击最后一项"Create New Folder",创建一个文件夹输入"drawable"

点击确定后,会创建出一个名为drawable的目录,进入该目录,点击第一项,"Add New XML File"创建一个xml文件,文件名随意填写,不过只能用字母和下划线与数字的组合来命名,且不能以数字开头。我们这里用shape_item_bg



shape代码



打开新建的xml文件,输入图中的代码。

代码中有两个节点

solid用来指定一个填充颜色,

coners用来定义圆角的半径。

然后点击左上角AIDE图标后的箭头



已打开的文件列表



点击main.xml回到我们的布局文件,在收益率这一栏的background里引用刚刚使用xml文件方式建立的shape背景图。

这时候编译运行一下,就可以看到圆角矩形的背景效果了,预览看不到效果。

可以看到零钱与零钱通之间有一条分割线,我们用一个带背景色的view来实现它,并加入marginLeft属性,用来指定左边的间距。

剩下的亲属卡与安全保障,相信有了之前的经验,也是轻车熟路了。

这里着重说下margin属性。

关于margin

之前跟大家说过padding,它是用来控制内边距的一个属性,而margin是用来控制外边距的。我们用个例子来说明两者的区别。



边距测试布局



我们写了一个textview,并为他设置了一个红色背景色。



测试效果



接下来,为textview添加一个padding属性



增加padding



padding效果



图中红色的部分就是textview,设置padding属性以后,可以看到红色的背景范围变大了,因为其中"今日头条"文字距离textview的padding值变大了。

接下来,加上margin属性。



加入margin



margin效果



看见textview与虚线边框有了间距,这个间距的产生就是由于margin属性的存在。



底部文字代码



最后,再加上底部的"帮助中心"等文字帮助中心与本服务由财付通提供的文字,被放在一个垂直的线性布局中,这个线性布局的对齐方式为底部对齐,高度为match_parent,他会填充界面上剩余的空间,而又因为对齐方式是底部对齐,所以帮助中心的文字出现在了屏幕的底部。

而帮助中心与本服务由财付通提供这两个textview的控件属性又略有不同。

"帮助中心"的宽度为wrap_content

"本服务由财付通提供"的宽度为match_parent



底部文字效果



而通过图片可知,两者视觉效果上似乎并没有什么差别。那他们俩确实没有差别吗?

我们来给这两个textview加上背景颜色看看吧



gravity与layout_gravity的区别



由图片可以看出,gravity与layout_gravity的区别在于,gravity是指定控件之中的内容的对齐方式。比如在textview中,本服务由财付通提供这些文字的对齐方式。

而layout_gravity,是指当前控件对于它的父控件,自身的对齐方式。在这里也就是文本为帮助中心的textview,相对于他的父控件LinearLayout的对齐方式。

至此,仿微信钱包的布局我们已经编写完成。看下效果吧。



布局完成效果



最终效果与微信的官方效果差不多有八九分相似度了吧?只是那个碍眼的标题,与不合群的状态栏,让这个效果打了些折扣。

我们来修理他俩一顿吧!



style目录



通过aide目录视图,进入到app/src/main/res/values目录下,打开styles.xml文件。

更改styles的代码代码,看下效果。



更改styles后的效果



原先的标题栏不见了,但是钱包的文字也太靠上了,甚至已经跑到了状态栏里去了。

我们再来打开布局文件,在最顶部的LinearLayout中加入fitSystemWindows属性。



加入fitSystemWindows



加入fitSystemWindows后的显示效果



这回控件的位置都已经正常了。

来说一下以上一顿猛如虎的操作,是怎么回事。

styles文件是用来控制整个app的显示风格的,比如状态栏,底部虚拟按钮,状态栏颜色,是否显示标题栏等等。

我们在styles文件中,加入了两行代码。

windowNoTitle,这一行,将标题栏给隐藏了。

windowTranslucentStatus,顾名思义,是开启透明状态栏。

这样设置之后,原先标题栏消失。布局中的内容会占用状态栏的空间,所以我们要回到布局文件中,加上fitSystemWindows属性,让控件把占用的状态栏空间给还回来。

最后,就是将状态栏的文字设置成黑色。

这一步要通过编写java代码和更改gradle文件来完成。

进入到app/src/main/java/com/mycompany/myapp目录,找到MainActivity.java文件,点击打开。



加入更改状态栏文字颜色的代码



在打开的java文件中,添加更改状态栏文字颜色的代码。

这时候编译安装,是没有效果的。

因为AIDE默认编译的版本是21对应安卓5.0,而安卓5.0还没有提供更改状态栏文字颜色的功能。

所以我们要更改编译的目标版本targetVersion

进入工程的app目录,打开build.gradle文件

找到targetSdkVersion将后面的21,更改为28。



更改targetSdkVersion



保存之后,编译运行。

至此,整个项目编写完成。

回顾一下我们这节提到的内容。

1 安卓控件的初步使用

LinearLayout

它是个线性布局,其中可以放入其他的控件,比如另一个LinearLayout,ImageView,TextView等。

通过更改orientation属性(vertical垂直,horizontal水平)来改变他的排列方向。

ImageView

这是一个用来展示图片的控件,通过设置src属性来指定其要显示的图片资源。通过tint属性来设置图片颜色。图片资源要放在drawable目录下,通过@drawable/图片名的方式引用。

TextView

文本显示控件,通过text属性来指定要显示的文本。通过textcolor来设置文本颜色。在strings.xml里定义变量,通过@string/变量名的方式复用指定的文本。

View

看起来没啥用,实际上确实没啥用。但所有的布局都是由他派生出来的,用编程的术语来讲他是一个基类,或者是父类。

2 控件的公共属性

background 设置控件的背景色,可以是一张图片(@drawable/图片名)或者是一个颜色值(#FFFFFF)

gravity 设置控件之中内容的对齐方式,左上右下(left,top,right,bottom)

layout_gravity 设置当前控件在父控件中的对齐方式,值同上。

weight 权重,单独使用时指定渲染顺序,多控件使用时,可以指定控件宽高比例。

margin 内边距

padding 外边距

3 shape

通过xml方式来绘制自定义图形,零钱通一栏中的收益字符背景就是用这种方式来制作的。通过solid来指定图形的背景色,corners指定圆角的半径。

4 build.gradle

对于这个文件,本节涉及到的东西不多,就是更改了一下targetSdkVersion,以应用对应版本的一些新功能。以后会经常接触,到后面再讲。