Android UI设计细节问题(一)

用户头像
成都/设计爱好者/10年前/3220浏览
Android UI设计细节问题(一)

安卓ui设计不太好理解,要勇敢面对,别逃避啊,从ios入手的设计师朋友们~~~

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

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

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

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

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

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


在我看来

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

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



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

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

设计平台:Android

入手屏幕:720*1280

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

下面有一个页面:

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

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

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

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

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

下图为解释:

解决的办法

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

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

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

好在这样上中下,上中中下,上上中中下下……等布局的页面不会很多,也不会对最终的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互粉。


63
举报
|
45
分享
评论
用户头像
评论你的想法~
表情
喜欢TA的作品吗?喜欢就快来夸夸TA吧!
加载中
推荐素材
矢量立体简约UI蓝白图标
手表表盘UI系列
【新年UI图标】家具icon
【新年UI图标】珠宝icon
【新年UI图标】美食icon
原创UIUX交互橙红渐变炫酷视觉平面设计作品集模板PSD
UI_3D图标炮仗<新春促销>
【新年UI图标】游戏/娱乐icon
UI界面 组件
高级感金属拟物 UI设计组件库
【新年UI图标】美妆icon
科技医疗透明柜UI界面设计
UI_3D图标火箭炮<新春促销>
高级表盘系列UI源文件
UI应用平面图标
柠檬黄主题UI作品集模版
智能家居中心 简约 UI设计组件库
新拟态风格 UI设计组件库
UI 登录界面设计模板包
Security Camera UI kit
【新年UI图标】影音icon
盲盒APP UI设计
【新年UI图标】酒店icon
登录注册