前言
郭神出品,必属精品,记得在刚做Android开发的时候,当时买了Android第一行代码第一版,看了之后感觉内容通俗易懂,收获颇多,当时还不知道作者是郭神,后来在CSDN上看了很多他写的文章,发现原来作者就是郭神,现在他出了第二版,果断将书买了回来,书很早就看完了,今天将书籍翻了出来看了一下,决定将自己的想法给记录一下.
第三章 软件也要拼脸蛋------UI开发的点点滴滴
3.1 如何编写程序界面
- Android中有多种编写程序界面的方式可供选择,Android Studio中提供了相应的可视化编辑器,允许我们使用拖放控件的方式来编写布局,并能在视图上直接修改空间的额属性.
- 不过在我们的日常开发当中,都会使用XML的方式来编写界面
3.2 常用控件的使用方法
Android提供了大量的UI控件,合理地使用这些控件就可以非常轻松地编写出相当不错的界面.
3.2.1 TextView
3.2.2 Button
3.2.3 EditText
3.2.4 ImageView
3.2.5 ProgressBar
3.2.6 AlertDialog
3.2.7 ProgressDialog
以上控件比较简单不做过多解释,可以自己百度搜索用法
3.3详解4中基本布局
3.3.1 线性布局
- LinearLayout又称作线性布局,是一种非常常用的布局,正如它的名字所描述的一样,这个布局会将它所包含的控件在线性方向上依次排列
3.3.2 相对布局
- RelativeLayout又称作相对布局,也是一种非常常用的布局,和LinearLayout的排列规则不同,RelativeLayout显得更加随意一些,它可以通过相对定位的方式让控件出现在布局的任何位置.也正因为如此,RelativeLayout中的属性非常多
3.3.3 帧布局
- FrameLayout又称作帧布局,他相比于前面两种布局就简单太多了,因此它的应用场景也少了很多,这种个布局没有方便的定位方式,所有的控件都会默认摆放在布局的左上角
3.3.4 百分比布局
- 前面介绍的3中布局是从Android1.0版本中就开始支持了,一直沿用到现在,可以说是满足绝大多数场景的界面涉及需求,不过细心的你会发现了,只有LinearLayout支持使用Layout_weight属性来实现按比例指定控件大小的功能,其他两种布局都不支持.比如说,如果想用RelativeLayout来实现两个按钮平分布局宽度的效果,则是比较困难的.
- 为此,Android引入了一种全新的布局方式来解决此问题------百分比布局.在这种布局中,我们可以不使用wrap_content,match_parent等方式来指定控件的大小,而是允许直接指定控件在布局中所占的百分比,这样的话就可以轻松实现平分布局甚至是任意比例分割布局的效果了.
- 由于LinearLayout本身已经支持按比例指定控件的大小了,因此百分比布局只为FrameLayout和RelativeLayout进行了功能扩展,提供了PercentFrameLayout和PercentRelativeLayout这两个全新的布局
使用
打开app/build.gradle文件,在dependencies闭包中添加如下内容:
dependencies {
implementation 'com.android.support:percent:26.1.0'
}
PercentFrameLayout的使用如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.dream.helloworld.MainActivity">
<Button
android:text="button1"
app:layout_heightPercent="50%"
app:layout_widthPercent="50%"/>
<Button
android:text="button2"
android:layout_gravity="right"
app:layout_heightPercent="50%"
app:layout_widthPercent="50%"/>
<Button
android:text="button3"
android:layout_gravity="bottom"
app:layout_heightPercent="50%"
app:layout_widthPercent="50%"/>
<Button
android:text="button4"
android:layout_gravity="bottom|right"
app:layout_heightPercent="50%"
app:layout_widthPercent="50%"/>
</android.support.percent.PercentFrameLayout>
PercentRelativeLayout使用如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.dream.helloworld.MainActivity">
<Button
android:text="button1"
app:layout_heightPercent="50%"
app:layout_widthPercent="50%"/>
<Button
android:text="button2"
android:layout_alignParentRight="true"
app:layout_heightPercent="50%"
app:layout_widthPercent="50%"/>
<Button
android:text="button3"
android:layout_alignParentBottom="true"
app:layout_heightPercent="50%"
app:layout_widthPercent="50%"/>
<Button
android:text="button4"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
app:layout_heightPercent="50%"
app:layout_widthPercent="50%"/>
</android.support.percent.PercentRelativeLayout>
两种布局运行后的效果:
效果图
3.4 系统控件不够用? 创建自定义控件
3.4.1 引入布局
- 如果使用过iPhone应该会知道,几乎每一个iPhone应用的界面顶部都会有一个标题栏,标题栏上会有一到两个按钮可用于返回或其他操作(iPhone没有实体返回键),现在很多Android程序也都喜欢模仿iPhone的风格,在界面的顶部放置一个标题栏.虽然Android系统已经给每个活动提供了标题栏功能,但这里我们为了实现iPhone的这种效果,而是创建一个自定义标题栏,这个时候我们就可以使用include标签进行引用
如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/title"/>
</LinearLayout>
3.4.2 创建自定义组合控件
引用布局的技巧确实解决了重复编写布局代码的问题,但是如果布局中有一些控件要求 能够响应事件,我们还是需要在每个活动中为这些控件单独编写一次事件注册的代码.所以遇到这种情况我们最好是使用自定义组合控件的方式来解决
如下所示:
public class TitleLayout extends LinearLayout{
public TitleLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title,this,true);
Button titleBack = findViewById(R.id.title_back);
Button titleEdit = findViewById(R.id.title_edit);
titleBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
((AppCompatActivity)getContext()).finish();
}
});
titleEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getContext(), "You clicked Edit button", Toast.LENGTH_SHORT).show();
}
});
}
}
3.5 最常用和最难用的控件-----ListView
目前已被RecyclerView给取代,ListView能实现的功能RecyclerView都能实现,而且性能更好.
3.6 更强大的滚动控件------RecyclerView
3.6.1 RecyclerView的基本用法
3.6.2 实现横向滚动和瀑布流布局
3.6.3 RecyclerView的点击事件
以上内容比较简单不做过多介绍,有需要可以自己百度学习
3.7 编写界面的最佳实践
既然已经学习了那么多UI开发的知识,也是时候实战一下了,这次我们要综合运用前面所学的大量内容来编写一个较为复杂且相当美观的聊天界面
3.7.1 制作Nine-Patch图片
Android系统由于系统和分辨率的多样性,界面适配是让开发者头疼的问题。往往一个界面在A分辨率上运行的很漂亮,放到B分辨率上就没法看。对于同一张切图,很多控件的切图文件在被放大拉伸后,边角会模糊失真。对不同的分辨率制作多个切图,又增大了安装包的大小。
针对这个问题,Android专门制作了一种.9.PNG格式来解决这个问题,这种格式的图片能根据屏幕大小和分辨率自动填充满,而且不失真,在我们的日常开发中,一般做控件背景的单色图一张.9的就够了,其他的就需要切多套图。
网友评论