关于Android开发的一些优化建议
以下是开始Android编程的好方法:
1、找一些与你想开发的功能类似的代码;
2、调整它,尝试让它变成你想要的;
3、回顾开发中遇到的问题
4、使用StackOverflow来解决遇到的问题
对每个你想实现的东西重复上述过程。采用这种方法能够激励你,因为你在保持不断迭代更新,在这个过程里面你会学到很多。当然,当你发布应用的时候你还要去做一些更深入的东西。
从一些能够正常编译的代码到成为一个应用程序,这是一个质的飞跃,比起iOS,Android则表现的更加明显。当iOS应用发布的时候,实际上只是在一种设备之间跳跃,对iOS很多机型而言都很相似,同样大小的屏幕,并且都有良好的硬件支撑,95%上机型运行相同版本的iOS操作系统。然而在Android应用中,并不会遇到这种情况。
我们的程序必须能够应对一切:包括不同的屏幕、处理器、定制操作系统、API以及其他任何带Android操作系统的设备。
以下是我认为对Android比较好的一些建议。
目标屏幕尺寸及解决办法
在Android的大世界里有超过100种不同的屏幕尺寸,当然,解决屏幕适配的方法也很多。为了进行Android的屏幕适配,你需要确定以下两件事情:
1、对不同的屏幕分辨率和尺寸有一个良好的布局和结构来适应它
2、UI图像能够适应不同分辨率的手机
这些都是独立的任务,也许你有一个超级的tablet布局,但布局上的图片看起来很糟。接下来我会依次讨论它们。
为不同的屏幕尺寸设计布局
1、一般用ScrollView+ListView轻松搞定它
当我们有一系列不同屏幕尺寸的手机时,它们之间最大的不同就是屏幕的高度。因此ScrollView和ListView通常显示良好,虽然有时侯它们并不能完全覆盖整个屏幕。在OpenSignal中的Dashboard标签下我们可以看到所有东西,他们不需要滑动,然而对于许多高级控件来说,滑动展示并非一件坏事。如果你能够让你的应用适配各种不同尺寸的手机,那就很完美了,否则这两个控件会让你用最小的代价来保证你的应用适配大多数不同的屏幕尺寸。
Dashboard风格的就不需要滚动
2、使用文件夹结构
Android 的res文件夹结构非常强大, 它允许开发者更改图片、文字、布局文件、尺寸规格、颜色等资源。下面的例子展示了在res文件夹的用处:
在values-small文件夹中有一个 bools.xml 文件, 文件中有以下几行代码:
<resources> <bool name="small_screen">true</bool></resources>
在代码中可以进行调用:
if(getResources().getBoolean(R.bool.small_screen)){ getSupportActionBar().hide(); }
在小屏幕设备中把boolean值设为true,因而将ActionBar隐藏以节省空间。这段代码正是牛逼的ActionBarSherlock 扩展库中的一部分,稍后会谈到他。在values-sw360dp文件夹中,存放屏幕宽度为360dp的res文件。相应代码如下:
<resources> <bool name="small_screen">false</bool></resources>
在大屏幕设备上ActionBar就置为可见状态。
我们并不一定需要将 bools.xml 文件放入 values-sw400dp 文件夹中, 因为Android操作系统会自动按相应路径搜索. 例如一个设备宽 600dp (600/160=3.75 英寸) 操作系统会在values-sw600dp 和其对应文件夹中搜索 bools.xml 文件, 若没有找到则搜索 values-sw400dp 文件夹,再没找到就搜索 values-sw360dp 文件夹,以此类推。
3、160dp = 1英寸。320 dp = 2英寸。dp = dip。
4、你可以用这些目录结构技巧来应付所有资源类型。
比如xml布局用指定的大小来解决,例如layout-sw360dp目录可以适配目标宽是360dp的机型,如果还需要支持横竖屏的话可以采用以下目录:
layout-sw360dp-land layout-sw360dp-port
等等,如果你有一半的用户是阿拉伯的,那就将布局文件改为下面这样:
layout-sw360dp-land layout-sw360dp-port layout-sw360dp-land-ar layout-sw360dp-port-ar
前两个文件夹的布局可以适用于所有语言,后两个的-ar表示阿拉伯语。
5、res资源命名规则:
XXX // 没有后缀,默认适用于Nexus One,Droid 2,S2 XXX-sw360dp // 比较大的手机 – Galaxy Nexus, S3, S4 XXX-sw600dp // 7" 平板 XXX-sw720dp // 10" 平板
在Kindle设备有点不同的地方,如下所示:
XXX-large-mdpi // kindle fire 7"XXX-large-hdpi // kindle fire 7" HD
6、如果你不想这样布局的话,可以采用 dimens.xml 文件。
如果你刚才用心看了,你就会发现刚才我的values目录里有很多dimens.xml,因为我更喜欢在布局文件里设置值,在每一个xml布局文件里我通常喜欢这么做:
<ImageView android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/small_margin" android:layout_width="@dimen/dashBoardWidth" android:layout_height="@dimen/dashBoardHeight" android:id="@+id/dashboard"/>
small_margin的值是在dimen.xml文件里面定义的:
<resources> <dimen name="small_margin">4dp</dimen></resources>
这个4dp变量写在所有dimen文件里。我有一个Excel文件,里面创建了所有不同尺寸的定义。也许你会有个疑问:为什么不让Android操作系统来处理这些屏幕适配的问题?为什么不用一个values目录和一个layout目录来代替所有写死的值呢?那当然是可以的,如果设置得当,都会得到所有的尺寸,但是对于有些元素并没有那么容易就能得到尺寸。
7、让空白大小大于图像大小,让图像大小大于按钮大小。
如果将按钮,多选框,切换控件放大后是很丑的。一个100dip(0.63″)大小的按钮是不想在平板上显示为原来两倍宽度200dip(1.25″)的,原因是屏幕变大了,但是这不代表平板是给巨人用的。我们可以这么做,在按钮和图片扩展的位置添加空白。
8、用GraphicalLayout工具快速预览。
GraphicalLayout是一种WYSIWG XML编辑器。不过我喜欢直接写代码,而不是拖放控件而丢弃的编程,但在添加一些元素之后,可以在GraphicalLayout的下拉选择菜单里选择不同屏幕尺寸进行测试。
9、不要对所有的图片进行缩放。
用布局文件来适应不同屏幕尺寸的方法只是成功的一半,布局里的控件(如:图片)也要能在高分辨率屏幕下良好展示。比较简单的方式就是创建一套完整的图片目录让它们与各种drawable目录进行匹配。
drawable-sw600dp-ldpi
drawable-sw600dp-mdpi
drawable-sw600dp-hdpi
drawable-sw600dp-xhdpi
drawable-sw600dp-xxhdpi等等…
然而其实并不需要这样做,一般来说有drawble-ldpi, drawable-hdpi等目录就足够了,并不需要将所有的都加上。
10、尽量避免使用位图(bitmap)(jpg、png)。
对于一些图标来说,位图是个不错的选择,因为它们使用简单。但是如果可以避免使用位图,你可以节省很多空间,采用不同的方法也可以达到很好的结果。
11、用XML进行绘图。
位图都可以用XML绘图来代替的,虽然XML绘图不是万能的,但是它的方便性还是使我感到震惊,在Android开发文档中有详细的介绍,下面举个简单例子:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <corners android:bottomRightRadius="14dp" android:bottomLeftRadius="14dp" android:topLeftRadius="14dp" android:topRightRadius="14dp"/> <gradient android:startColor="@color/off_white" android:endColor="@color/pale_yellow" android:angle="270" android:type="linear"/> <stroke android:width="4dp" android:color="@color/osm_darkerblue"/> </shape>
上面代码定义了一个圆角矩形,一个有渐变的边(深蓝)。你可以在布局文件引用他,并且它适应任何屏幕。用它可以做出理想的按钮背景。
12、采用更多XML绘图。
再来个用XML绘图制作出能更加让你兴奋的例子,下面的雷达效果看起来是不是更加的复杂呢:
不使用位图对于UI是没有坏处的(icon图标例外)。