UI篇

截图来自《第一行代码》

Android中编写程序界面的方法有好几种。可以拖拽控件来编写布局(比如DroidDraw),也可以直接编写XML代码。但可视化编辑工具并不利于真正了解界面背后的实现原理,通常这种方式制作出的界面都不具有很好的屏幕适配性,而且当需要编写较为复杂的界面时,可视化编辑工具将很难胜任。因此推荐使用最基本的方式去实现,即编写 XML代码,然后使用可视化编辑工具预览界面。

Android中所有的控件都具有android:layout_width(指定控件的宽度)和android:layout_height(指定控件的高度)两个属性,可选值有三种 match_parent、fill_parent 和 wrap_content,其中 match_parent 和 fill_parent的意义相同,官方更加推荐使用 match_parent。match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。wrap_content表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件内容决定当前控件的大小。id给当前控件定义唯一标识符。

常用的控件:

1.TextView

属性gravity指定文字的对齐方式。可以用 | 来同时指定多个值。textSize指定文字的大小。textColor指定文字的颜色。

2.Button

设置点击事件两种方法:

1>匿名类:button = (Button) findViewById(R.id.button);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 在此处添加逻辑 } });

}

2>也可以使用实现接口的方式来进行注册,代码如下所示:

public class MainActivity extends Activity implements OnClickListener {

private Button button;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button = (Button) findViewById(R.id.button);

button.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.button:

// 在此处添加逻辑 break; default: break;

}

}

}

3 EditText

用于和用户进行交互的另一个重要控件,它允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。hint属性指定一段提示性的文本。当输入内容时,提示就会自动消失。maxLines属性指定了 EditText的最大行数,当输入的内容超过指定的行数时,文本就会向上滚动,而 EditText则不会再继续拉伸。

4 ImageView

ImageView用于在界面上展示图片。src属性给 ImageView指定一张图片。调用 ImageView的 setImageResource(R.drwable.imge)方法可以动态修改显示的图片。

5 ProgressBar

ProgressBar用于在界面上显示一个进度条,表示我们的程序正在加载一些数据。所有的Android控件都具有可见性这个属性,可以通过android:visibility 进行指定,可选值有三种,visible、invisible和 gone。visible表示控件是可见的,这个值是默认值,不指定 android:visibility时,控件都是可见的。invisible表示控件不可见,但是它仍 然占据着原来的位置和大小,可以理解成控件变成透明状态了。gone则表示控件不仅不可见, 而且不再占用任何屏幕空间。我们还可以通过代码来设置控件的可见性,使用的是 setVisibility()方法,可以传入 View.VISIBLE、View.INVISIBLE和 View.GONE三种值。通过style属性指定ProgressBar不同的样式,可以是圆形进度条, 也可以将它指定成水平进度条,max属性给进度条设置一个最大值,然后在代码中动态地更改进度条的进度。

6 AlertDialog

AlertDialog可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此一般 AlertDialog都是用于提示一些非常重要的内容或者警告信息。首先通过 AlertDialog.Builder创建出一个 AlertDialog的实例,然后可以为这个对话框设 置标题、内容、可否取消等属性,接下来调用 setPositiveButton()方法为对话框设置确定按钮 的点击事件,调用 setNegativeButton()方法设置取消按钮的点击事件,最后调用 show()方法 将对话框显示出来。

7 ProgressDialog

ProgressDialog和AlertDialog有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。不同的是,ProgressDialog会在对话框中显示一个进度条,一般是用于表示当前操作比较耗时,让用户耐心地等待。注意如果在 setCancelable()中传入了 false,表示 ProgressDialog是不能通过 Back键取消 掉的,这时你就一定要在代码中做好控制,当数据加载完成后必须要调用 ProgressDialog的 dismiss()方法来关闭对话框,否则 ProgressDialog将会一直存在。

布局:

布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,从而编写出精美的界面。当然, 布局的内部除了放置控件外,也可以放置布局,多层布局嵌套。

1 LinearLayout

orientation属性指定排列方向是 vertical或 horizontal。layout_gravity 属性指定控件在布局中的对齐方式。注意,当 LinearLayout的排列方向是 horizontal时,只有垂直方向上的对齐方式才会生效,因为此时水平方向上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定该方向上的对齐方式。同样的道理,当 LinearLayout的排列方向是 vertical时,只有水平方向上的对齐方式才会生效。layout_weight属性使用比例的方式来指定控件的大小,它在手机屏幕的适配性方面可以起到非常重要的作用。

2 RelativeLayout
通过相对定位的方式让控件出现在布局的任何位置。layout_above属性可以让一个控件位于另一个控件的上方,需要为这个属性指定相对控件 id的引用,比如@id/button3,表示让该控件位于button3的上方。layout_below表示让一个控件位于另一个控件的下方,layout_toLeftOf表示让一个控件位于另一个控件的左侧,layout_toRightOf表示让一个控件位于另一个控件的右侧。注意,当一个控件去引用另一个控件的 id时,该控件一定要定义在引用控件的后面,不然会出现找不到 id的情况。layout_alignLeft表 示让一个控件的左边缘和另一个控件的左边缘对齐,layout_alignRight表示让一个控件的右边缘和另一个控件的右边缘对齐,同理,还有 android:layout_alignTop 和 android:layout_ alignBottom.

3 FrameLayout

这种布局没有任何的定位方式,所有的控件都会摆放在布局的左上角。提到碎片的时候,可以用到它。

4 TableLayout(不用)

TableLayout使用表格的方式来排列控件,这种布局也不是很常用。在 TableLayout中每加入一个 TableRow就表示在表格中添加了一行,然后在 TableRow 中每加入一个控件,就表示在该行中加入了一列,TableRow中的控件是不能指定宽度的。layout_span="2"指定控件占据两列/行的空间。stretchColumns的值指定为 1,表示如果表格不能完全占满屏幕宽度,就将第二列进行拉伸。指定成 1就是拉伸第二列,指定成 0就是拉伸第一列。

5.百分比布局

在这个布局中可以不使用wrap_content、match_parent等方式来指定控件的大小,而是允许直接指定控件在布局中所占的百分比,可是实现平分布局甚至是任意比例分割布局的效果。百分比布局只为FrameLayout和RelativeLayout进行功能扩展,提供了ParentFrameLayout和ParentRelativeLayout两个全新布局。使用的时候需要在项目的build.gradle中添加百分比库的依赖,才能保证百分比布局在Android所有系统版本上兼容。


控件和布局的继承结构


创建自定义控件的两种方式:

1>引入布局

如果系统自带的控件并不能满足我们的需求时,可以利用上面的继承结构来创建自定义控件。

只需要通过一行include 语句将标题栏布局引入进来。

2>创建自定义控件

通过Java代码引入布局文件,设置点击事件等等。

7ListView

可以算作是最难用的控件了。,当我们的程序中有大量的数据需要展示的时候,就可以借助ListView 来实现。ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。

数组中的数据是无法直接传递给ListView 的,我们还需要借助适配器来完成。Android 中提供了很多适配器的实现类,其中最好用的就是ArrayAdapter。它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入即可。先指定ArrayAdapter 的泛型指定,然后在ArrayAdapter 的构造函数中依次传入当前上下文、ListView 子项布局的id,以及要适配的数据。这样适配器对象就构建好了。最后,还需要调用ListView 的setAdapter()方法,将构建好的适配器对象传递进去,这样ListView 和数据之间的关联就建立完成了。

可以引入缓存convertView()方法来提高ListView的运行效率。还有设置ListView的点击事件setOnItemClickListener().

8. RecyclerView

增强版的ListView,优化了ListView的不足。RecyclerView是新增的控件,因此需要在项目的build.gradle中添加相应的额依赖库才可以。

可以实现横向滚动和瀑布流布局,点击事件需要给子项具体的View去注册点击事件。

制作Nine-Patch图片

这是一种被特殊处理过的png图片,能够指定哪些区域被拉伸,哪些区域不可以。

单位和尺寸

px 是像素的意思,即屏幕中可以显示的最小元素单元,我们应用里任何可见的东西都是由一个个像素点组成的。单独一个像素点非常的微小,肉眼是无法看见的,可是当许许多多的像素点聚集到一起时,就可以拼接成五彩缤纷的图案。

pt 是磅数的意思,1 磅等于1/72 英寸,一般pt 都会作为字体的单位来使用。

dp 是密度无关像素的意思,也被称作dip,和px 相比,它在不同密度的屏幕中的显示比例将保持一致。
sp 是可伸缩像素的意思,它采用了和dp 同样的设计理念,解决了文字大小的适配问题。

dpi,Android 中的密度就是屏幕每英寸所包含的像素数,通常以dpi 为单位。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值