巧用Drawable 实现Android UI 元素间距效果

源文地址: 巧用Drawable 实现Android UI 元素间距效果

在大部分的移动UI或者Web UI都是基于网格概念而设计的。这种网格一般都是有一些对其的方块组成。然后它们组合成为一个块。

使用网格这种设计原则能够有助于对齐UI元素,提升UI的一致性,同一时候还能让用户更加easy的获取UI上面包括的内容。

简而言之。网格是一个相当的强大的设计工具。

开发人员在使用网格设计原则的时候须要在UI 元素之间加入一些额外的间距,比方padding、margin或者spacing(依据你的设计方案来选择使用哪种间距) 。这些间距有利于在不同的块之间设置清晰的分隔带同一时候不会总体UI的可读性。这些间距对我们Android 开发人员来说也不陌生,我们在设计Android 界面时,也会使用View 的padding 和 margin 来达到类似的效果。在Android 开发中,为了将UI 和业务逻辑分隔,我们会使用 XML来定义UI。这样的做法对于比較固定的UI非常有效果,但当这些UI元素须要依据业务逻辑来确定隐藏或者显示的状态时,这样的做法就有点困难了。这篇文章就依据这样的情况提出了一些Android开发技巧来应对动态的网格UI。

没有间距的UI

首先让我们来看一个简单的样例。我们创建一个简单的 LinearLayout 。

然后我们在TextView (显示“Application logo”)下方再内置一个 LinearLayout 。我们在当中水平依次放置3个Button

最后得到的效果图例如以下图所看到的:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="@dimen/spacing_medium">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="128dp"
        android:background="@color/light_gray"
        android:gravity="center"
        android:text="@string/application_logo"
        android:textAppearance="@android:style/TextAppearance.Material.Display1" />

    <LinearLayout
        android:id="@+id/buttons_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_first"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/purple"
            android:text="@string/button_1" />

        <Button
            android:id="@+id/btn_second"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/indigo"
            android:text="@string/button_2" />

        <Button
            android:id="@+id/btn_third"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/teal"
            android:text="@string/button_3" />

    </LinearLayout>

</LinearLayout>

加入间距后的UI

上图的所展示的UI就是基于网格设计的。当时UI里面的元素之间都没有间距。为了让用户更好地区分这些UI元素。我们给id 为 @id/buttons_container 的 LinearLayout 加入属性 android:layout_marginTop="@dimen/spacing_medium" ;给id 为 @id/btn_first 和@id/btn_second 的两个 Button 分别加入属性 android:layout_marginRight="@dimen/spacing_medium" ;这时的UI效果例如以下图所看到的:

加入了间距之后。总体的UI效果好多了,可读性更强了。

可当我们动态的隐藏某些 View 的时候就会出现一些问题了。

我们如果第三个Button 会依据用户的设备是否安装了 Google Play Services 来决定它的展示。如果这个设备没有 Google Play Services,那我们就把这个 Button to View.GONE 的 visibility 属性设为 View.GONE, 所得效果例如以下图:

出来的效果与我们预料中的一样,第三个 Button 没有再显示了,可是第二个 Button 的右边没有与上面的TextView 右边对齐。出现这样的问题的解决办法是:拥有 margin 属性的view 会觉得margin相应方向存在邻接 view。比如。每一个拥有right/top margin view会觉得它的 right/top 方向有一个邻接 view,因此,这个相应 margin 也就会生效。就算这个邻接view已经隐藏了。

设置间距的折衷方案——Java 和 GridLayout

一个比較直接的解决方式就是在Java 代码里面手动改变对应的margin 值,但说实话这不是一个好的方案。还有一个方案就是使用可以自己主动处理元素之间的间距的布局。GridLayout 就符合这种要求。可是这个布局让人蛋疼的是元素之间的间距不能自己定义,仅仅能使用默认的间距。

设置间距的最佳方案——LinearLayout 的divider

实际上 LinearLayout 已经有一个处理这样的元素之间的间距的属性了。

这个属性却没怎么被大家发现。一直非常低调,但它的效果相当奇妙。

所以我们说的第三个方案就是使用一个固定高宽的 Drawable 作为 LinearLayout 的 元素分隔线(divider):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <size
        android:width="@dimen/spacing_medium"
        android:height="@dimen/spacing_medium" />

    <solid android:color="@android:color/transparent" />

</shape>

如今你就能够把这个新创建的 Drawable 设为LinearLayout 的 divider。这样这个Drawable 就能让元素之间产生间距了:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="@drawable/spacer_medium"
    android:orientation="vertical"
    android:padding="@dimen/spacing_medium"
    android:showDividers="middle">

    <!-- TextView -->

    <LinearLayout
        android:id="@+id/buttons_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@drawable/spacer_medium"
        android:orientation="horizontal"
        android:showDividers="middle">

        <!-- Buttons -->

    </LinearLayout>

</LinearLayout>

总结

Android 框架里面有很多的特性能够用来实现一些不常见的方案,并且最后效果出其不意。

定义 Drawable 就是当中一种途径。

假设你能吃透Android 里面的  Drawable  ,那么你的代码也可能大大地精简。

注意:文章LinearLayout的divider 属性设置是Android
API 11
之后加进去的,这意味着Android API 11之前的设备要使用这个divider须要LinearLayoutCompat

本文翻译自:Grid
Spacing on Android
     原文作者:Cyril
Mottier

时间: 2024-12-28 12:20:06

巧用Drawable 实现Android UI 元素间距效果的相关文章

向产品宣战——开发者眼中的Android UI Design

向产品宣战--开发者眼中的Android UI Design 准备了半个月,思考产品设计.交互设计,见证了公司的产品.UE和开发的撕逼,将自己的思考.感悟,整理成下文,谨代表广大程序猿,向设计狮.产品X开战.希望广大程序猿能够坚持贯彻Google的Material Design,切实认真负责的执行Android的设计思想,将MD设计带到产品中去,不做中国特色的App,将Android的开发风气带到正轨,树立正确的开发观.设计观. 希望广大程序猿朋友在博客后面留言.签名,规范Android设计.树

Android UI集锦——1.Android Drawable分类汇总(1/3)

Android UI集锦--1.Android Drawable分类汇总(1/3) -转载请注明出处coder-pig 本节引言: 小猪好像写了好几个专题,都没坚持写完,又忍不住开个新的专题了,因为最近打算 开始研究Android图形与图形图像处理,动画以及自定义View等,所以就顺道记录下, 最近事有点多,感觉情绪很低迷,心理压抑又找不到倾述的对象,这个时候程序猿肯定会说: "没对象,你自己new一个啊",好有道理,我竟无言以对...好吧!还是自己的那句座右铭: 没什么可以一蹴而就,

Android UI Design Tips 笔记

一.为什么我们要关心 UI? 如果一个应用软件具备良好的使用体验,那么: 1.  用户所感知的软件质量越好2.  将给你更高的评分3.  软件会有更好的排名4.  更多人购买或安装你的软件 二.接下来将讨论如下内容: 1.  应该遵循和不应该遵循的设计原则2.  设计理念和各种考虑因素3.  你必须使用的 UI 框架特性4.  新的 UI 设计模式5.  图标和准则 1 .应该遵循和不应该遵循的设计原则 错误的设计原则 1. 不要照搬其他平台上的 UI 设计. 应该让用户感觉是在使用一个真正的

Android UI设计规则

Android UI技巧 1.1 不该做什么 l  不要照搬你在其它平台的UI设计,应该让用户使用感觉是在真正使用一个Android软件,在你的LOGO显示和平台整体观感之间做好平衡 l  不要过度使用模态对话框 l  不要使用px单位,使用dp或者为文本使用sp l  不要使用固定的绝对定位的布局 l  不要使用太小的字体 1.2 该做什么 l  要为高分辨率的屏幕创建资源 l  要使用适当的间距 l  要正确管理活动(Activity) l  要正确处理屏幕的方向变化 l  需要点击的元素要

【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义&#183;详解

原文地址:http://www.cnblogs.com/yc-755909659/p/4290784.html 一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和menu,在程序运行中一直置于顶部,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控. 二.ActionBar的功能 用图的方式来讲解

【Android UI设计】ExpandableListView详解

一.前言 今天我们来实现一下如下这个效果,类似于QQ好友分组的UI效果,废话不多说,先上效果图: ExpandableListView是一个用来显示二级节点的listview.默认展示的是第一级的分组,点击某个分组后会展开该分组下的子列表,下面我们就一步步来实现这个效果. 二.实现过程 1.首先在activity_main.xml中指定ExpandableListView组件 <RelativeLayout xmlns:android="http://schemas.android.com

Android UI 设计规范

1. 基础常识 1.1 主流屏幕尺寸 标识 屏幕尺寸 hdpi 480 * 800 xhdpi 720 * 1280 xxhdpi 1080 * 1920 1.2 图标尺寸 标识 启动图标尺寸 菜单图标尺寸 mdpi 48 * 48 (160 DPI ) 24 * 24 hdpi 72 * 72(240 DPI) 36 * 36 xhdpi 96 * 96 (320 DPI) 48 * 48 xxhdpi 144 * 144(480 DPI ) 72 * 72 xxxhdpi 192 * 192

Android UI编程(7)——Fragment

Fragment是Activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个Activity中来创建一个多面界面并且可以在多个Activity中重用一个Fragment.也可以把Fragment认为模块化的一段Activity,它具有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除. Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的Activity的影响.例如:当Activity暂停时,

【Android UI设计与开发】顶部标题栏(一)ActionBar 奥义&#183;详解

转自:http://www.cnblogs.com/yc-755909659/p/4290784.html 一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和menu,在程序运行中一直置于顶部,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控. 二.ActionBar的功能 用图的方式来讲解它的