主要讲解:dimens/style/theme/shapedrawable/statelistdrawable/layerdrawable/assets 等资源的使用,以及不同设备的适应问题。
一、Android Studio工程目录结构
关于Android Studio目录结构的说明:http://developer.android.com/tools/projects/index.html
新建的空工程:
.idea/
IntelliJ的配置文件app/
新建工程自动生成的Modulegradle/
包含gradle-wrapper文件.gitignore
当使用Android Studio自带的Git功能时会用到build.gradle
gradle编译系统的重要配置文件,可以由程序员自己修改gradle.properties
gradlew
类UNIX系统下的Gadle启动脚本gradlew.bat
Windows系统下Gradle的启动脚本local.properties
指定sdk的目录.iml
每个模块目录下也有对应文件,存放模块具体信息settings.gradle
指定工程包含哪些模块
新建的空模块:
- build
- generated
- intermediates
- libs
- src
- androidTest 测试
- main
- java
- assets 原生资源,二进制文件,无法通过R资源清单访问,需通过AssetManager访问
- res
- AndroidManifest.xml
- .gitignore
- build.gradle
- myapplication.iml
- proguard-rules.pro ProGuard 设置文件
二、资源使用
Android应用开发时主要涉及的资源有:字符串、数值常量、颜色、数组、图片、布局文件、菜单等等。
常用的就不介绍了,这里主要讲一些不太常用,但是经常会遇到的资源的使用方法。
1.尺寸资源
定义方法:
myapp/src/main/res/values/dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="spacing">8dp</dimen>
<dimen name="cell_width">60dp</dimen>
<dimen name="cell_height">66dp</dimen>
<dimen name="title_font_size">18sp</dimen>
</resources>
使用方法:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:gravity="center"
android:textSize="@dimen/title_font_size"
/>
</LinearLayout>
关于Android中的尺寸问题
手机尺寸:
- dpi:每英寸像素点个数,即屏幕像素密度
常用尺寸单位:
- dp:保持密度独立并且保持最佳图片质量,常用来表示长度、宽度等。
- sp:保持密度独立和字体的质量,常用来表示字体大小。
- dx:屏幕真实像素,不要使用这个。
设计原则:
- 设计尺寸比最大密度桶更大的矢量图像资源或原始图像资源
- 为每一个密度桶创建特定的density 版本,然后将他们放入用合适标识符标识的“drawable”资源目录下
- 当设置图像边界的时候,用“wrap_content”来获得最佳显示效果,用“match_parent”来充满整个显示区域,或者用“dp”来设定一个固定的尺寸
- 当在布局里面设定距离的时候,用“dp”获得最佳显示效果。如果需要使用精确的尺寸,仅用“in”,"mm"或"pt"。在这里永远别使用"px"
2.样式(Style)资源
多个格式的集合,比如字体、颜色、背景色等
用途:用来描述某类型组件的格式,这样就不用每次为相同的组件写重复的属性格式了了
示例:myapp\src\main\res\values\my_style.xml
这里共定义了三个样式:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<!-- 定义一个样式,指定字体大小、字体颜色 -->
<style name="style1">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#00d</item>
</style>
<!-- 定义一个样式,继承前一个颜色 -->
<style name="style2" parent="@style/style1">
<item name="android:background">#ee6</item>
<item name="android:padding">8dp</item>
<!-- 覆盖父样式中指定的属性 -->
<item name="android:textColor">#000</item>
</style>
<style name="CrazyTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowFrame">@drawable/window_border</item>
<item name="android:windowBackground">@drawable/star</item>
</style>
</resources>
使用示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 指定使用style1的样式 -->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/style1"
style="@style/style1"
/>
<!-- 指定使用style2的样式 -->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/style2"
style="@style/style2"
/>
</LinearLayout>
3.主题(Theme)资源
定义方式与style相同(参看前面定义Style的第三部分),区别在于:
- Theme定义的是改变窗口外观的格式,比如:窗口标题、窗口边框等。
- Theme不能作用于单个UI组件,而应该作用于一个Activity,或者整个应用的所有Activity。
使用方法:
Java:setTheme(R.style.CrazyitTheme)
AndroidManifest.xml:
<application android:theme="@style/CrazyitTheme">
...
</application>
<activity android:theme="@style/CrazyitTheme">
...
</activity>
大部分时都在AndroidManifest.xml文件中指定应用、Activity的主题。
4.属性(attr)资源
参见自定义View部分。
5.ShapeDrawable资源
用于定义一个基本的几何图形
shape的形状,默认为矩形,可以设置为矩形(rectangle)、椭圆形(oval)、线性形状(line)、环形(ring)
指定形状:android:shape=" rectangle | oval | line | ring "
举例:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 圆角 -->
<corners
android:radius="9dp"
android:topLeftRadius="2dp"
android:topRightRadius="2dp"
android:bottomLeftRadius="2dp"
android:bottomRightRadius="2dp"/><!-- 设置圆角半径 -->
<!-- 渐变 -->
<gradient
android:startColor="@android:color/white"
android:centerColor="@android:color/black"
android:endColor="@android:color/black"
android:useLevel="true"
android:angle="45"
android:type="radial"
android:centerX="0"
android:centerY="0"
android:gradientRadius="90"/>
<!-- 间隔 -->
<padding
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp"/><!-- 各方向的间隔 -->
<!-- 大小 -->
<size
android:width="50dp"
android:height="50dp"/><!-- 宽度和高度 -->
<!-- 填充 -->
<solid
android:color="@android:color/white"/><!-- 填充的颜色 -->
<!-- 描边 -->
<stroke
android:width="2dp"
android:color="@android:color/black"
android:dashWidth="1dp"
android:dashGap="2dp"/>
</shape>
圆角:同时设置五个属性,则Radius属性无效
android:Radius="20dp" 设置四个角的半径
android:topLeftRadius="20dp" 设置左上角的半径
android:topRightRadius="20dp" 设置右上角的半径
android:bottomLeftRadius="20dp" 设置右下角的半径
android:bottomRightRadius="20dp" 设置左下角的半径
描边:dashWidth和dashGap属性,只要其中一个设置为0dp,则边框为实现边框
android:width="20dp" 设置边边的宽度
android:color="@android:color/black" 设置边边的颜色
android:dashWidth="2dp" 设置虚线的宽度
android:dashGap="20dp" 设置虚线的间隔宽度
6.StateListDrawable资源
用于组织多个Drwable对象。当它被设置为组建背景、前景图片时,会随组件状态改变而自动切换Drawable。
例如:
可以根据不同状态设置图片(android:drawable),也可以是颜色(android:color)
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/button_red_pressed" />
<item android:state_focused="true" android:drawable="@drawable/button_red_pressed" />
<item android:state_pressed="true" android:drawable="@drawable/button_red_pressed" />
<item android:drawable="@drawable/button_red_normal" />
</selector>
把它设置为按钮背景时,按钮背景会随状态改变而发生变化。
可设置的状态如下:
android:state_active 激活状态
android:state_checked 已勾选状态
android:state_checkable 可勾选状态
android:state_enabled 可用状态
android:state_first 开始状态
android:state_focused 已得到焦点状态
android:state_last 结束状态
android:state_middle 中间状态
android:state_pressed 被按下状态
android:state_selected 被选中状态
android:state_window_focused 窗口已得到焦点状态
7.LayerDrawable资源
与StateListDrawable类似,同样含有一个Drawable数组,这些图片会按顺序层叠起来显示,也就是最后一个图片会显示在最上面。另外每个图片都可以设置与目标偏移量的距离。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+android:id/secondaryProgress"
android:drawable="@drawable/unselected">
</item>
<item
android:id="@+android:id/progress"
android:drawable="@drawable/selected">
</item>
<item>
<shape>
<solid android:color="@color/border_grey" />
<padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="0dp" />
</shape>
</item>
</layer-list>
这个见得比较多的时用来实现seekbar拖动条的效果。
8.assets资源
除了以上的各种xml文件、图片之外,Android应用经常会用到其他资源,例如声音资源等。
AssetManager专门管理/assets/目录下的资源,它提供了两个常用方法管理Assets资源:
- InputStream open(String fileName)
- AssetsFileDescriptor openTd(String fileName)
三、使用不同屏幕大小
屏幕尺寸: small(426dpx320dp)、normal(470dpx320dp)、large(640dpx480dp)、xlarge(960dpx720dp)
屏幕像素密度: ldpi(120)、mdpi(160)、hdpi(240)、xhdpi(320)
屏幕方向:land(横屏)、port(竖屏)
解决方案:
- 屏幕尺寸问题:为layout、values目录增加后缀:small、normal、large、xlarge,为不同尺寸屏幕提供相应资源。
- 屏幕分辨率问题:为drawable目录增加ldpi、mdpi、hdpi、xhdpi、nodpi(默认),为不同分辨率的屏幕提供资源
- 屏幕方向:为layout、values等目录增加后缀land、port,分别为横屏、竖屏提供相应的资源。
相同名字的图片放到不同的目录下之后,在layout中调用,系统会根据不同的分辨率调用相应的图片。