标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵活。
229. 230. 231.
21. Android Drawable叠加处理方法
大家可能知道Bitmap的叠加处理在Android平台中可以通过Canvas一层一层的画就行了,而Drawable中如何处理呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,今天Android123给大家说下好用简单的LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简单的代码表
示:
Drawable[] array = new Drawable[3]; array[0] = new PaintDra
wable(Color.BLACK); //黑色 233. 234. 235.
array[1] = new PaintDrawable(Color.WHITE); //白色 array[2] = new BitmapDrawable(bm); //位图资源
LayerDrawable ld = new LayerDrawable(array); //参数为上面的
Drawable数组 236.
ld.setLayerInset(1, 1, 1, 1, 1); //第一个参数1代表数组的第二
个元素,为白色 237.
ld.setLayerInset(2, 2, 2, 2, 2); //第一个参数2代表数组的第三
个元素,为位图资源 238. 239.
mImageView.setImageDrawable(ld);
上面的方法中LayerDrawable是关键,Android开发网提示setLayerInset方法原型为
public void setLayerInset (int index, int l, int t, int r, int b) 其中第一个参数为层的索引号,后面的四个参数分别为left、top、right和bottom。对于简单的图片合成我们可以将第一和第二层的PaintDrawable换成BitmapDrawable即可实现简单的图片合成。
240.22. onRetainNonConfigurationInstance和
getLastNonConfigurationInstance 241.
很多网友可能知道Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState,但是Android的Activity类还有一个方法名为onRetainNonConfigurationInstance和
getLastNonConfigurationInstance这两个方法。 我们可以通过 onRetainNonConfigurationInstance 代替 onSaveInstanceState,比如距离2 242. 243. 244. 245. 246.
//这里需要保存的内容,在切换时不是bundle了,我们可以直接
通过Object来代替 247. 248.
return obj;
} 在恢复窗口时,我们可以不使用 onRestoreInstanceState,而代替
的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如 Object obj = getLastNonConfigurationInstance(); 最终obj的内容就是上次切换时的内容。 这里Android123提醒大家,每次Activity横竖屏切换时onCreate方法都会被触发。 249. 250. 251. 252.
23. Android中String资源文件的format方法
很多时候我们感性Google在设计Android时遵守253. 254. 255. 256. 257.了大量MVC架构方式,可以让写公共代码、美工和具体逻辑开发人员独立出来。有关Android的资源文件values/strings.xml中如何实现格式化字符串呢? 这里Android123举个简单的例子,以及最终可能会用到哪些地方。
上面是一段简单的字符串资源文件,没有用到格式化,因为比较简单
直接描述了意思,当我们设计一个类似 Delete xxx File ? 的时候,我们可能需要在Java中动态获取 xxx 的名称,所以定义资源时使用格式化可以轻松解决,不需要一堆String去拼接或StringBuffer一个一个append这样的愚蠢方法,看例
子
这里%1$s代表这是一个字符串型的,如果是整数型可以写为%1$d,类似printf这样的 格式化字符串函数,当然如果包含了多个需要格式化的内容,则第二个可以写为%2$s或%2$d了,那么最终在Java中如何调用呢? 258.
看下面的例子: 例一: 整数型
的
定义的是这样的 当然,我们杜绝意外情况,比如冒出个secret这样的string类型的,注意上面是%1$d不是%1$s,所以默认标准的合并成 为 int nAge=23; String sAgeFormat = getResources().getString(R.string.alert); String sFinalAge = String.format(sAgeFormat, 259.
nAge); 这样执行完后,就组成了 I am 23 years old,是不是很方
便啊. 当然了,下面看下String字符串时的情况. 例二: 字符串型的 String sName=\资源定义为
则Java中只需 要 String sInfoFormat = getResources().getString(R.string.alert2); 260.
String sFinalInfo=String.format(sInfoFormat, sName, sCity); 我
们看到了整个,整个定义类似MFC的CString::Format或Mac OS中的NSLog,但是需要显示类似C#中那样显示的标出参数的数字,比如%1或%n,这里数字代表参数的第n个。本行最终sFinalInfo显示的内容为 My name is cwj , I am form Shanghai 。当然了你有什么不懂的地方可以来函至 261.
e=\@163.com
262. 263.24. Android工程内嵌资源文件的两种方法
Android软件一般处理大的资源通过sdcard比如在线下载资源到sdcard,而apk中内嵌资源或二进制文件时一般使用下面的两种方法: 方法一 res/raw目录下存放,比如cwj.dat一个二进制文件,我们可以读取可以直
接 InputStream is=context.getResources().openRawResource(R.raw.cwj); 方法二 工程根目录下的assets文件夹中存放,比如assets/cwj.dat 这样我们使用下面的代码 264. 265.
AssetManager am = context.getAssets();
InputStream is = am.open(cwj.dat); 这里Android123提示大家
Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报异常具体数值大家可以测试下传
个稍大的文件,我们在两年前的文章中有提到,而第一种raw没这个限制可以放个4MB的Mp3文件没问题。
266. 267. 268.25. Android自定义View以及layout属性全攻略
对于Android系统的自定义View可能大家都熟悉了,对于自定义View的属性添加,以及Android的Layout的命名空间问题,很多网友还不是很清楚,今天Android123一起再带大家温习一下 CwjView myView=new CwjView(context); 如果用于游戏或整个窗体的界面,我们可能直接在onCreate中setContentView(myView); 当然如果是控件,我们可能会需要从Layout的xml中声明,比
如
android:layout_width=\ android:layout_height=\ /> 当然,我们也可以直接从父类声明比
如
android:layout_width=\ android:layout_height=\
/> 上面我们仅用了父类View的两个属性,均来自android命名空
间,而名称为layout_width或layout_height,我们自定义的控件可能有更多的功能,比如
android:layout_width=\ android:layout_height=\ cwj:age=\ cwj:university=\ cwj:city=\ />
我们可以看到上面的三个属性,是我们自定义的。作为标准xml规
范,可能还包含了类
似 xmlns:android=\m/apk/res/android\这样的语句,对于定义完整的View,我们的命名空间为cwj,这里可以写
为 xmlns:cwj=http://schemas.android.com/apk/res/cn.com.android123.cwjView
283. 或 xmlns:cwj=http://schemas.android.co
m/apk/res/android 都可以。 对于定义的cwj命名空间和age、university以及city的三个属性我们如何定义呢? 在工程的res/values目录中我们新建一个cwj_attr.xml文件,编码方式为utf-8是一个好习惯,内容如下
284. 285. 286. 287. 288. 289. 290. 291.
这里我们可能对format不是很熟悉,目前Android系统内置的格式
类型有integer比如ProgressBar的进度值,float比如RatingBar的值可能是3.5颗星,boolean比如ToggleButton的是否勾选,string比如TextView的text属性,当然除了我们常见的基础类型外,Android的属性还有特殊的比如color是用于颜色属性的,可以识别为#FF0000等类型,当然还有dimension的尺寸类型,比如23dip,15px,18sp的长度单位,还有一种特殊的为reference,一般用于引用@+id/cwj 292.
@drawable/xxx这样的类型。 当然什么时候用reference呢? 我们
就以定义一个颜色为例
子,
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.cwj_attr);
mAge = a.getInteger(R.styleable.CwjView_age, 22); mCity = a.getString(R.styleable.CwjView_city, \