android ui设计技术,Android UI设计细节问题(一)

距离上一次的安卓ui设计知识分享有很长一段时间了,其实安卓ui设计有很多细节需要注意,我也一直没有时间去整理并发布上来。

今天就先给大家分享一个。

很多设计师喜欢从ios出发进行设计工作,原因是因为ios平台的单位与photoshop的单位统一,不需要去理解单位不同而带来的换算问题。

我很庆幸当年在“少林寺”苦练的时候是从安卓ui设计出师的,所以对安卓方面的研究相对会更加深刻些,个人认为能把安卓设计做好的ui 设计师,ios也不会难倒他;反之就不太好说了。

我听到很多同学说到“对于安卓,我一般都不标注,把源文件,素材拿给程序员,程序员自己去调试适配。”

我想对这类同学说:“要不然整个ui你都别做了,甚至不用上班得了。”

在我看来

第一:标注,切图,甚至是点9图的制作都应该是设计师的工作,因为只有他们最了解设计稿,最清楚布局,最终ui编程的结果是用设计师来做ui review的。

第二:你多学一方面的技术,又怎么滴呢?你还没有成为大神,不是随便画几笔点睛之笔,剩下的就拿给马仔帮你做完吧。你会标注,会切图,会做点9图,甚至懂一点代码,你比其他ui设计师就高逼格一格层级。你妈会知道的。

--------------------不太华丽的分割线---------------------

项目背景:某app的某个活动页面(由于保密协议的规定,我修改了设计稿的部分内容)

设计平台:Android

入手屏幕:720*1280

安卓ui设计师的系列知识在我之前的帖子里有详细的描述,在这里就不做说明了。

下面有一个页面:

ddf43418d06dc9b303a982cdb6d4cf27.png

分析设计稿中的素材资源,我们大概分成以下几部分:

cf9ccbf2965edba82cc18b5c778fe4aa.png

切出素材,按照安卓适配的规则,我们只切当前分辨率设计稿中的素材,并放到相应的文件夹中,即可适配当前分辨率的机器,以及当前分辨率以下分辨率的机器:

8ce37613b35beb225a4c6d1b7e780ee1.png

做好标注工作,标注数值时针对mdpi计算的:

2a3d5e997dbd68041a553e6904eb2576.png

交付给程序员所有文件,也许有的同学已经发现过这样的结果了,最终在各类分辨率机器上看到的是这样的:

00947f1a3c049c4029f58d7abbce4830.png

产生这个结果的原因是:安卓会根据分辨率相应的倍数关系缩放图片资源,比如mdpi使用的是xhdpi的资源缩小50%,hdpi使用的是xhdpi的资源缩小75%,然而mdpi机器的纵向分辨率 却不是 xhdpi机器纵向分辨率的50%,hdpi机器的纵向分辨率 却不是 xhdpi机器纵向分辨率的75%。而另外一方面,你对于各图片的各类外边距已经设定为了一个最终的固定的值。纵向分辨率的倍数关系 还  赶不上 屏幕的倍数关系。于是就出现来上图的结果。

下图为解释:

78dd9de9d5a672ea0a4e169e4b6e418c.png

解决的办法

1----ui设计解决,不靠别人:

计算纵向分辨率的倍数关系,并为其他分辨率提供素材资源

bae94b2049494bc20f5505268b7d74cd.png

这样做的结果是,对于每个分辨率的资源文件夹都放置来素材资源(只是尺寸不一样),可想而之,最终的安装文件会因为过多的图片资源而变得非常大,这一点是移动互联网开发的一个禁忌。

好在这样上中下,上中中下,上上中中下下……等布局的页面不会很多,也不会对最终的apk包产生太大的问题。

2----求助万能的程序员gg

很久之前,我意识到这个问题,也一直在用办法1,后来我开始思考,能不能用程序的办法去解决,凭着我对程序的大概了解,思路应该是 程序去读取drawable-xhdpi文件夹中的素材资源,遇到hdpi的机器,或者mdpi的机器,就将这些图片资源缩小相应的倍数(0.38倍,0.63倍),仅仅是一个乘法的计算,应该不会牺牲太大的性能,程序gg一定会同意的。带着这个思路,我去麻烦了程序员写了一个代码段,今后碰到这样的问题,就再也不用麻烦我切那么多图了,so easy~

代码段如下(代码过敏者可直接跳过):

------------

package com.nd.mms.ui;

import android.app.Activity;

import android.content.Context;

import android.graphics.Matrix;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.view.Display;

import android.view.ViewTreeObserver;

import android.view.WindowManager;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

/**

* 根据分辨率去缩放图片

*

* @author lxl

*

*/

public class ScaleImageView extends ImageView implements ViewTreeObserver.OnGlobalLayoutListener {

private final Matrix baseMatrix = new Matrix();

private final Matrix drawMatrix = new Matrix();

private final Matrix suppMatrix = new Matrix();

private boolean isfirst = true;

public ScaleImageView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context);

}

public ScaleImageView(Context context, AttributeSet attrs) {

super(context, attrs);

init(context);

}

private int screenWidth;

public ScaleImageView(Context context) {

super(context);

init(context);

}

private void init(Context context) {

WindowManager m = ((Activity) context).getWindowManager();

Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用

screenWidth = d.getWidth();

}

/**

* 依据图片宽高比例,设置图像初始缩放等级和位置

*/

public void configPosition() {

isfirst = false;

super.setScaleType(ScaleType.MATRIX);

float scale = 1.0f;

if (screenWidth == 480 || screenWidth == 320 || screenWidth == 240) {// hdpi和mdpi、ldpi

scale = 0.8f;

} else {

return;

}

Drawable d = getDrawable();

if (d == null) {

return;

}

float viewWidth = getWidth();

float viewHeight = getHeight();

// background的区域

if (this.getLayoutParams() instanceof RelativeLayout.LayoutParams) {

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) this.getLayoutParams();

viewWidth = (int) (viewWidth * scale);

viewHeight = (int) (viewHeight * scale);

params.width = (int) viewWidth;

params.height = (int) viewHeight;

this.setLayoutParams(params);

} else if (this.getLayoutParams() instanceof LinearLayout.LayoutParams) {

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) this.getLayoutParams();

viewWidth = (int) (viewWidth * scale);

viewHeight = (int) (viewHeight * scale);

params.width = (int) viewWidth;

params.height = (int) viewHeight;

this.setLayoutParams(params);

}

// //src的区域

final int drawableWidth = d.getIntrinsicWidth();

final int drawableHeight = d.getIntrinsicHeight();

baseMatrix.reset();

// 缩放

baseMatrix.postScale(scale, scale);

// 移动居中

baseMatrix.postTranslate((viewWidth - drawableWidth * scale) / 2, (viewHeight - drawableHeight * scale) / 2);

resetMatrix();

}

/**

* Resets the Matrix back to FIT_CENTER, and then displays it.s

*/

private void resetMatrix() {

if (suppMatrix == null) {

return;

}

suppMatrix.reset();

setImageMatrix(getDisplayMatrix());

}

protected Matrix getDisplayMatrix() {

drawMatrix.set(baseMatrix);

drawMatrix.postConcat(suppMatrix);

return drawMatrix;

}

@Override

public void onGlobalLayout() {

// 调整视图位置

if (isfirst) {

configPosition();

}

}

@Override

protected void onAttachedToWindow() {

super.onAttachedToWindow();

getViewTreeObserver().addOnGlobalLayoutListener(this);

}

@Override

protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

getViewTreeObserver().removeGlobalOnLayoutListener(this);

}

}

-----------

你的团队可以直接使用这段代码,你和程序员只用关注代码中的 “scale = 0.8f;”,当然这是一个最基本的值,你还可以尝试把这个 缩小倍数 调节得更大,那么产生前面问题的可能性就更小。具体的结果,你可以和程序员gg 去慢慢调试。

--------------------不太华丽的分割线---------------------

再回过头去看看设计稿,如果用sketch,这种效果图能很容易的做出来吗?

所以,还是那句话:重要的是想法,用什么工具都是浮云。

我没有在站酷上放作品,我不是什么大神,没有什么惊人之作,我只是一个爱分享,喜欢赞扬别人的默默无闻的设计师罢了,我的作品地址可以问我要,lofter互粉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值