`
yangwencan2002
  • 浏览: 37172 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

某预上市Android阅读产品界面开发揭秘

阅读更多

刚接触android平台时,个人觉得界面布局最难。本人试图就自己最近做过的一个产品(请耐心等待,大概本年度中与大家相见),讲解其界面的制作过程,希望可以给为UI布局感到困惑的人点灵感。贴张图先:请参见附件图1(哎,抱怨一句,图有点大,Javaeye容量有限,不能直接上图)

该图的上下文是:它是一个阅读产品的截图,底部有6个操作按钮,用来切换主窗体界面,当前所在的主窗体为“我的书架”。底部6个操作按钮之上的是“我的书架”中存放的各种书籍的分类,包括“最近”、书籍、原创等分类。用户想要阅读具体某本书时,只要点击该书的封面图片,如图所示,会出现一个封面背景框,然后进入阅读界面享受阅读。业务情况大致是如此。

读者可以在往下看之前,先对这个图进行一些揣摩,如果是你自己来做这个界面布局,你将怎么实现?也许比我的做法更好J,多多交流啊。二话不说,我开始介绍我的做法:

首先,我将界面分成三大部分:头部head_bar(具体包括logo、时间、关闭按钮、“我的书架”文本等元素)、中间体部layout_body_root(具体包括书籍组件、书籍分类元素)、底部foot_bar(具体包括各种切换主窗体的操作按钮)。这3者是呈上中下的自然顺序而堆砌,故而我采用Android里最为常用的LinearLayout作为他们的布局容器,一般情况下,它支持的顺序便是线性的从左到右、由上到下的自然顺序。

接着,我们首先介绍头部head_bar的具体布局,它主要包含logo(ImageView)、时间(TextView)、关闭按钮(ImageButton)、“我的书架”文本(TextView)等元素,这时候我们应该采用什么布局容器来包容他们呢?仔细观察,他们具有如下特点:logo元素居容器左侧,时间元素居容器中部,关闭按钮居容器右侧,“我的书架”文本居时间元素的正下方。那么这样一来,我们很容易根据这个布局特点来遐想一些android里面的布局形如“android:layout_xxx”属性(也许这个很容易来自于你必须对android的布局有一些基础性的了解,所以在阅读这篇文章之前,建议你对android的布局要有个系统性的理解吧J),如此一来,根据我们之前对他们的布局描述是,比如“logo元素居容器左侧”,那么我们可以将其翻译成android:layout_alignParentLeft="true",“时间元素居容器中部”翻译成android:layout_centerHorizontal="true",“关闭按钮居容器右侧”翻译成android:layout_alignParentRight="true",“‘我的书架’文本居时间元素的正下方”翻译成android:layout_below="@+id/time"(其中@+id/time表示时间元素的id)和android:layout_centerHorizontal="true"。有了这些“android:layout_xxx”字样,自然而然其父容器当然就是RelativeLayout,因为只有RelativeLayout才真正支持这些属性。以下将具体代码贴出:

<RelativeLayout

                   android:id="@+id/head_bar"

                   android:background="@drawable/head_bar_bg"

                   android:layout_width="wrap_content"

                   android:layout_height="wrap_content">      

                   <ImageView

                            android:id="@+id/logo"

                            android:src="@drawable/logo"

                            android:layout_width="wrap_content"

                            android:layout_height="wrap_content"

                            android:layout_marginTop="2px"

                            android:layout_marginLeft="5px"

                            android:layout_alignParentLeft="true">

                   </ImageView>

                   <TextView

                            android:id="@+id/time"

                            android:layout_width="wrap_content"

                            android:layout_height="wrap_content"

                            android:layout_marginTop="4px"

                            android:layout_centerHorizontal="true">

                   </TextView>

                   <ImageButton

                            android:id="@+id/btn_close"

                            android:src="@drawable/close_btn"

                            android:layout_width="wrap_content"

                            android:layout_height="wrap_content"

                            android:layout_marginTop="3px"

                            android:layout_marginRight="2px"

                            android:layout_alignParentRight="true"

                            android:background="@null">

                   </ImageButton>

                   <TextView

                            android:id="@+id/body_title"

                            android:layout_width="wrap_content"

                            android:layout_height="wrap_content"

                            android:layout_below="@+id/time"

                            android:layout_marginTop="3px"

                            android:layout_centerHorizontal="true"

                            style="@style/bodyTitleText">

                   </TextView>

         </RelativeLayout>

其中,android:layout_marginTop等属性属于位置的微调部分。这样一来,关于头部的布局便实现了。

         接下来继续介绍中间体部的布局。注意我之前对该主窗体的描述——切换,也就是说主窗体是由多个窗体共同享受的,用户通过点击底部按钮对其进行切换。那要怎么实现切换效果,聪明的你肯定知道,比如现在要从窗体A切换到窗体B,就是通过设置A窗体为不可见,而将窗体B设置为可见,即可实现他们之间的切换。换句话说,实际上主窗体是有6个窗体(为什么是6个?因为底部按钮有6)共用使用,你可以这样假想,现在的主窗体是由窗体A放置最前面,其他窗体BCDEF都是放置在窗体A底下,被遮盖住而已。那么,我们自然而然想到android里实现遮盖布局的容器FrameLayout。以下贴出代码,其中android:layout_weight="1"很有用,它将接受底部的存在,为底部腾出一定的空间来。

    <FrameLayout

                   android:id="@+id/layout_body_root"

                   android:layout_width="fill_parent"

                   android:layout_height="fill_parent"

                   android:background="@drawable/body_bg"

                   android:layout_weight="1">

         </FrameLayout>

最后我们来讲讲底部布局实现。底部的6个按钮从左到右排列,彼此紧挨,这便是线性布局的特征。值得一提的是,底部按钮被选中时,有透明效果,其实这是将另外一张图片放置于按钮图片之上,并且设置该图片的属性:android:background="@null",也即设置上层的图片属性android:background="@null",如此一来,便可实现透明。

以下贴出代码:

    <RelativeLayout

                   android:id="@+id/foot_bar"

                   android:background="@drawable/foot_bar_bg"

                   android:layout_width="wrap_content"

                   android:layout_height="wrap_content">

                   <ImageView

                            android:id="@+id/imageView_btn_bar"

                            android:src="@drawable/nav_btn_bar"

                            android:layout_width="fill_parent"

                            android:layout_height="wrap_content">

                   </ImageView>

                   <LinearLayout

                            android:id="@+id/btn_bar"

                            android:layout_height="wrap_content"

                            android:layout_width="fill_parent">

                            <ImageButton

                                     android:id="@+id/btn_book_shelf"

                                     android:src="@drawable/nothing"

                                     android:layout_width="51px"

                                     android:layout_height="56px"

                                     android:layout_marginLeft="5px"

                                     android:background="@null"

                                     android:layout_gravity="bottom">

                            </ImageButton>

                            <ImageButton

                                     android:id="@+id/btn_book_library"

                                     android:src="@drawable/nothing"

                                     android:layout_width="51px"

                                     android:layout_height="56px"

                                     android:background="@null">

                            </ImageButton>

                            <ImageButton

                                     android:id="@+id/btn_book_collection"

                                     android:src="@drawable/nothing"

                                     android:layout_width="51px"

                                     android:layout_height="56px"

                                     android:background="@null">

                            </ImageButton>

                            <ImageButton

                                     android:id="@+id/btn_private_info"

                                     android:src="@drawable/nothing"

                                     android:layout_width="51px"

                                     android:layout_height="56px"

                                     android:background="@null">

                            </ImageButton>

                            <ImageButton

                                     android:id="@+id/btn_book_query"

                                     android:src="@drawable/nothing"

                                     android:layout_width="51px"

                                     android:layout_height="56px"

                                     android:background="@null">

                            </ImageButton>

                            <ImageButton

                                     android:id="@+id/btn_system_config"

                                     android:src="@drawable/nothing"

                                     android:layout_width="51px"

                                     android:layout_height="56px"

                                     android:background="@null">

                            </ImageButton>

                   </LinearLayout>

         </RelativeLayout>

以上,便是整体布局的总体介绍。以下再贴张eclipse的图,其中注意右侧head_bar选中的情况,head_bar对应于左侧被选中的红色框。请参见附件图2

接着,我们再来介绍书籍元素的实现,这里面还是相当有含量的。首先,我们可以看到主窗体有多个这样的书籍元素,所以我们要用组件的眼光来看待它,也就是说,把它设计成一个组件,与android平台提供的View一样的组件。这个组件主要包括元素:书名(还有,书名过长时,用省略号替代)、出版日期、书籍封面(还有,书籍封面按下的背景框)、星级评定等界面元素。这些界面元素从上至下排列,显然是线性布局LinearLayout。所以,我们初步的思想是创建一个BookInfoLayout对象,继承于LinearLayout(考虑到书籍组件中的数据是可变的,所以我们决定不再使用xml来布局,而使用Java代码来创建布局)。然后,只要顺序地创建并将各个组件添加到LinearLayout中即可。值得一提的是书籍封面按下背景框的与星级评定的实现。我们首先来看书籍封面按下背景框的实现。一般替换系统默认的背景图有2种做法,一种是代码实现法,即在实现代码中捕捉鼠标按下和松开事件,替换相应图片。基于不侵入代码想法,我决定采用xml做法,即替换被按下时,系统默认采用的图片。具体做法是在drawable文件夹下创建book_button.xml文件,具体内容如下:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/book_default" />

    <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/book_default" />

    <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/book_focus" />

    <item android:drawable="@drawable/book_default" />

</selector>

由上代码可见,我们替换了系统默认的图片,它们分别是按钮会有的四种情况,聚焦而不被按下、聚焦并且被按下、失焦而被按下、失焦并且不被按下(即普通静态情况)。再来是星际评定的情况,默认情况下无参创建的RatingBar会是大图标的,所以小图片的星星需要特别指定,具体代码如下:

RatingBar ratingBar = new RatingBar(context,null,android.R.attr.ratingBarStyleSmall);

这样一来,我们的书籍组件便创建成功了,你就可以把它当做像View一样的组件来使用了。比如你可以把它们放入GridView当中,如此一来,当读者使用横屏来看书的时候,便可以自动适应,而不需要我们再手动编程去计算横宽屏的大小来调整组件放置个数了,另外android平台还可以为GridView增加一些额外的特效,例如当打开“我的书架”窗体时,让书籍组件一个一个冒出来的效果,有时候也可以让用户眼睛为之一亮,贴张横屏的图先:请参见附件图3

  • 大小: 63.8 KB
  • 大小: 55.4 KB
  • 大小: 47.6 KB
3
1
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    android开发揭秘PDF

    第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 ...

    Android应用开发揭秘-pdf(全)

    根据提供的信息,我们可以推断出《Android应用开发揭秘》这本书主要涵盖了Android应用程序的开发流程及相关技术,适合初学者作为入门指南。尽管具体内容未给出详细章节或摘要,但基于标题、描述及常见Android开发...

    《Android应用开发揭秘》源码

     杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...

    《Android应用开发揭秘》高清电子版

    详细讲解了android框架、android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、android游戏引擎设计、android应用优化、opengl等高级...

    Android框架揭秘.pdf

    《Android框架揭秘》通过对Android系统源代码的分析,主要介绍Android框架的初始...《Android框架揭秘》不仅可以供具备一定开发经验的Android开发人员参考阅读,也可作为Android开发初学者的Android框架入门教材使用。

    Android应用开发揭秘高清版(全附带源码).part1

    Android应用开发揭秘高清版(全附带源码).讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏引擎...

    Android应用开发揭秘高清版(全附带源码).part4

    Android应用开发揭秘高清版(全附带源码).讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发 和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...

    Android应用开发揭秘高清版(全附带源码).part3

    Android应用开发揭秘高清版(全附带源码).讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发 和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...

    Android框架揭秘(完全版).pdf

    Google Android揭秘.pdf

    《Google Android揭秘》覆盖面广、结构清晰,是一本关于Android开发的全新入门指南。它面向具备基本Java知识的各层次开发人员,无论你是经验丰富的专业程序员,还是初涉编程领域的新手,都可以从《Google Android...

    Android WebView HTML界面开发 实现拨打电话

    在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在应用程序内嵌入网页内容,实现与HTML、CSS和JavaScript的交互。这篇博客主要讲解如何使用Android WebView来加载HTML界面,并实现点击HTML中的链接...

    android 漂亮的UI界面 完整的界面设计

    声明:这也是我学习时在网上下载的,鉴于分享精神,并且觉得很不错才上传...android 漂亮的UI界面 完整的界面设计 这是一个完整的UI设计,但是没写动作,这是一个公司程序员的公司任务设计,请别商用,要用请修改。。。

    Android应用开发揭秘-源码 全部代码

    《Android应用开发揭秘》源码提供了深入理解Android应用开发的宝贵资源。这本书籍通过源码分析,揭示了Android应用程序从设计到实现的全过程,旨在帮助开发者提升技能,掌握核心概念和技术。 1. **Android框架理解*...

    Android 用户登录界面

    在Android应用开发中,用户登录界面是至关重要的组成部分,它为用户提供了一个安全的入口来访问应用程序的功能和服务。本文将深入探讨如何在Android平台上构建一个用户登录界面,包括UI设计、布局管理、输入验证以及...

    android欢迎界面简单实现

    在Android应用开发中,用户界面的设计至关重要,尤其是启动时的欢迎界面,它能给用户留下深刻的第一印象。本文将详细讲解如何实现一个简单的Android欢迎界面,以增强应用程序的用户体验。 首先,我们需要理解...

    android应用开发范例精解

    第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...

    Android拨号界面

    在Android系统中,拨号界面是用户与手机通信功能交互的核心部分。它是用户拨打和接听电话的入口,设计简洁易用,集成了多种功能。本文将深入探讨Android拨号界面的相关知识点,包括其组成、功能、自定义以及API的...

    android开发之设置界面的设计

    在Android开发中,设置界面是应用中不可或缺的一部分,它为用户提供了一种自定义应用行为和配置的方式。本实例聚焦于如何设计一个精仿QQ风格的设置界面,这将涉及到多个关键知识点,包括布局管理、控件使用、数据...

    android pdf 阅读器开发, pdf demo, pdf第三方控件

    在Android平台上开发PDF阅读器是一项常见的任务,尤其对于那些希望为用户提供便捷的文档查看功能的开发者来说。PDF(Portable Document Format)是一种广泛使用的文件格式,它允许用户在各种设备上保持文档的一致...

Global site tag (gtag.js) - Google Analytics