赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android的字符串颜色图片样式
Android的字符串颜色图片样式

所谓资源,就是代码中使用的外部文件,包括图片、音频、动画和字符串等。Android将应用中所用到的各种资源集中在res目录中,并为每个资源自动生成一个编号,在应用程序中可以直接通过R类编号来访问资源。Android项目中,还有assets目录用于存放资源,一般存放的是应用程序无法直接访问的原生资源,应用程序需要通过AssetManager类,以二进制流的形式来读取。

1)一些常用资源文件的存放位置为:

/res/anim/

存放定义动画的XML文件

/res/color/

存放定义不同状态下颜色列表的XML文件

/res/drawable/

存放能转换为绘图资源的位图文件

/res/layout/

存放各种界面布局文件,每个Activity一般都对应一个XML布局文件

/res/menu/

存放为应用程序定义的菜单资源,有选项菜单、子菜单、上下文菜单

/res/raw/

存放直接复制到设备中的任意文件,使用openRawResource()方法获取

/res/values/

存放定义多种类型资源的XML文件,如字符串、颜色、尺寸、样式等

/res/xml/

存放任意的原生XML文件,使用Resources.getXML()方法访问

/assets/

存放各种资源文件,如音频、视频文件等,使用AssetManager类访问

除上述默认文件夹,还可以使用“默认文件夹名+短横线+配置相关限定符”构成需要的资源文件夹,如drawable-hdpi存放高分辨率位图、drawable-xdpi存放高分辨率位图、drawable -mdpi存放中分辨率位图、drawable-ldpi存放低分辨率位图。

2)资源访问方式:
⑴Java代码中访问res资源:
每个res资源会在项目的R类中自动生成一个代表资源编号的静态常量,在Java代码中通过R类可以访问这些res资源,语法格式:
[packageName.]R.resourceType.resourceName
这种方法同样可以使用Android系统内部R资源,这时packageName使用android。
android.content.res.Resources类是Android资源访问控制类,其中提供了大量方法获取资源,通过android.content.Context类的getResources()方法获取Resources对象。由于Activity继承了Context类,所以在Activity中可以直接调用getResources()方法来获取Resources对象。
Resources类中提供的访问资源的方法有:

int getColor(int id)

对应res/values/colors.xml

Drawable getDrawable(int id)

对应res/drawable/

XmlResourceParser getLayout(int id)

对应res/layout/

String getString(int id)

对应res/values/strings.xml

CharSequence getText(int id)

对应res/values/stringss.xml

InputStream openRawResource(int id)

对应res/raw/

void parseBundleExtra(String tagName,AttributeSet attrs,Bundle outBundle)

对应res/xml/

String[] getStringArray(int id)

对应res/values/arrays.xml

float getDimension(int id)

对应res/values/dimens.xml

⑵Java代码访问assets资源:
通过Resources类的getAssets()方法可获得android.content.res.AssetManager对象,该对象的open()方法可以打开指定路径的assets资源的输入流,从而读取到对应的原生资源。Android Studio新建项目时不会自动创建assets文件夹,要使用菜单New-Folder-Assets Folder创建。
如assets文件夹中有图片android.jpg,Java代码中使用时代码为:
try{
InputStream is=getResources().getAssets().open("android.jpg");
Bitmap bitmap=BitmapFactory.decodeStream(is);
imageView.setImageBitmap(bitmap);
}catch(Exception e){
e.printStackTrace();
}
⑶XML文件中使用资源:
语法格式:
@[packageName.]resourceType/resourceName


1. string.xml文本资源文件:

res/values.xml文件夹用于存放常用的简单的XML资源文件,包括定义文本内容的中资源文件strings.xml、定义颜色的资源文件colors.xml、定义尺寸的资源文件dimens.xml、定义主题风格的资源文件styles.xml。其中文本资源文件strings.xml比较简单,示例代码为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <string name="title">Resources</string>
 <string name="message">Hello World!</string>
 <string name="error">Wrong resource!</string>
</resources>
如果要使用单引号/双引号这些特殊字符,需要在前面使用“\”来转义,也可以将整个字符串用双引号/单引号括起来。还有一些特殊字符,如果以XML Editor方式输入,会自动转为固定对应的一组字符串来表示。建立了文本资源文件后,其中定义的字符串变量就可以在Java代码或XML文件中使用。

1)Java代码中使用字符串资源:
CharSequence titletext=getString(R.string.title);
CharSequence displayt=getString(R.string.message);

2)在XML文件中访问字符串资源:
android:app_name="@string/title"
android:display="@string/message"

无论Java代码中,还是XML文件中,其实都可以直接使用字符串,使用文本资源文件中定义的字符串主要是为了使代码与显示界面分离,修改界面展示时比较简单,不用在Java代码及XML文件中逐个寻找并修改使用的字符串。
当应用程序需要支持国际化时,可以创建不同的values目录,如values-en表示英语、values-zh表示中文等,然后将不同语言的strings.xml文件分别放在所属的values文件夹中即可。


2. colors.xml颜色设置资源文件:

Android中的颜色是通过红Red、绿Green、蓝Blue三原色,以及一个透明度Alpha来表示,颜色值以#开头,后面是Alpha-Red-Green-Blue形式,其中Alpha部分可以省略。颜色值声明有以下几种形式:
·#RGB:分别指定红绿蓝三原色的值,只支持0~f共16级颜色
·#ARGB:分别指定透明度及红绿蓝三原色的值,只支持16级颜色和透明度
·#RRGGBB:分别指定红绿蓝三原色的值,每种颜色支持00~ff共256级
·#AARRGGBB:分别指定透明度及红绿蓝三原色的值,支持256级颜色及透明度
颜色资源存储在/res/values/colors.xml文件中,使用<color>标记来定义。示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <color name="text_color">#F00</color>
 <color name="trans_blue">#800000ff</color>
 <color name="back_color">#aaaaaa</color>
</resources>
建立了colors.xml资源文件,就可以在Java代码和XML文件中对这些颜色进行访问。

1)Java代码中使用颜色资源:
int color1=getResources().getColor(R.color.text_color);
int color2=getResources().getColor(R.color.trans_blue);
较新的版本使用ContextCompat.getColor(Context context,int id)方法获取颜色。

2)在XML文件中访问颜色资源:
android:titleColor="@color/text_color"
android:titleColot="@color/trans_blue"
无论Java代码中,还是XML文件中,其实都可以直接使用颜色值,使用颜色配置资源文件中定义的颜色主要是为了使界面展示风格一致,而且修改整个界面的颜色也比较容易。

如果建立如下colors.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="RED">#F00</color>
    <color name="GREEN">#0F0</color>
    <color name="BLUE">#00F</color>
    <color name="BLACK">#000</color>
    <color name="WHITE">#FFF</color>
    <color name="GRAY">#888</color>
</resources>
Android的色彩采用RGB或ARGB方式来显示可以使用三位和六位方式。然后在R.java中产生的代码为:
public static final class color {
        public static final int BLACK=0x7f060006;
        public static final int BLUE=0x7f060005;
        public static final int GRAY=0x7f060008;
        public static final int GREEN=0x7f060004;
        public static final int RED=0x7f060003;
        public static final int WHITE=0x7f060007;
}

3)颜色的组合应用:

在Android中部分对象有着不同的状态,如按钮有focused、pressed等状态,可以使用不同的颜色来表示不同的状态。除了手动指定颜色外,还可以在XML中定义一组颜色组合,在这个颜色组合中会包含状态与颜色列表,因此当有对象被指定使用此颜色组合时,在不同状态下就会自动变换成不同的颜色。
颜色组合可以定义在/res/color子目录下,可以是任意名称的XML文件,但这个文件名会被当作这组颜色组合的ID,格式为:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="hex_color" 组件的状态="true/false" />
</selector>
其中组件的状态常用的有:

状态名

描述

android:state_pressed

该组件被触碰或被单击

android:state_focused

该组件被框选,例如移动焦点到该组件

android:state_selected

该组件已被选择,例如被选择的标签页

android:state_checkable

该组件是可被选择的

android:state_checked

该组件已经被选择

android:state_enable

该组件在作用中

android:state_window_focused

该组件所在的母窗口正在使用中

然后R.java下的color子类会自动产生一个对应的ID:
public static final int xmlname=0x7f070008;
然后就可以在Layout中使用这个颜色:
android:textColor="@color/xmlname"

3. dimens.xml尺寸定义资源文件:

Android可以采用以下尺寸单位:

尺寸单位

描述

资源标记

示例

像素

实际的屏幕像素

px

10px

英寸

物理测量单位

in

6in

毫米

物理测量单位

mm

4mm

普通字体测量单位

pt

12pt

密度独立像素

相对于160dpi屏幕的像素

dp

3dp

比例独立像素

对于字体显示的测量

sp

10sp

因为屏幕密度及像素的不同,为了在不同屏幕上显示比较一致的界面,Android推荐使用dp和sp尺寸单位。在/res/values/dimens.xml中使用<dimen>标记来定义元素的尺寸。示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <dimen name="one_pixel">1px</dimen>
 <dimen name="two_inches">2in</dimen>
 <dimen name="margin_vertical">2dp</dimen>
 <dimen name="fourteen_sp">14sp</dimen>
</resources>

1)Java代码中使用尺寸资源:
float dimen1=getResources().getDimension(R.dimen.one_pixel);
float dimen2=getResources().getDimension(R.dimen.margin_vertical);

2)在XML文件中访问尺寸资源:
android:textSize="@dimen/fourteen_sp"
android:marginSize="@dimen/margin_vertical"
在XML布局及Java代码中都可以使用像素、英寸、磅值等尺寸单位,使用尺寸资源文件定义的尺寸容易形成比较一致的样式风格,并使修改尺寸比较容易。

3)Android界面中的单位:

电脑界面常用的单位是像素px和磅pt,像素是图像的基本取样单位,磅是印刷业常用单位,等于1/72英寸,通常用来定义字体的大小。 Android设备种类很多,有不同的显示屏大小及像素密度,使用上述单位会出现在不同分辨率屏幕下控件大小不同的问题。为了兼容不同的移动设备,解决不同分辨率的适配问题,引入了dp和sp两种单位。
dp意为与密度无关的像素,是一种基于屏幕密度的抽象单位,在不同密度的屏幕中显示比例保持一致。dp与px之间的换算关系为:
px=dp*density/160
dip为device independent pixes的缩写,表示设备独立像素,与dp一致。
density表示屏幕密度,目前市面上Android移动设备分为Low、Medium、High三个等级的屏幕密度,值分别为160、240、360。不同尺寸设备的屏幕密度表为:

屏幕

像素大小

尺寸inch

屏幕密度

QVGA

240*320

2.6~3.0

Low

WQVGA

240*400

3.2~3.5

Low

FWQVGA

240*432

3.5~3.8

Low

HVGA

320*480

3.0~3.5

Medium

WVGA

480*800

3.3~4.0

High

FWVGA

480*854

3.5~4.0

High

WVGA

480*800

4.8~5.5

Medium

FWVGA

480*854

5.0~5.8

Medium

对于屏幕像素为320*480,尺寸为3.5,则1px刚好为1dp;而选择480*800的屏幕,若屏幕尺寸不变,则1px等于2dp。
sp表示可缩放像素,主要用于设置字体,可根据屏幕密度和用户设置的字体大小进行调制,以适配不同的屏幕。

4. array.xml数组资源文件:

Android中可以使用字符串数组,XML文件中格式为:
数组资源存储在/res/values/arrays.xml文件中,使用<string-array>标记来定义。示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <string-array name="array_name">
  <item>值1</item>
  <item>值2</item>
  <item>值2</item>
 </string-array>
</resources>
一般使用XML Editor界面中的String Array来建立字符串数组并加入每一个元素。准备好字符串数组后,可以在Java程序中将定义好的字符串数组变成String[],调用:
Resources res=getResources();
String[] string_array=res.getStringArray(R.array.array_name);
然后就可以使用变量数组string_array来处理其中的每个元素。
arrays.xml定义的数组,常在Adapter集合框架中使用,用于ListView、Spinner等列表显示场合。

5. styles.xml样式资源文件:

res/values/styles.xml是样式资源文件,其中可以声明多个<style>样式元素,并在<style>中使用<item>元素来引用其他资源,并定义细节风格。示例代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <style name="ThemeNew">
  <item name="window">@drawable/screen_frame</item>
  <item name="color">@drawable/background_color</item>
  <item name="foreground">#ff000000</item>
  <item name="background">#ffffffff</item>
  <item name="textColor">#ffff0000</item>
  <item name="textSize">14sp</item>
  <item name="menuTextColor">?TextColor</item>
  <item name="menuTextSize">?TextSize</item>
 </style>
</resources>
代码中定义了ThemeNew样式,其中定义了完整的窗口样式。?和@都可以引用XML文件中的资源,但?引用在同一XML文件中定义的资源,@则引用跨文件的资源。

1)Java代码中使用样式资源:
setTheme(R.style.ThemeNew);

2)在XML文件中访问样式资源:
android:textColor="@style/ThemeNew"
使用样式资源文件,可以设置比较一致的界面风格,也容易改变风格。

3)样式的继承:
样式本身会很类似,只要在样式声明时指定父样式,则该样式就会继承原来样式的属性。然后在设置其中的其他样式的属性。示例:
<resources>
    <style name="normal" >
        <item name="android:textSize">24sp</item>
    </style>
    <style name="normal_red" parent="normal">
        <item name="android:textColor">#F00</item>
    </style>
    <style name="normal_green" parent="normal">
        <item name="android:textColor">#0F0</item>
    </style>
    <style name="normal_blue" parent="normal">
        <item name="android:textColor">#00F</item>
    </style>
</resources>

6. drawable图片资源文件夹:

Android应用程序中使用的小图标、图像或背景图片都要放在资源文件夹res/drawable中,支持的格式有png、jpg、gif等。

1)Java代码中使用图片资源:
setBackgroundDrawable(getResources().getDrawable(R.drawable.background));

2)在XML文件中访问图片资源:
android:background="@drawable/background"

3)定义可扩展的png图片文件:

许多时候提供的图片文件在比例上与实际使用时不相同,为此Android提供了将png文件作为扩展的工具,以便让png图片文件自行选择想要扩展的范围。
可延伸的png访问方式如同一般的图片文件,但在扩展名前面加9.,如image.9.png。
可扩展png图片文件的编辑工具放置在<SDK>下的tools子目录中的draw9patch下,执行后出现界面,将编辑的png图片拖入这个窗口会自动打开,移动Zoom可对图片文件进行缩放编辑,而移动Patch scale则可以决定图片长宽的缩放比例,并在预览区中先预览变形后的结果。编辑区域四周有黑色边框,通过拖动其位置,就可以选择部分变形区域,通过右侧变形图来看效果。修改完成后执行File--Save 9-patch,就保存为.9.png扩展名文件,然后就可以像一般图片文件在Java与XML内使用。

4)图形状态组合的应用:

使用不同状态的组件时,会显示不同的图片文件,例如按钮就经常使用不同的背景图来表达不同的状态。要定义图形状态组合需要在res/drawable中定义一个XML文件,而其文件名会变成id。格式为:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    android:constantSize=["true"|"false"]
    android:dither=["true"|"false"]
    android:variablePadding=["true"|"false"]>
    <item android:drawable="pic_id" 组件状态=["true"|"false"] />
</selector>
其中,<selector>中的几个属性,除非有特殊要求,一般使用默认值:

android:constantSize

设为true代表组件不会因为状态改变而被指定不同大小的图形,默认为false,即不同状态下的图形大小会改变

android:dither

默认值是当前图形的图素设置与屏幕不同时,会自动补色

android:variablePadding

设为true表示图形的边界可以随着状态而改变,默认值为false

而组件的状态如同颜色组合,有以下几种:

状态名

描述

android:state_pressed

该组件被触碰或被单击

android:state_focused

该组件被框选,例如移动焦点到该组件

android:state_selected

该组件已被选择,例如被选择的标签页

android:state_checkable

该组件是可被选择的

android:state_checked

该组件已经被选择

android:state_enable

该组件在作用中

android:state_window_focused

该组件所在的母窗口正在使用中

5)用颜色作为Drawable:

用颜色作为drawable的语法和颜色的用法相同,只要在<resource>中将color改为drawable。示例:res/values/目录下的colors.xml中
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="RED">#F00</color>
    <color name="GREEN">#0F0</color>
    <color name="BLUE">#00F</color>
    <color name="BLACK">#000</color>
    <color name="WHITE">#FFF</color>
    <color name="GRAY">#888</color>
    <drawable name="draw_blue">#00F<drawable>
</resources>
要访问颜色drawable,在Java下使用的方法为:
R.drawable.draw_blue
在XML下使用的方法为:
@[package:]drawable/araw_blue
还需要在Layout下增加TextView:
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="文字区块1"
android:id="@+id/button3">
使用Java来访问资源,示例代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources res=getResources();
Drawable blueDrawable=res.getDrawable(R.drawable.draw_blue);
TextView tv3=(TextView) findViewById(R.id.button3);
tv3.setBackgroundDrawable(blueDrawable);
}
但其中的getDrawable和etBackgroundDrawable会被提示过时,需要改为:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Drawable blueDrawable=ContextCompat.getDrawable(R.drawable.draw_blue);
TextView tv3=(TextView) findViewById(R.id.button3);
tv3.setBackgroundResource(blueDrawable);
}
为了使用ContextCompat和setBackgroundResource,需要import相关的类:
import android.support.v4.content.ContextCompat;
import android.graphics.drawable.Drawable;

6)用几何形状作为Drawable:

在XML中可以定义一些几何形状,并且使用它们作为Drawable,定义语法为:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle"|"oval"|"line"|"ring"]>
<!--定义边角的属性-->
<!--定义渐变的属性-->
<!--定义内容和边框的距离-->
<!--定义大小-->
<!--定义颜色-->
<!--定义线的宽度-->
</shape>
目前支持的有矩形、椭圆、线条与环。
⑴定义边角的属性:
在Android语法中,可以定义所有边角的半径,或定义每一个边角的半径:

android:radius

设置所有边角的半径

android:topLeftRadius

设置左上角的半径

android:topRightRadius

设置右上角的半径

android:bottomLeftRadius

设置左下角的半径

android:bottomRightRadius

设置右下角的半径

⑵定义渐变的属性:
在几何形状的定义中,使用渐变填色可让用户有更生动的感受,这种定义方式也更能节省文件大小。android:type可支持3种渐变。

linear

线性渐变,是默认值

radial

放射状的渐变

sweep

混合的渐变

其他与渐变相关的定义方法:

android:angle

设置渐变的角度,0是左到右,90是下到上,且一定要是45度的倍数

android:centerX

渐变的x轴中心点相对值,浮点值由0到1

android:centerY

渐变的y轴中心点相对值,浮点值由0到1

android:centerColor

指定渐变过程中的颜色,但非必要值

android:startColor

定义开始的颜色

android:endColor

定义结束的颜色

android:gradientRadius

定义放射状渐变的半径,是一个浮点值

⑶定义内容和边框的距离:可以定义内容至4条边的距离

android:left

和左边界的距离

android:top

和上边界的距离

android:right

和右边界的距离

android:bottom

和下边界的距离

⑷定义大小:几何形状的大小可以用如下的属性来定义

android:height

定义形状的高度

android:width

定义形状的宽度

⑸定义颜色:几何形状如果不填入渐变,可以使用android:color来指定单一的颜色
⑹定义线的宽度:如果几何形状设置的是线条,则可以使用下列属性,或将它设置成虚线

android:width

线的宽度

android:color

线的颜色

android:dashGap

虚线和虚线中间的间隔长度

android:dashWidth

虚线的宽度

⑺示例:
在res/drawable-nodpi创建XML文件,示例代码:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:type="linear"
        android:startColor="#FFFF00FF"
        android:endColor="#FF0000FF"
        android:angle="45"/>
    <padding android:left="15dp"
        android:top="7dp"
        android:right="15dp"
        android:bottom="0dp" />
    <corners android:radius="9dp" />
</shape>
在此设置一个矩形区块,并设置它的渐变为45度角排列的渐变。其中关于padding的语句中,设置区块中文字和区块上边界有7dp的距离、左右侧各有5dp的距离,而且要能贴齐下边界。接着的corners语句中,说明区块的4个角都为圆角,且其半径为9dp。
另一个XML示例为:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <gradient android:type="linear"
        android:startColor="#FF0000FF"
        android:endColor="#FFFF0000"
        android:angle="45" />
</shape>
创建完成后,R.java文件中drawable会产生了相应的子类。
然后就可以在Layout的XML文件中使用相关区块。


Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659