博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android应用资源
阅读量:7045 次
发布时间:2019-06-28

本文共 7677 字,大约阅读时间需要 25 分钟。

Java刚開始学习的人直接在Java源代码使用"hello" 和123 类型的字符串和整型。但时间长了就会忘记当初定义的原因,有经验的或许会定义字符串常量ResultSet.TYPE_FORWARD_ONLY,有经验的一看就知道其原因。这样的写法已经减少了耦合性,Android则对这些字符串常量、数值常量进行进一步的改进:把用到的各种资源字符串常量、颜色资源、数组资源、菜单资源都集中放到res文件夹下。应用程序则直接使用这些资源中定义的值。

资源类型及存储方式

Android应用资源可分为两大类:

1.无法通过R清单类訪问的原生资源。保存在assets文件夹下

2.可通过R资源清单类訪问的资源,保存在res文件夹下

资源存储:

/res/animator 存放定义属性动画的XML文件

/res/anim 定义补间动画的XML文件

/res/color 存放定义不同颜色下颜色列表的XML文件

/res/drawable 存放位图(png,jpg,gif)和Drawable对象(BItmapDrawable,NinePatchDrawable,StateListDrawable,AnimationDrawable,Drawable)

/res/layout 存放各种用户界面的布局文件

/res/menu 存放为应用程序定义的各种菜单的资源,包含选项菜单,子菜单,上下文菜单资源

/res/raw 存放随意类型的原生资源(比如音频,视频等)在Java代码中调用Resource对象的openRawResource(int id)方法获取该资源二进制输入流。

/res/values  存放简单值的XML文件,包含字符串、数组、整数、颜色等。都存放在<resources></resources>节点下。建议不同类型存放在不同XML文件里。

使用方式:

Java代码中

<package_name>.R.<resource_type>.<resouece_name>

比如:android.R.layout.simple_expandable_list_item_1  引用Java程序所在的R类的包,包名能够省略

事实上上述写法并非引用真正的资源对象。而是Andoird应用的API同意直接使用int类型的资源清单项取代应用资源。获取实际资源能够借助Resource类(Android资源訪问总管家)。Resource主要提供两类方法:

getXxx(int id):依据自愿清单ID来获取实际资源

getAssets() :获取訪问/assets/文件夹下资源的AssetManager对象

Resource由Context调用getResource()方法来获取

//获取Resource		Resources res = getResources();		//获取字符串资源		String mainTitile = res.getText(R.string.main_titile);		//获取Drawable资源		res.getDrawable(R.drawable.ic_launcher);		//获取数组资源		int [] arr = res.getIntArray(R.array.books);

XML中

#ff00
Hello
控件引用

array资源

1
2
3
@string/hello_world
上面代码能够看出资源之前能够相互引用。

StateListDrawable资源

StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景。前景图片时,StateListDrawable对象多显示的Drawable对象会随目标组件状态的改变而自己主动切换。

定义StateListDrawable对象的XML文件的根元素为<selector..../> 该元素能够包括多个<item..../>能够指定

android:color或android:drawable指定颜色或Drawable对象。

android:state_xxx:指定一个特定状态(active、checked、last、pressed等)

> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 获取焦点时的颜色 --> <item android:state_focused="true" android:color="#f44"></item> <!-- 失去焦点时颜色 --> <item android:state_focused="false" android:color="#455"></item> </selector>

LayerDrawable资源

与StateListDrawable有点类似。LayerDrawable也可包括一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。

定义LayerDrawable对象的XML文件的根元素为<layer-list...../>,该元素能够包括多个<item..../>元素,能够指定例如以下属性:

android:drawable:指定作为LayerDrawable元素之中的一个的Drawable对象

android:id为该Drawable对象指定唯一标识

android:buttom|top|button:它们用于指定一个长度值。用于指定将该Drawable对象绘制到目标组件的指定位置。

activity_main.xml

my_bar.xml

layout_logo.xml

xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <bitmap android:gravity="center" android:src="@drawable/ic_launcher" /> </item> <item android:top="25dp" android:left="25dp"> <bitmap android:gravity="center" android:src="@drawable/ic_launcher" /> </item> <item android:top="50dp" android:left="50dp"> <bitmap android:gravity="center" android:src="@drawable/ic_launcher" /> </item> </layer-list>

效果图:

上述代码能够看出ImageView的src能够指定图片。还能够是layer(图层),图层item中定义每一个显示的Bitmap图片和所在的位置<bitmap android:gravity="center" >这里所说的居中是相对于ImageView空间容器大小的居中。

SharpDrawable资源

之前UI简单美化提过,这个就不说了

ClipDrawable资源

ClipDrawable代表从其它的位图上截取一个"图片片段",在XML文件里定义ClipDrawable对象使用<clip....../>元素,语法为:

使用ClipDrawable对象时可调用setLevel(int level) 方法来设置截取的大小,0截取的图片为空。10000时,截取整张图片

利用level慢慢展开的风景,当点击图片时自己主动所有显示

public class MainActivity extends Activity {	private ImageView img;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);				img = (ImageView) findViewById(R.id.img);		//获取图片所显示的ClipDrawable对象		final ClipDrawable drawable = (ClipDrawable) img.getDrawable();		final Handler handler = new Handler(){			@Override			public void handleMessage(Message msg) {				super.handleMessage(msg);				if(msg.what==0x123){					//改动ClipDrawable的level的值					drawable.setLevel(drawable.getLevel()+20);				}			}		};		final Timer timer = new Timer();		timer.schedule(new TimerTask() {						@Override			public void run() {				Message msg = new Message();				msg.what=0x123;				//发送消息通知应用改动ClipDrawable对象的level的值				handler.sendMessage(msg);				if(drawable.getLevel()>=10000){					timer.cancel();				}			}		}, 0, 300);		img.setOnClickListener(new OnClickListener() {						@Override			public void onClick(View v) {				drawable.setLevel(10000);			}		});	}}
上面代码事实上就是时刻的在改变裁减之后的值在显示形成的徐徐展开效果。

AnimationDrawable资源

AnimationDrawable代表一个动画,支持帧动画和补间动画。

定义补间动画的XML资源文件以<set..../>元素作为根元素。该元素能够指定a:lpha透明度、scale缩放、translate位移、ratate旋转。动画存放路径res/animi。ADT创建android应用时不带有该路径,须要手动创建。

MainActivity.java

public class MainActivity extends Activity {	ImageView imageView1;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		imageView1=(ImageView) findViewById(R.id.imageView1);		//载入动画资源		final Animation animation = AnimationUtils.loadAnimation(this, R.anim.set_test);		//设置动画结束后保留结束状态		animation.setFillAfter(true);		Button bn = (Button) findViewById(R.id.bn);		bn.setText("開始动画");		bn.setOnClickListener(new OnClickListener() {						@Override			public void onClick(View v) {				//開始动画				imageView1.startAnimation(animation);			}		});			}}
set_test.xml

xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator" android:duration="5000"> <!-- 定义缩放变换 --> <scale android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="true" android:duration="2000"/> <!-- 定义位移变换 --> <translate android:fromXDelta="10" android:toXDelta="130" android:fromYDelta="30" android:toYDelta="-80" android:duration="2000"/> </set>

Property Animation资源

Animation代表一个属性动画。但它仅仅是一个抽象类,一般会使用它的子类:AnimatorSet、ValueAnimator、ObjectAnimator、TimeAnimator。

须要animator文件夹。创建项目的时候没有。手动创建。

定义属性动画XML资源能以三个元素中的随意一个作为根元素

<set...../> 它是一个父元素,用于包括其它<objectAnimator>或者<set.../>子元素。该属性定义的资源代表AnimatorSet对象

<objectAnimator.../>用于定义ObjectAnimtor动画

<animator.../>  用于定义ValueAnimator动画

背景颜色一直变化的Demo

public class MainActivity extends Activity {	ImageView imageView1;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		LinearLayout l = (LinearLayout)findViewById(R.id.container);		l.addView(new MyAnimtionView(this));			}	public class MyAnimtionView extends View{		public MyAnimtionView(Context context) {			super(context);			//载入动画资源			ObjectAnimator colorAnim = (ObjectAnimator) AnimatorInflater.loadAnimator(context, R.animator.object_test);			colorAnim.setEvaluator(new ArgbEvaluator());			//对该View本身应用属性动画			colorAnim.setTarget(this);			//開始动画			colorAnim.start();		}			}}
res/animator/object_test.xml

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

> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:propertyName="backgroundColor" android:duration="3000" android:valueFrom="#FF8080" android:valueTo="#8080FF" android:valueType="intType" android:repeatCount="infinite" android:repeatMode="reverse" > </objectAnimator>

总结:

资源名 文件夹 根节点

StateListDrawable    Drawable <selector..../>

LayerDrawable Drawable   <layer-list..../>

Property Animation animator <objectAnimator.../>

SharpDrawable Drawable  <shape...../> 

AnimationDrawable  anim   <set..../>

你可能感兴趣的文章
在 Android 上离线导览模型
查看>>
深入css之去除inline-block元素之间的多余间隙
查看>>
关于cronjob的用法
查看>>
对于fork()用法的初步探讨
查看>>
Javascript 数组循环遍历之forEach
查看>>
HTML & CSS之小白初入江湖
查看>>
写一个简单的webserver
查看>>
通过 InnoSetup 美化安装界面
查看>>
一次不怎么愉快的滴滴面试经历
查看>>
Android的资源管理器的创建过程
查看>>
php验证身份证函数
查看>>
[使用 Weex 和 Vue 开发原生应用] 1 如何配置开发环境
查看>>
红帽发布 Ansible Tower 3.4:在混合云中实践DevOps更便捷
查看>>
Linus 发文宣布Linux Kernel 5.0 正式发布
查看>>
定制你的敏捷方法:以结果为导向
查看>>
关于Visual Studio 2019的前期详情
查看>>
PWA即将推向所有Chrome平台
查看>>
官宣!微软宣布桌面版 Edge将基于Chromium进行开发\n
查看>>
运用供应链管理实现更快速、更高质量的交付
查看>>
3·15曝光丨智能机器人一年拨打40亿个骚扰电话,6亿人信息已遭泄露!
查看>>