想必大家对安卓UI都有了许多的见解,在今天这个处处强调「用户体验」的设计时代,可以说谁抓住了用户的感官,谁就获得了产品在市场中的先机。
乔布斯语:“用户确实是会以貌取物的。”在Android开发设计中,虽然大多数开发者都不做美工的工作,但为了更好的实现个人发展和沟通能力,要求大家必须对UI设计有所涉猎。今天,希望从一些简单基础的实例入手分析,和大家一起讨论UI的优化、改良。
【一】优化资源
相信没有谁在编程过程中没有使用过Drawable资源。那么,这些res目录下的,貌似重复的文件夹具体意思是什么?具体覆盖的资源指向是什么?是哪一个版本提供的?相信没有多少人能注意到这些细节。但细节决定品质,想想你手机上被你删除的程序,有多少是因为一点小bug就被抛弃了?所以我们有必要弄清它们的意义。
●res/drawable-ldpi 为120dpi左右的屏幕提供低密度资源。
●res/drawable-mdpi 为160dpi左右的屏幕提供中等密度资源。
●res/drawable-hdpi 为240dpi左右的屏幕提供高密度资源。
●res/drawable-xdpi 为320dpi左右的屏幕提供超高密度资源。
因而,我们在做设计时候的归类,要根据具体的目标用户群而设计不同分辨率的图片。否则会遇到图片失真残影甚至内存溢出的问题。
【二】优化代码
对于一些用户程序,可能无法通过优化UI来使得它支持所有可能的屏幕尺寸。可以通过在清单文件中使用support-screens元素来指定应用程序可以运行在哪些屏幕上。
<support-screen
android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"/>
*false的值并不是代表不支持,而是指强制Android使用兼容性缩放比例来尝试正确地缩放应用程序的UI。这通产会导致UI图像质量的下降,并且会显示图像伪影。
【三】更换图片处理方式
我们已经知道,Android提供了强大的NinePatch PNG 工具来使编辑者能够更方便的使用图形界面的设计。在一些图形基本构建中,我们应该尽可能的使用实时的渲染,而不是使用已有的图片。这样不仅缩小了程序的空间占有率,同时使图形处理的问题不再成为考虑的因素。
例如,下面这段代码段显示了一个矩形Drawable,它具有填充色、圆角、轮廓线和内边距。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient android:startColor="#c0000000" android:endColor="#c0000000"
android:angle="90" /><!--背景颜色渐变 -->
<solid android:color="#00ffffff" /><!-- 背景的填充颜色 -->
<stroke android:width="3dp" android:color="#00FF00" /><!-- 描边,width是边得宽度,color是颜色 -->
<corners android:radius="10dp" /><!-- 边角圆弧的半径 -->
<padding
android:left="3dp"
android:top="3dp"
android:right="3dp"
android:bottom="3dp" /><!-- 四周留出来的空白 -->
</shape>
同样,我们也可以使用动画了填充布局。比如,我们精彩在应用程序进入时看到播放的动画,就是使用了这个原理。下面,我们来做一段动画:
先在drawable中使用一段代码,为了简单,我们只放入两张图片。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:duration="400" android:drawable="@drawable/back_night" />
<item android:duration="400" android:drawable="@drawable/app_icon" />
</animation-list>
item表示每一帧的动画图片。duration属性指定了单帧停留的时间。
接着我们在java代码中onCreat()方法中指定注册动画播放。
mButton=(Button) findViewById(R.id.button1);
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
mButton.setBackgroundResource(R.drawable.demo);
AnimationDrawable mButton_anim=(AnimationDrawable) mButton.getBackground();
mButton_anim.start();
}
}, 50);
}
这样就OK了。之所以把它放在Handler中执行,是因为普通的start并不能成功,因为还没有完全与控件绑定。
〖转载请注明出处 lansubao专栏〗