Android APP完整基础教程(11)应用资源-基础2

49 篇文章 15 订阅

1 属性资源

1.1 XML属性资源基础

主要针对自定义组件的属性,具体格式如下: 

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <attr name="test" format="string" /> 
    <declare-styleable name="MyView">  
        <attr name="textColor" format="color" />    
        <attr name="textSize" format="dimension" />    
        <attr name="text" format="string" />  
    </declare-styleable>    
</resources>  

这里定义一个styleable对象,每个styleable对象就是一组attr属性的集合(注意:这里的name属性并不是一定要和自定义类名相同,只是为了好区分对应类的属性而已 )

attr属性资源的定义:name定义具体的属性名,format表示属性值类型,有以下几种:  

  • reference:参考指定Theme中资源ID,这个类型表示你传的值可以是引用资源。
  • string:若希望用类似"@string/test"引用资源的方式,可以写成format="string /reference"
  • Color:颜色
  • boolean:布尔值  
  • dimension:尺寸值  
  • float:浮点型  
  • integer:整型  
  • fraction:百分数
  • flag:位或运算
  • enum:枚举 ,如果你提供的属性只能让别人选择,不能随便传入,就可以写成这样  
<attr name="language">  
        <enum name="china" value="1"/>  
        <enum name="English" value="2"/>  
</attr>  

说明:这个属性资源文件是公共的,但是为了方便管理,一般都是一个自定义View里的属性写成一个declare-styleable集合。属性资源所定义的属性到底可以返回什么作用,取决于自定义组件的代码实现   

1.2 配合XML属性资源的实例

写出自定义组件的类文件了,然后将这个类里需要外界传入值的属性定义成一个属性资源文件。
在工程里的../res/values/目录下创建一个attrs.xml文件(文件名并不是只能写成这样,这样写只有一个目的,别人一看就知道这个文件是属性资源文件了),具体写法如下:

@1 attr.xml

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <attr name="test1" format="string" /> 
    <declare-styleable name="MyView">  
        <attr name="textColor" format="color" />    
        <attr name="textSize" format="dimension" />    
        <attr name="text" format="string" />  
    </declare-styleable>    
</resources>

@2 在自定义类里引用attrs文件里定义的属性并为自己的属性设置值,代码如下:

public class MyView extends View  
{  
    private Paint mPaint;    
    private Context mContext;    
    private static String mString;  
    private String test;  
         
    public MyView(Context context)   
    {    
          super(context);    
          mPaint = new Paint();    
    }    
      
    public MyView(Context context,AttributeSet attrs)    
    {    
            super(context,attrs);    
            mPaint = new Paint();    
              
            /*打开资源,取得declare-styleable集合*/
            TypedArray typeArray = context.obtainStyledAttributes(attrs,R.styleable.MyView);     
            /*从集合中取出对应属性值,第二参数是没用配置该属性时所用的默认值*/  
            int textColor = typeArray.getColor(R.styleable.MyView_textColor,0XFFFFFFFF);    
            float textSize = typeArray.getDimension(R.styleable.MyView_textSize, 36);    
            mString = typeArray.getString(R.styleable.MyView_text);  
             /*设置自己的类成员变量*/
            mPaint.setTextSize(textSize);    
            mPaint.setColor(textColor);    
            /*关闭资源*/
            typeArray.recycle();    
    }    
    @Override    
    protected void onDraw(Canvas canvas)   
    {    
         super.onDraw(canvas);
         mPaint.setStyle(Style.FILL);          
         canvas.drawRect(new Rect(10, 10, 90, 90), mPaint);          
         mPaint.setColor(Color.BLUE);     
         canvas.drawText(mString, 10, 110, mPaint);    
    }    
}  

@3 使用自定义组件,并设置属性

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout   
    xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:myandroid="http://schemas.android.com/apk/res/com.ags.androidtest"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >  
<TextView    
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    android:text="@string/hello"/>  
      
    <cn.com.androidtest.ui.MyView  
         android:layout_width="fill_parent"   
         android:layout_height="wrap_content"   
         myandroid:textColor="#ff0000"  
         myandroid:textSize="20px"  
         myandroid:text="myview"/>  
</LinearLayout>

注意:

在XML使用该组件时要为该自定义组件设置一个命名空间,命名空间写法为:

<XXX xmlns:空间名="http://schemas.android.com/apk/res/自定义组件所在包名"/>

写包名时你的自定义View所在包类的文件夹下,那么包名只能写成最顶层包[com.ags.androidtest],而不能是[com.ags.androidtest.xxx]。

2 RAW原始资源

android中没有提供专门支持的文件叫原始资源文件。android原始资源一般放在/res/raw目录和/assets/目录下。

2.1 原始文件索引获取

@1 assets目录下的文件

通过AssetMananger来管理,一般用如下方法来访问Assets资源

//根据文件名来获取原始资源对应的输入流
InputStream open(String fileName)

//根据文件名获取原始资源对的AssetFileDescriptor资源描述,应用程序可以通过它来获取原始资源
AssetFileDescriptor openFd(String fileName)

@2 res/raw目录下的文件

Android SDK会处理该目录下的原始资源,会在R清单类中为该目录下资源生成索引项

  • 在xml文件中可以通过如下语法格式来访问:@[<package_name>:]raw/file_name
  • 在Java文件中按如下语法来访问:R.raw.<file_name>

2.2 使用案例

主要使用两种方式获取资源,实现利用MediaPlayer类来播放声音的功能,代码如下:

public class RawResTest extends AppCompatActivity
{
	MediaPlayer mediaPlayer1 = null;
	MediaPlayer mediaPlayer2 = null;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//方式1:直接根据声音文件的ID来创建MediaPlayer对象1。
		mediaPlayer1 = MediaPlayer.create(this, R.raw.bomb);
		//方式2:获取该应用的AssetManager
		AssetManager am = getAssets();
		try
		{
			//获取指定文件对应的AssetFileDescriptor。
			AssetFileDescriptor afd = am.openFd("shot.mp3");
			mediaPlayer2 = new MediaPlayer();
			//使用MediaPlayer加载指定的声音文件。
			mediaPlayer2.setDataSource(afd.getFileDescriptor());
			mediaPlayer2.prepare();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		// 获取第一个按钮,并为它绑定事件监听器
		Button playRaw = (Button) findViewById(R.id.playRaw);
		playRaw.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View arg0)
			{
				//播放声音
				mediaPlayer1.start();
			}
		});
		// 获取第二个按钮,并为它绑定事件监听器
		Button playAsset = (Button) findViewById(R.id.playAsset);
		playAsset.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View arg0)
			{
				//播放声音
				mediaPlayer2.start();
			}
		});
	}
}

3 样式与主题

3.1 样式资源

3.1.1 资源简介

如果经常对某个类型的组件指定大致相似的格式时,每次都为View组件重复指定这些属性,会有大量工作量,不利于项目后期的维护。一个样式等于一组格式的集合,假如某段文本使用某个样式,那么该格式将整体应用于这段文本;Android样式与此类似,也包含一组格式,为一个组件设置使用某个样式时。该样式包含的全部格式将会应用于该组件。

样式是属性的集合,例如定义属性fontColor、fontSize、layout_width、layout_height等,以独立的资源文件存放在XML文件中,并设置样式的名称。

样式资源在res/values/下创建Style XML资源文件,这里创建的Style资源文件名命名为styles.xml,这个可以自己自定义。

3.1.2 style样式资源语法规则

styles.xml的语法格式内容如下:

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <style name="wrap_content">  
        <item name="android:layout_width">wrap_content</item>  
        <item name="android:layout_height">wrap_content</item>  
    </style>  
</resources> 

Android Style 让设计与内容分离,且可以方便的继承、覆盖。

3.1.3 style的继承方式

style的继承方式有2种:

  • 通过style的parent属性。
  • 使用类似CSS中的命名规则来实现。

分别解读如下:

@1 通过parent属性,修改styles.xml实现方式如下:

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <style name="wrap_content">  
        <item name="android:layout_width">wrap_content</item>  
        <item name="android:layout_height">wrap_content</item>  
    </style>  
      
    <style name="inherit" parent="wrap_content">  
        <item name="android:textColor">#00FF00</item>  
    </style>  
</resources>

新增名为inherit的样式,并且继承名为wrap_content样式,即inherit具有wrap_content样式中定义的属性参数。引用方式为:style="@style/inherit"。

@2 通过命名规则实现,xml配置代码如下所示:

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <style name="wrap_content">  
        <item name="android:layout_width">wrap_content</item>  
        <item name="android:layout_height">wrap_content</item>  
    </style>  
      
    <style name="wrap_content.inherit">  
        <item name="android:textColor">#00FF00</item>  
    </style>  
</resources>

通过“.”号实现继承。引用方式:style="@style/wrap_content.inherit"

3.1.4 样式布局使用案例

样式在布局文件中的使用实例如下所示:

<?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"  
    >  
<TextView  
    style="@style/wrap_content"  
    android:textColor="#00FF00"  
    android:text="@string/hello" />            
<TextView  
    style="@style/wrap_content"  
    android:text="@string/hello" />        
<Button   
    style="@style/wrap_content"  
    android:text="@string/hello"  
/>  
</LinearLayout>  

最后总结:style就是为控件的UI属性所做的封装,这样方便复用。

3.2 主题资源

3.2.1 基本概念

  • 主题资源与样式的区别:主题不能用于单个View组件,它是对整个应用所有Activity或指定Activity起作用。
  • 主题格式:改变窗口外观的格式,例如窗口标题、窗口边框等。

3.2.2 配置与使用主题

这里通过一个案例来添加一个新的主题(所有窗口都添加边框、背景的主题)在XML文件中定义主题,配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <style name="AgsTheme">
        <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>

@1 在AndroidManifest.xml文件中使用主题

在application中android:theme属性中指定特定的主题,配置如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ags.res"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AgsTheme">        
        <activity
            android:name=".StyleResTest"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

说明:Android中提供了几种内置的主题资源,通过查询Android.R.style类可以看到Android已经设计好的主题。主题和样式一样,可以通过集成来实现自定义主题,参考模板如下:

<resources>
<style name="AgsTheme" parent=“@android:style/Theme.Dialog”>
...
</style>
</resources>

@2 在代码中使用主题,方式如下:

public class StyleResTest extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setTheme(R.style.CrazyTheme);//注意:
        setContentView(R.layout.main);
    }
}

4 9Patch图片资源简介

4.1 9Patch图片简介

@1 9Patch是什么?

9Patch是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:“.9.PNG”

@2 那么为什么要有9Patch图片资源?

  • 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形。
  • 同时Android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边角会模糊失真。如果使用“.9.PNG”技术,可以将图片横向和纵向同时进行拉伸,以实现在多分辨率下的完美显示效果。

普通拉伸和点九拉伸效果对比如下所示:

对比很明显,使用.9Patch图片资源后,仍能保留图像的渐变质感,和圆角的精细度。

@3 为什么叫“.9.png”文件名?

其实相当于把一张png图分成了9个部分(九宫格),分别为4个角,4条边,以及一个中间区域,4个角是不做拉深的;所以还能一直保持圆角的清晰状态,而2条水平边和垂直边分别只做水平和垂直拉伸;所以不会出现边会被拉粗的情况,只有中间用黑线指定的区域做拉伸。结果是图片不会走样
Android系统程序有对其优化的算法,效果比一般的图片适应要好。

@4 “.9.png”关于横纹问题的解决

由于android手机屏幕的材质质量差距大。很多屏幕不支持16位以上的颜色显示。所以渲染后结果出现丢失颜色,故造成横纹显示。经与多款android手机对比后发现,屏幕越次的手机横纹越明显。而使用了*.9.png图片技术后,只需要采用一套界面切图去适配不同的分辨率,而且大幅减少安装包的大小。而且这样程序不需要专门做处理的就可以实现其拉伸,也减少了代码量和开发工作量。

4.2 使用9Patch工具绘制.9.png图片

打开你的.9图片绘画工具,只要你下载安装了android的SDK就可以使用,工具在tools里面。

  • (windows下:SDK安装在D盘那么draw9patch.bat就在D:\android-sdk-windows\tools\draw9patch.bat里)
  • (ubuntu 下:SDK安装在/home/wangdsh/WorkContent/AGS-SoftWareLnk/android_sdk/tools/draw9patch里)

执行 draw9patch 命令即可。打开后点击左上角的open按钮选择你要制作的图片。 打开图片后,在图片的四个边都有区域可以通过鼠标绘画。

  • 图中介绍了每个区域的内容及功能注释。
  • 右边的区域分别是纵向拉伸,横向拉伸,横向纵向都拉伸的效果。

在图片边缘点击左键,绘制出黑线,即图片需要被拉伸的部分。如下图,对4条黑线做了注释。

如果失误多绘的部分,可按住shift键的同时点击鼠标左键擦除。绘制完毕后,点击左上角的保存图片。图片就可以用于Android项目中了,拉伸也不会失帧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值