Android资源文件详解

主要讲解:dimens/style/theme/shapedrawable/statelistdrawable/layerdrawable/assets 等资源的使用,以及不同设备的适应问题。


一、Android Studio工程目录结构

关于Android Studio目录结构的说明:http://developer.android.com/tools/projects/index.html

新建的空工程:


  • .idea/ IntelliJ的配置文件
  • app/ 新建工程自动生成的Module
  • gradle/ 包含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(竖屏)

解决方案:

  • 屏幕尺寸问题:为layoutvalues目录增加后缀:small、normal、large、xlarge,为不同尺寸屏幕提供相应资源。
  • 屏幕分辨率问题:为drawable目录增加ldpi、mdpi、hdpi、xhdpi、nodpi(默认),为不同分辨率的屏幕提供资源
  • 屏幕方向:为layout、values等目录增加后缀land、port,分别为横屏、竖屏提供相应的资源。

相同名字的图片放到不同的目录下之后,在layout中调用,系统会根据不同的分辨率调用相应的图片。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值