主要针对自定义组件的属性,具体格式如下:
这里定义一个styleable对象,每个styleable对象就是一组attr属性的集合(注意:这里的name属性并不是一定要和自定义类名相同,只是为了好区分对应类的属性而已 )。
attr属性资源的定义:name定义具体的属性名,format表示属性值类型,有以下几种:
reference:参考指定Theme中资源ID,这个类型表示你传的值可以是引用资源。string:若希望用类似"@string/test"引用资源的方式,可以写成format="string /reference"Color:颜色boolean:布尔值 dimension:尺寸值 float:浮点型 integer:整型 fraction:百分数flag:位或运算enum:枚举 ,如果你提供的属性只能让别人选择,不能随便传入,就可以写成这样
说明:这个属性资源文件是公共的,但是为了方便管理,一般都是一个自定义View里的属性写成一个declare-styleable集合。属性资源所定义的属性到底可以返回什么作用,取决于自定义组件的代码实现
1.2 配合XML属性资源的实例写出自定义组件的类文件了,然后将这个类里需要外界传入值的属性定义成一个属性资源文件。
在工程里的../res/values/目录下创建一个attrs.xml文件(文件名并不是只能写成这样,这样写只有一个目的,别人一看就知道这个文件是属性资源文件了),具体写法如下:
@1 attr.xml
@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();
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使用该组件时要为该自定义组件设置一个命名空间,命名空间写法为:
写包名时你的自定义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文件中可以通过如下语法格式来访问:@[ 主要使用两种方式获取资源,实现利用MediaPlayer类来播放声音的功能,代码如下: 如果经常对某个类型的组件指定大致相似的格式时,每次都为View组件重复指定这些属性,会有大量工作量,不利于项目后期的维护。一个样式等于一组格式的集合,假如某段文本使用某个样式,那么该格式将整体应用于这段文本;Android样式与此类似,也包含一组格式,为一个组件设置使用某个样式时。该样式包含的全部格式将会应用于该组件。 样式是属性的集合,例如定义属性fontColor、fontSize、layout_width、layout_height等,以独立的资源文件存放在XML文件中,并设置样式的名称。 样式资源在res/values/下创建Style XML资源文件,这里创建的Style资源文件名命名为styles.xml,这个可以自己自定义。 styles.xml的语法格式内容如下: Android Style 让设计与内容分离,且可以方便的继承、覆盖。 style的继承方式有2种: 通过style的parent属性。使用类似CSS中的命名规则来实现。
分别解读如下: @1 通过parent属性,修改styles.xml实现方式如下: 新增名为inherit的样式,并且继承名为wrap_content样式,即inherit具有wrap_content样式中定义的属性参数。引用方式为:。 @2 通过命名规则实现,xml配置代码如下所示: 通过“.”号实现继承。引用方式: 样式在布局文件中的使用实例如下所示: 最后总结:style就是为控件的UI属性所做的封装,这样方便复用。 主题资源与样式的区别:主题不能用于单个View组件,它是对整个应用所有Activity或指定Activity起作用。主题格式:改变窗口外观的格式,例如窗口标题、窗口边框等。
3.2.2 配置与使用主题
这里通过一个案例来添加一个新的主题(所有窗口都添加边框、背景的主题)在XML文件中定义主题,配置如下所示: @1 在AndroidManifest.xml文件中使用主题 在application中android:theme属性中指定特定的主题,配置如下所示: 说明:Android中提供了几种内置的主题资源,通过查询Android.R.style类可以看到Android已经设计好的主题。主题和样式一样,可以通过集成来实现自定义主题,参考模板如下: @2 在代码中使用主题,方式如下: @1 9Patch是什么? 9Patch是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:“.9.PNG” @2 那么为什么要有9Patch图片资源? 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形。同时Android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边角会模糊失真。如果使用“.9.PNG”技术,可以将图片横向和纵向同时进行拉伸,以实现在多分辨率下的完美显示效果。
普通拉伸和点九拉伸效果对比如下所示: 对比很明显,使用.9Patch图片资源后,仍能保留图像的渐变质感,和圆角的精细度。 @3 为什么叫“.9.png”文件名? 其实相当于把一张png图分成了9个部分(九宫格),分别为4个角,4条边,以及一个中间区域,4个角是不做拉深的;所以还能一直保持圆角的清晰状态,而2条水平边和垂直边分别只做水平和垂直拉伸;所以不会出现边会被拉粗的情况,只有中间用黑线指定的区域做拉伸。结果是图片不会走样 @4 “.9.png”关于横纹问题的解决 由于android手机屏幕的材质质量差距大。很多屏幕不支持16位以上的颜色显示。所以渲染后结果出现丢失颜色,故造成横纹显示。经与多款android手机对比后发现,屏幕越次的手机横纹越明显。而使用了*.9.png图片技术后,只需要采用一套界面切图去适配不同的分辨率,而且大幅减少安装包的大小。而且这样程序不需要专门做处理的就可以实现其拉伸,也减少了代码量和开发工作量。 打开你的.9图片绘画工具,只要你下载安装了android的SDK就可以使用,工具在tools里面。 (windows下:SDK安装在D盘那么draw9patch.bat就在D:android-sdk-windowstoolsdraw9patch.bat里)(ubuntu 下:SDK安装在/home/wangdsh/WorkContent/AGS-SoftWareLnk/android_sdk/tools/draw9patch里)
执行 draw9patch 命令即可。打开后点击左上角的open按钮选择你要制作的图片。 打开图片后,在图片的四个边都有区域可以通过鼠标绘画。 图中介绍了每个区域的内容及功能注释。右边的区域分别是纵向拉伸,横向拉伸,横向纵向都拉伸的效果。
在图片边缘点击左键,绘制出黑线,即图片需要被拉伸的部分。如下图,对4条黑线做了注释。 如果失误多绘的部分,可按住shift键的同时点击鼠标左键擦除。绘制完毕后,点击左上角的保存图片。图片就可以用于Android项目中了,拉伸也不会失帧。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 资源简介
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图片简介
Android系统程序有对其优化的算法,效果比一般的图片适应要好。



