GVKun编程网logo

Android 应用界面设计(安卓应用界面设计)

15

如果您想了解Android应用界面设计和安卓应用界面设计的知识,那么本篇文章将是您的不二之选。我们将深入剖析Android应用界面设计的各个方面,并为您解答安卓应用界面设计的疑在这篇文章中,我们将为您

如果您想了解Android 应用界面设计安卓应用界面设计的知识,那么本篇文章将是您的不二之选。我们将深入剖析Android 应用界面设计的各个方面,并为您解答安卓应用界面设计的疑在这篇文章中,我们将为您介绍Android 应用界面设计的相关知识,同时也会详细的解释安卓应用界面设计的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

Android 应用界面设计(安卓应用界面设计)

Android 应用界面设计(安卓应用界面设计)

http://www.ifanr.com/65085

与 iOS 相比,Android 系统界面存在各种不协调,应用界面本身缺乏统一的规范。虽然 Android 的开放性为应用的自主发挥带来了最大的可能性,但如果系统本身能够提供标准的范例,也未必是一件坏事,毕竟许多应用并不一定需要独创的界面。从 Android 4.0 开始,系统界面在一致性上有了许多改善,那么 Android 应用的界面应该如何设计?如果你仔细观察 Google 近期的一系列应用上的设计,应该能发现在一些指导性的要点,而这些设计也正在被第三方应用采用。

Android 应用不应该成为 iOS 应用的翻版,那么它应该是什么样子?androiduipatterns 网站针对 Android 应用的界面设计提出了一些规范性的建议,值得参考。

主界面

应用的主界面(起始界面)应该是什么样子?看下面这个规范图。

什么应用使用这样的起始界面呢?看这三个例子: Aldiko,Evernote 和 Google+。

分界面

进入应用的分界面之后如何设计,看下面这个范例。

上面一行是操作栏:最左边是应用图标(或许包括后退键),点击回到起始界面;中间部分主要考虑于应用协调的配色;最右边是当前情景下可进行的操作。

看下面的例子

列表界面

应用可能需要处理大量的数据,而列表则是将数据规则化呈现的一种方式。列表界面应该足够清晰,为用户提供一个好的概览,同时,列表界面的操作栏应该允许用户对列表进行单项或多项操作。

两个比较好的范例是 Aldiko 和 Google Mail。需要注意的是,列表的选择框通常是在左边,但是在 Aldiko 中,文件夹图标在左边非常突出,于是 Aldiko 选择框放在了右边,达到界面上的一种平衡。

载入列表

应用可能需要处理大量的信息,比如 Twitter 的时间线。对于用户来说,这意味着列表长度几乎是无尽的。目前,许多应用已经采用了比较通用的处理方法,当下滑到列表已缓冲条目下部的边界时,自动加载更多的信息。

下面是两个例子: Android Market 和 Twitter。

长按

对某个单项信息进行操作,一种交互方式是长按。这也许不是最明显的操作,但是节省屏幕空间,也很符合“情景菜单”的理念。

下面的三个例子:Aldiko,Astro 文件管理器和 Google+。

多选操作

对列表进行多选操作,最好在列表上的项目一侧增加选择栏,如下图:

当你选定了多个项目后,屏幕下方给出操作栏。

标签

从 Android 4.0 开始,系统进一步突出了分类标签。在顶部操作栏的下面,通常会有一个标签栏,你可以点击或者左右滑动,如下图

Android Market 和 Google+ 是两个例子

虽然 Google 并没有在界面上给出太多限制,但是随着 Android 平台的发展,应用界面逐渐形成一套统一的规则和界面应该是一个趋势。这是否意味着一切应用必须遵循规范呢?那倒也未必。比如 Path 的界面,就未必符合任何平台的既成规范。如果你有开创性的界面,而且能够保证易用性,不妨去大胆创新,否则,遵循现有的良好规范可能会让你少走些许弯路。

Andriod界面设计适配和Android Studio中的资源

Andriod界面设计适配和Android Studio中的资源

    Android的碎片化已经被喷了好多年,随着国内手机厂商的崛起,碎片化也越来越严重,根据OpenSignal的最新调查,2014年市面上有18796种不同的Android设备,作为开发者,一个无法回避的难题就是需要适配各种各样奇奇怪怪的机型。

    设备机型不同必然也会导致屏幕大小和分辨率(Resolution)的不同,但是无论分辨率有多大,屏幕有多大,我们手指触控范围的大小不会发生变化,所以最优的适配方式应该是指定大小的控件在所有的设备上的显示都一样

    Android的官方文档对此也有明确的说明

When adding support for multiple screens, applications do not work directly with resolution; applications should be concerned only with screen size and density, as specified by the generalized size and density groups.

所以,适配应该与分辨率无关,只与屏幕大小和屏幕密度相关,以下是与单位相关的术语:

(1) Screen size 屏幕的尺寸,即对角线长度(单位inch-英寸)

(2) Resolution 分辨率,即屏幕的总像素点数(width * height)

(3) Screen Density屏幕密度,即每单位英寸包含的像素点数(dots/inches)

(4)Density-independent pixel (dp或dip) 密度无关像素,或者说是与屏幕密度无关的像素。标准是160dip,即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应的像素点越多。

第一、屏幕尺寸

    一般表示是手机的实际物理尺寸,屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米。比如常见的屏幕尺寸有3.5、3.7、4.2、5.0、5.5、6.0等。

第二屏幕分辨率

    屏幕上显示的像素个数,单位尺寸内像素点越多,显示的图像就越清楚。单位是px,1px=1个像素点。

   分辨率720*1280表示手机水平方向的像素为720,垂直方向为1280.

   市场上主流分辨率有:480*800、 720*1280、 1080*1920(其他的早该淘汰了,忽略不计)。

第三、屏幕密度

    表示屏幕每英寸(inch)的物理长度内包含的像素点数(dots),即屏幕像素密度。 单位是dpi( Dots Per Inch

    DPI(Dots Per Inch)是印刷行业中用来度量空间点密度用的,这个值是打印机每英寸可以喷的墨汁点数。计算机显示设备从打印机中借鉴了DPI的概念,由于计算机显示设备中的原子单位不是墨汁点而是像素,所以就创造了PPI(Pixels Per Inch),这个值是屏幕每英寸的像素数量,即像素密度(Screen density)。由于各种原因,目前PPI(主要是iOS)和DPI(主要在Android中)都会用在计算机显示设备的参数描述中,不过二者的意思是一样的,都是代表像素密度。

    Android设备用DPI来表示屏幕密度(Density),屏幕密度大就表示一个Inch包含的Dot比较多。160DPI的屏幕就表示一个Inch包含160个Dot,320DPI的屏幕表示一个Inch有320个Dot,所以说Dot的大小是不固定的。高DPI屏幕显示的元素会比较精细(看起来会比较小),低DPI屏幕显示的元素相对来说就比粗糙(看起来会比较大)。  

   通常我们说一个设备是多少寸时,指的是屏幕对角线(Diagonal)长度是多少inch,所以用对角线的像素值(px)除以对角线长度(inch),就可以计算出PPI。

                   

                                        PPI 计算公式

为了简化适配工作,Android根据屏幕大小(Inch)和屏幕密度(DPI)对设备做了如下划分:

 

    你需要把对应dpi的资源放到对应的目录就可以了,Android会根据dpi自动选择资源,目录规则如下:

  • drawable-mdpi/asset.png

  • drawable-hdpi/asset.png

  • drawable-xhdpi/asset.png

  • ...

可以看出Android中mdpi与iOS中的1x multiplier所代表的PPI是一样的,xhdpi与iOS的2x multiplier所代表的PPI一样,如图:

android-02

android-分辨率

 第四、Andriod中的单位DP与SP

4.1 DP

    既然有那么多不同分辨率、不同大小的屏幕,使用PX必然会导致适配困难,为了进一步简化适配工作,Android为我们提供了一个虚拟的像素单位 - DP 或者 DIP (Density-Independent pixel),当然也可以理解为 Device-Independent Pixel,即与设备屏幕密度无关的像素。为什么说是虚拟呢,因为它的大小不是一个物理(Phisical)值,而是由操作系统根据屏幕大小和密度动态渲染出来的。

   PX跟DP之间的换算关系很简单:

        px = dp * (dpi / 160)

举例来说,小米Pad的屏幕密度为326dpi,如果需要显示的图片大小为20dp,那么就需要提供一个 20*(326/160)=40px的图片才能达到最佳显示效果,如果还要适配一个163dpi的屏幕,那么还需要再提供一个20*(163/160)=20px的图片。

      那么一个20dp的图片,在不同设备上的显示效果如何呢?我们以iPad为例来说明。


                                                          iPad 屏幕参数

iPad2 和 iPad Retina的物理尺寸都是 9.7 inch,不同的是分辨率和PPI,一个是1024x768 / 132ppi,另一个是2048x1536 / 264ppi,分别计算一下20dp对应多少inch

ipad2 = 20 * (132 / 160) * (7.9 / (math.sqrt(1024 * 1024 + 768 * 768))) 
ipad_retina = 20 * (264 / 160) * (7.9 / (math.sqrt(2048 * 2048 + 1536 * 1536)))

计算结果都是0.1018359375,这就是dp的功能,它能保证在所有的设备上显示的大小都一样。

4.2 SP

SP 全称是 Scale-independent Pixels,用于字体大小,其概念与DP是一致的,也是为了保持设备无关。因为Android用户可以根据喜好来调整字体大小,所以要使用sp来表示字体大小。

第五、Andriod Studio中的资源

res目录下存放项目中的所有动画、图片、布局、字符串等资源。通常图标放在mipmap目录下,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下, 下面是详细描述。

5.1 动画资源(Animation Resources)

    定义预先确定的动画资源。
   Tween动画保存在res/anim/ 目录下,通过R.anim 类来访问.
   Frame动画保存在res/drawable/ 目录下,通过 R.drawable 类来访问.

   备注:动画分为两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

5.2 颜色状态列表资源

    定义随着View状态而改变的颜色资源。

    保存在 res/color/ 目录下,通过 R.color 类来访问.

5.3 icon资源

    定义应用程序使用的图标资源。

    保存在res/mipmap目录下,通过R.mipmap类来访问.

5.4 Drawable资源

    定义bitmap图像或通过XML来定义的图像资源.

    保存在res/drawable/ 目录下,通过R.drawable 类来访问.

5.5 布局资源

    定义应用程序UI的布局。
    保存在res/layout/ 目录下,通过R.layout 类来访问.

5.6 菜单资源

    定义应用程序菜单的内容。

    保存在res/menu/ 目录下,通过R.menu 类来访问.

5.7 String资源

    定义串、串数组、和数量字符串(zero, one, two, few, many, other)plurals (并且包含串的格式化以及风格).

    保存在res/values/ 目录下,通过R.stringR.array, 以及R.plurals 类来访问.

5.8 样式(Style)资源

    定义UI元素的外表与格式(look and format).

    保存在res/values/ 目录下,通过R.style 类来访问.

5.9 更多的资源类型

    定义诸如布尔值、颜色、维度、ID、整数值、整数数组、TypedArray的值.  

    保存在res/values/ 目录下,但每一种是通过不同的 R 子类(诸如 R.bool, R.color, R.dimen,  R.id, R.integer, R.array等)来访问.


参考资料:

[1] 详解Android开发中常用的 DPI/DP/SP, http://www.jianshu.com/p/913943d25829

[2] 移动开发需要知道的像素知识, http://weizhifeng.net/you-should-know-about-dpi.html

[3] 闲话Android 之 屏幕大小、pixel、分辨率、dpi、dip, http://www.cnblogs.com/zhangxinyan/p/3510604.html

[4] Andriod界面设计的分辨率和尺寸适配全攻略, http://www.25xt.com/appdesign/8693.html

[5] Resource Types, http://developer.android.com/intl/zh-cn/guide/topics/resources/available-resources.html

[6] More Resource Types, http://developer.android.com/intl/zh-cn/guide/topics/resources/more-resources.html

[7] Managing Projects Overview, http://developer.android.com/intl/zh-cn/tools/projects/index.html#ApplicationModules


Android Studio入门:Android应用界面详解(中)(Android控件详解、AdapterView及其子类)

Android Studio入门:Android应用界面详解(中)(Android控件详解、AdapterView及其子类)

Android Studio入门:Android应用界面详解(上)(View、布局管理器)

文章目录

    • Android控件详解
      • TextView(文本框)
      • EditText(输入框)
      • Button(按钮)
      • ImageView(图像视图)
      • RadioButton(单选按钮)和CheckBox(多选框)
      • ProgressBar(进度条)
      • SeekBar(拖动条)
    • AdapterView及其子类
      • ListView和ListActivity
      • Adapter接口

Android控件详解

在学习过安卓的布局方式以后,要进行UI界面的设计,还需要熟练掌握各种控件的应用。开始一个界面的设计都是先创建容器,然后不断地向容器中添加组件,最后形成一个UI界面。掌握这些基本用户界面组件是学好Android编程的基础。接下来将详细地介绍各个组件如何地使用。

TextView(文本框)

TextView直接继承了View,它还是EditText和Button两个UI组件类的父类。
TextView的作用就是在界面上显示文字,通过在布局文件当中或者在Activity中修改文字的内容。

在这里插入图片描述

在这里插入图片描述

TextView常用属性:

在这里插入图片描述

values/colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="red">#ff0000</color>
</resources>

values/dimens.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="paddingLeft">555dp</dimen>
</resources>

EditText(输入框)

EditText与TextView非常的相似,许多XML属性都能共用,与TextView的最大区别就是EditText能够接受用户的输入。
EditText的重要属性就是inputType,该属性相当于Html的<input…/>元素的type属性,用于将EditText设置为指定类型的输入组件,如手机号、密码、日期等。还有一个属性是当提示用户当前文本框要输入的内容是什么,使用android:hint=“”来提示用户,当用户点击文本框这些文字就会消失。

在这里插入图片描述

EditText的inputType属性
inputType属性在EditText输入值时, 启动虚拟键盘的风格。有时需要虚拟键盘
只能输入字符或数字。所以inputType尤为重要。
android:inputType=“textCapCharacters” 字母大写
android:inputType=“textMultiLine” 多行输入
android:inputType=“textEmailAddress” 电子邮件地址
android:inputType=“textPassword” 密码,隐藏字符
android:inputType=“textVisiblePassword” 密码,字符可见
android:inputType=“number” 数字
android:inputType=“phone” 拨号键盘
android:inputType=“datetime” 时间日期
android:inputType=“date” 日期键盘
android:inputType=“time” 时间键盘

Button(按钮)

Button继承了TextView,它主要是UI界面上生成的一个按钮,用户可以点击按钮,并且能为按钮添加onClick事件即点击事件。按钮使用起来相对容易,可以通过android:background为按钮设置背景或者自定义样式,关于Button的xml属性和TextView相似,大多数属性能够共用。

在这里插入图片描述

<Button 
android:layout_height="40dp" 
android:layout_width="wrap_content"
android:minWidth="100dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="2dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:background="@drawable/button"
android:text="@string/login"
android:textColor="#fff"
android:textSize="18sp"
android:id="@+id/login"
android:textAllCaps="true"
android:onClick=“onLoginClick” //单击事件处理方法
/>

ImageView(图像视图)

ImageView,它的主要功能是用于显示图片,任何Drawable对象都可以使用ImageView显示。ImageView还派生了ImageButton组件,因此ImageView支持的XML属性、方法,基本上也可以应用于这两个组件。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/ic_launcher" />
<ImageButton
android:id="@+id/imageButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
</LinearLayout>

在这里插入图片描述

RadioButton(单选按钮)和CheckBox(多选框)

单选按钮(RadioButton)和复选框(CheckBox)是用户界面中最普通的UI组件,它们都继承自Button类,因此可以直接使用Button支持的各种属性和方法。
RadioButton和CheckBox都多了一个可选中的功能,因此可以额外指定一个android:checked属性,用于指定RadioButton和CheckBox初始时是否被选中。
RadioButton和CheckBox的不同之处在于,一组RadioButton只能只能选中其中一个,因此RadioButton通常要和RadioGroup一起使用,用于定义一组单选按钮。

CheckBox:同时可以选择多个选项的控件
RadioButton:仅可以选择一个选项的控件
RadioGroup是RadioButton的承载体,程序运行时不可见,应用程序中可能包含一个或多个RadioGroup。
RadioGroup继承至LinearLayout,所以LinearLayout的属性RadioGroup都可以使用android:orientation属性控制RadioButton 的排列方向。
一个RadioGroup包含多个RadioButton,在每个RadioGroup中,用户仅能够选择其中一RadioButton
checked 属性:android:checked=“true” 或 “false”
RadioButton必须设置id属性,才能实现单选

<!--单选按钮-->
<RadioGroup 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 
<RadioButton
android:id="@+id/radioButton2" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:checked="true" 
android:text="男" /> 
<RadioButton 
android:id="@+id/radioButton" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="女" />
</RadioGroup>

在这里插入图片描述

<!--复选框--> 
<CheckBox 
android:id="@+id/checkBox" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:text="读书" /> 
<CheckBox 
android:id="@+id/checkBox2" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:text="看电影" />
。。。。。。

在这里插入图片描述

ProgressBar(进度条)

ProgressBar也是一组重要的组件,ProgressBar本身代表了进度条组件,它还派生了两个常用的组件:seekBar和ratingBar。ProgressBar及其子类十分相似,只是在显示上有一定的区别。
进度条通常用于向用户显示某个耗时操作完成的百分比。进度条可以动态地显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应,从而带给用户更好的体验。

在这里插入图片描述


ProgressBar分为确定的和不确定的,不确定的就是不确定一个操作需要多长时间来完成,这个时候就需要用的不确定的ProgressBar。这个是由属性android:indeterminate来控制的,如果设置为true的话,那么ProgressBar就可能是圆形的滚动条或者水平的滚动条(由样式决定)。默认情况下,如果是水平进度条,那么就是确定的。

Android支持多种风格的进度条,通过style属性可以为ProgressBar指定风格:

在这里插入图片描述


使用时候。
另外还有一种方式就是使用系统的attr:
?android:attr/progressBarStyleHorizontal"




?android:attr/progressBarStyleSmallTitle"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ProgressBar
android:id="@+id/progressBar5"android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progressBar4"android:layout_width="145dp"
android:layout_height="25dp"
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:background="@android:color/holo_green_light" />
</LinearLayout>

在这里插入图片描述


在这里插入图片描述

SeekBar(拖动条)

拖动条(SeekBar)与进度条非常相似,只是进度条采用颜色填充来表示进度完成的程度,而拖动条则通过滑块的位置来标识数字。拖动条允许用户拖动滑块来改变值,因此拖动条通常用于对系统的某种数值进行调节,比如音量调节等。
由于拖动条继承了进度条,因此进度条所支持的XML属性和方法同样适用于拖动条。进度条允许用户改变拖动条的滑块外观,改变滑块外观通过android:thumb属性来指定,这个属性指定一个Drawable对象,该对象将作为自定义滑块。为了让程序能够响应拖动条滑块位置的改变,程序可以为它绑定一个OnSeekBarchangelistener监听器。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SeekBar
android:id="@+id/seekBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:background="@android:color/holo_green_light"
android:layout_weight="1" />
</LinearLayout>

在这里插入图片描述

AdapterView及其子类

AdapterView是一组重要的组件,AdapterView本身是一个抽象基类,它派生的子类在用法上十分相似,只是显示界面上有一定的区别。AdapterView具有如下特征:
AdapterView继承了ViewGroup,它的本质是容器。
AdapterView可以包括多个“列表项”,并以合适的方式显示出来。
AdapterView显示的多个“列表项”由Adapter提供。调用AdapterView的setAdapter(Adapter)方法设置Adapter。

ListView和ListActivity

ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有的列表项。
手机屏幕空间有限,能显示的内容不多。可以借助ListView来显示更多的内容。
ListView允许用户通过上下滑动来将屏幕外的数据滚动到屏幕内,同时屏幕内原有的数据滚动出屏幕,从而显示更多的数据内容。

在这里插入图片描述


生成列表视图有如下两种方式:
直接使用ListView进行创建。
创建一个继承ListActivity的Activity(相当于该Activity显示的组件为ListView)。
一旦在程序中获得了ListView之后,接下来就需要为ListView设置它要显示的列表项。通过setAdapter(Adapter)方法为ListView提供Adapter, 由Adapter提供列表项。

使用ListActivity用来显示列表数据
ListActivity的使用步骤:
1)继承自ListActivity,如:xxx extends ListActivity
2)重写onCreate方法,在该方法中,需要做三件事情:
a)准备数据源
b)设置适配器
c)绑定适配器
3)重写点击事件
void onListItemClick(ListView l, View v, int position, long id)

public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main); 
//1.数据源
String[] data = {"武汉","北京","上海","成都","西安"};
//2.适配器
@SuppressWarnings("unchecked")
ArrayAdapter arrayAdapter = new ArrayAdapter(this, 
android.R.layout.simple_list_item_1, data);
//3.绑定
setlistadapter(arrayAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(MainActivity.this
,"点中了第"+position+"个"+" "+l.getAdapter().getItem(position).toString()
,Toast.LENGTH_LONG).show();
} }

ListView常用的XML属性

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--直接使用数组资源给list view添加列表项-->
<!--设置分割条的颜色-->
<!--设置分割条的高度--> <ListView
android:id="@+id/listview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#C4C4C4“
android:dividerHeight="1dp">
android:entries="@array/teacher_name" </ListView>
</LinearLayout>

在这里插入图片描述


values/arrays.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--添加数组元素-->
<string-array name="teacher_name">
<item>张三</item>
<item>李四</item>
<item>王五</item>
<item>赵六</item>
</string-array>
</resources>

在res文件夹下新建array.xm

在这里插入图片描述

Adapter接口

Adapter本身只是一个接口,它派生了listadapter和SpinnerAdapter两个子接口,其中listadapter为AbsListView提供列表项,而SpinnerAdapter为Absspinner提供列表项。
Adapter常用的实现类如下:
ArrayAdapter:支持泛型操作,最为简单,只能展示一行字。
SimpleAdapter:有最好的扩充性,可以自定义出各种效果。
BaseAdapter:是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性。

实例一:基于ArrayApter创建ListView

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_layout);
ListView listView=findViewById(R.id.listview1);
//定义一个数组,用来填充listview
String[] arr={"章节1","章节2","章节3"};
ArrayAdapter<String>adapter=newArrayAdapter<String>(
this,android.R.layout.simple_expandable_list_item_1,arr);
//为listview设置adapter
listView.setAdapter(adapter);
} }

在这里插入图片描述


实例二:基于SimpleAdapter创建ListView

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
</LinearLayout>

在这里插入图片描述


list_item_layout.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<!--定义一个ImageView组件,用来显示头像--> <ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!--定义一个TextView组件,用来显示名字--> <TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"/>
<!--定义一个TextView组件,用来显示人物的描述--> <TextView
android:id="@+id/dexc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"/>
</LinearLayout>
</LinearLayout>

Activity代码:


public class MainActivity extends AppCompatActivity {
//定义名字数组
private String[] name={"张三","王五","赵六"};
//定义描述任务数组
private String[] desc={"唱歌","跳舞","打球"};
//定义头像数组
private int[] icon=new int[]
{R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launch
er};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = findViewById(R.id.listview1);
//创建一个list集合,list集合的元素是MAP
List<Map<String,Object>> list=
new ArrayList<Map<String,Object>>();
for(int i=0;i<name.length;i++){
Map<String, Object> listitem=new HashMap<String, Object>();
listitem.put("icon",icon[i]);
listitem.put("name",name[i]);
listitem.put("desc",desc[i]);
list.add(listitem);
//创建一个SimpleAdapter
SimpleAdapter adapter=
new SimpleAdapter(this,list,R.layout.list_item_layout,
new String[]{"name","icon","desc"},
new int[]{R.id.name,R.id.icon,R.id.dexc});
listView.setAdapter(adapter); } }

使用SimpleAdapter最重要的是它的5个参数,尤其是后面4个,第二个参数是List<Map<String,?>>类型的集合对象,该集合中每个Map<String,?>对象生成一行;第三个参数是指定一个界面布局的ID,这里引用了一个自定义的布局list_item_layout.xml文件;第四个参数是String[]类型的参数,该参数决定提取哪些内容显示在listview的每一行;最后一个是int[]类型的参数,决定显示哪些组件。

实例三:基于BaseAdapter创建ListView
在使用SimpleAdapter时,用户可以在布局当中定义按钮,但是当用户点击时,由于点击操作被ListView的Item所覆盖,导致按钮无法获取到焦点,这时候最方便的方法就是使用灵活的适配器BaseAdapter了。BaseAdapter是最基础的Adapter,具有全能性,不会像ArrayAdapter等的封装好的类有那么多局限性,但是这样的话,使用起来自然会更加麻烦一点。

在这里插入图片描述


(1)自定义布局文件list_item_layout.xml作为每一行的布局样式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > <LinearLayout
android:layout_width="200dip"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageview"
android:layout_width="50dip"
android:layout_height="50dip" />
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingTop="8dip"
android:textSize="20sp" />
</LinearLayout>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

(2)自定义一个MyAdapter类继承自BaseAdapter,然后重写里边的方法

public class MyAdapter extends BaseAdapter {
private List<Map<String, Object>> datas;
private Context mContext;
public MyAdapter(List<Map<String, Object>> datas, Context
mContext) {
this.datas = datas;
this.mContext = mContext; }
public int getCount() {
// 返回数据的总数
return datas.size(); }
public Object getItem(int position) {
// 返回在list中指定位置的数据的内容
return datas.get(position); }
public long getItemId(int position) {
// 返回数据在list中所在的位置
return position; }
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
// 使用自定义的布局文件作为Layout
convertView = LayoutInflater.from(mContext).inflate(
R.layout.list_item_layout, null);
// 减少findView的次数
holder = new ViewHolder();
// 初始化布局中的元素
holder.mImageView
convertView.findViewById(R.id.imageview);
holder.mTextView =
convertView.findViewById(R.id.textview);
holder.mButton =
convertView.findViewById(R.id.button);
holder.mButton.setonClickListener(new View.OnClickListener() {
public void onClick(View view) {
Toast.makeText(mContext,"你点了我!哈哈",
Toast.LENGTH_SHORT).show(); }
});
convertView.setTag(holder); } else {
holder = (ViewHolder) convertView.getTag(); }
// 从传入的数据中提取数据并绑定到指定的view中
holder.mImageView.setimageResource((Integer) datas.
get(position).get("img"));
holder.mTextView.setText(datas.get(position).get("title").
toString());
holder.mButton.setText(datas.get(position).get("button").
toString());
return convertView; }
static class ViewHolder {
ImageView mImageView;
TextView mTextView;
Button mButton; } }

(3)MainActivity中添加数据以及为ListView添加上文自定义的Adapter

public class MainActivity extends Activity {
private ListView mListView;
private MyAdapter myAdapter;
private List<Map<String, Object>> list =
new ArrayList<Map<String, Object>>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
mListView =
findViewById(R.id.listview);
myAdapter = new MyAdapter(list, this);
mListView.setAdapter(myAdapter); }
private void initData() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("img", R.drawable.android);
map.put("title", "Android");
map.put("button", "学习");
list.add(map);
map = new HashMap<String, Object>();
map.put("img", R.drawable.java1);
map.put("title", "JAVA");
map.put("button", "学习");
list.add(map);
map = new HashMap<String, Object>();
map.put("img", R.drawable.html5);
map.put("title", "HTML5");
map.put("button", "学习");
list.add(map);
//。。。。。。
} }

(4)关于ViewHolder
在itemView相同的情况下,每一次创建itemView的时候都要重复的去绑定控件(findViewById)。重复的findViewById是很消耗性能的,特别是在listView中的itemView很多的情况下。
View中的setTag(Onbect),可以给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。
setTag()是把Object对象作为参数对view进行存储的。也就是说,我们要把一个itemView中的控件抽取成一个Object,因此创建了一个ViewHolder。
在第一次创建itemView的时候,完成对控件的绑定,同时控件作为一个 object–holder , 把 它 通 过 setTag() 存到itemView中,第二次使用的时候就可以通过getTag()把holder取出来直接使用,也就是说,在list中itemView相同的情况下,我们只进行了一次的控件资源绑定。

在这里插入图片描述


Spinner:能够从多个选项中选一选项的控件,类似于桌面程序的组合框(ComboBox),但没有组合框的下拉菜单,而是使用浮动菜单为用户提供选择
使用ArrayAdapter数组适配器,将界面控件和底层数据绑定在一起
为在代码中使用Spinner 组件,需要引入:
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import java.util.ArrayList;
import java.util.List;

<Spinner 
android:id="@+id/spCity“
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:prompt="请选择城市" 
android:spinnerMode="dialog"
android:entries="@array/cities"/
>

entries属性,spinner列表中的数据
spinnerMode属性,spinner显示为对话框或者是下拉框形式;android:spinnerMode=[“dialog”|“dropdown”]
prompt属性表示spinner列表上方的提示
android:prompt 必须要引用 strings.xml 中资源 ID ,而不能在这里直接用 raw text 。
只有在android:spinnerMode=“dialog”时才能显示文字

spinnerMode=“dialog”

在这里插入图片描述


spinnerMode=“dropdown”

在这里插入图片描述


values/arrays.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="cities">
<item >武汉</item>
<item >北京</item>
<item >上海</item>
<item >成都</item>
<item >西安</item>
</string-array>
</resources>

Spinner设置事件监听器的方法 ItemSelected

spinner.setonItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) { 
// Todo Auto-generated method stub
Toast.makeText(MainActivity.this, adapter.getItem(arg2), Toast.LENGTH_LONG).show();
// list.get(arg2)
// arg0.getAdapter().getItem(arg2).toString()
}
@Override
public void onnothingSelected(AdapterView<?> arg0) {
// Todo Auto-generated method stub
}
});
arg0表示适配器控件,即spinner; arg1表示适配器内部的控件,即spinner中的子项; arg2表 示选中子项的位置position ; arg3表示子项的ID

Android Studio:基本UI界面设计 (详细)

Android Studio:基本UI界面设计 (详细)

Android Studio:基本UI界面设计 (详细)

https://blog.csdn.net/reborncgy/article/details/78695838?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

 

android ui界面设计参数讲解

android ui界面设计参数讲解

android:layout_width    设置组件的宽度
   android:layout_height    设置组件的高度
   android:id                       给组件定义一个id值,供后期使用
   android:background       设置组件的背景颜色或背景图片
   android:text                   设置组件的显示文字
   android:textColor           设置组件的显示文字的颜色
   android:layout_below     组件在参考组件的下面
   android:alignTop            同指定组件的顶平行

android:maxLength="6"     限制输入字数

android:digits=''012356789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ''限制输入数字和大写小写字母

1. 开发更简单,执行速度高效。 2. 输入法默认会根据情况变动,比如说设置为numeric后输入法会自动仅显示数字,不会出现Qwerty中的字母。

  下面我们通过EditText的layout xml文件中的相关属性来实现:

  1. 密码框属性 android:password=''true''  这条可以让EditText显示的内容自动为 星号,输入时内容会在1秒内变成*字样。

  2. 纯数字 android:numeric=''true'' 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入

  3. 仅允许 android:capitalize=''cwj1987'' 这样仅允许接受输入cwj1987,一般用于密码验证

  下面是一些扩展的风格属性

  android:editable=''false'' 设置EditText不可编辑

  android:singleLine=''true'' 强制输入的内容在单行

  android:ellipsize=''end'' 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时。
 

android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)
android:autoText 如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。
android:bufferType 指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1这里2
android:capitalize 设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditText此属性说明。
android:cursorVisible 设定光标为显示/隐藏,默认显示。
android:digits 设置允许输入哪些字符。如“1234567890.+-*/%\n()”
android:drawableBottom 在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。
android:drawableLeft 在text的左边输出一个drawable,如图片。
android:drawablePadding 设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。
android:drawableRight 在text的右边输出一个drawable,如图片。
android:drawableTop 在text的正上方输出一个drawable,如图片。
android:editable 设置是否可编辑。这里无效果,参见EditView。
android:editorExtras 设置文本的额外的输入数据。在EditView再讨论。
android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置:”start”—–省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)
android:freezesText 设置保存文本的内容以及光标的位置。参见:这里
android:gravity 设置文本位置,如设置成“center”,文本将居中显示。
android:hint Text为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在EditView中使用,但是这里也可以用。
android:imeOptions 附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditText中再详细说明,此处无用。
android:imeActionId 设置IME动作ID。在EditText再做说明,可以先看这篇帖子:这里
android:imeActionLabel 设置IME动作标签。在EditText再做说明。
android:includeFontPadding 设置文本是否包含顶部和底部额外空白,默认为true。
android:inputMethod 为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。
android:inputType 设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditText中再详细说明,这里无效果。
android:linksClickable 设置链接是否点击连接,即使设置了autoLink。
android:marqueeRepeatLimit 在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。
android:ems 设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度,如图:
android:maxEms 设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:minEms 设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:maxLength 限制显示的文本长度,超出部分不显示。
android:lines 设置文本的行数,设置两行就显示两行,即使第二行没有数据。
android:maxLines 设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。
android:minLines 设置文本的最小行数,与lines类似。
android:lineSpacingExtra 设置行间距。
android:lineSpacingMultiplier 设置行间距的倍数。如”1.2”
android:numeric 如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EditText将详细说明。
android:password 以小点”.”显示文本
android:phoneNumber 设置为电话号码的输入方式。
android:privateImeOptions 设置输入法选项,此处无用,在EditText将进一步讨论。
android:scrollHorizontally 设置文本超出TextView的宽度的情况下,是否出现横拉条。
android:selectAllOnFocus 如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。EditText中设置后无效果。
android:shadowColor 指定文本阴影的颜色,需要与shadowRadius一起使用。效果:
android:shadowDx 设置阴影横向坐标开始位置。
android:shadowDy 设置阴影纵向坐标开始位置。
android:shadowRadius 设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。
android:singleLine 设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行
android:text 设置显示文本.
android:textAppearance
设置文字外观。如“?android:attr/textAppearanceLargeInverse

”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可设置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse

android:textColor 设置文本颜色
android:textColorHighlight 被选中文字的底色,默认为蓝色
android:textColorHint 设置提示信息文字的颜色,默认为灰色。与hint一起使用。
android:textColorLink 文字链接的颜色.
android:textScaleX 设置文字之间间隔,默认为1.0f。分别设置0.5f/1.0f/1.5f/2.0f效果如下:
android:textSize 设置文字大小,推荐度量单位”sp”,如”15sp”
android:textStyle 设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开
android:typeface 设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]
android:height 设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)
android:maxHeight 设置文本区域的最大高度
android:minHeight 设置文本区域的最小高度
android:width 设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width的区别看这里
android:maxWidth 设置文本区域的最大宽度
android:minWidth 设置文本区域的最小宽度

今天的关于Android 应用界面设计安卓应用界面设计的分享已经结束,谢谢您的关注,如果想了解更多关于Andriod界面设计适配和Android Studio中的资源、Android Studio入门:Android应用界面详解(中)(Android控件详解、AdapterView及其子类)、Android Studio:基本UI界面设计 (详细)、android ui界面设计参数讲解的相关知识,请在本站进行查询。

本文标签: