jar包中含有Android图片文件以及按钮等selector.xml的替代方案
在做SDK时,需求为Jar,即图片等都必须打包进入Jar中。
经过一个上午的努力,成果如下:
1.除9.png外的资源图片 都可以打包入Jar中,并能正常解析使用。
2.由StateListDrawable来取代selector.xml实现按钮的不同点击状态的效果图。
3.总之,全部入一个Jar中,无其它文件
实现:
图片全部入assets目录,使用以下代码把jpg/png转为Drawable
/**
* 读取指定asset目录中的图片文件为 Drawable
*
* @param context
* @param imageFileName
* @return null if exception happened.
*/
public static Drawable getDrawableFromAssets(Context context,
String imageFileName) {
Drawable result = null;
AssetManager assetManager = context.getAssets();
InputStream is = null;
try {
is = assetManager.open(imageFileName);
result = Drawable.createFromStream(is, null);
is.close();
is = null;
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
绑定按钮的状态图片:
private void bindSelectDrawable(Context context) {
bindButtonDrawable(context, mPositiveButton, POSITVE_BTN_NORMAL_IMG,
POSITVE_BTN_PRESSED_IMG);
bindButtonDrawable(context, mNeutralButton, NEUTRAL_BTN_NORMAL_IMG,
NEUTRAL_BTN_PRESSED_IMG);
bindButtonDrawable(context, mNegativeButton, NEGATIVE_BTN_NORMAL_IMG,
NEGATIVE_BTN_PRESSED_IMG);
}
/**
*
* @param context
* @param button
* @param nornalImageFileName
* @param pressedImageFileName
*/
private void bindButtonDrawable(Context context, Button button,
String nornalImageFileName, String pressedImageFileName) {
StateListDrawable stateListDrawable = new StateListDrawable();
Drawable normalDrawable = ApkUtil.getDrawableFromAssets(context,
nornalImageFileName);
Drawable pressedDrawable = ApkUtil.getDrawableFromAssets(context,
pressedImageFileName);
stateListDrawable.addState(new int[] { android.R.attr.state_active },
normalDrawable);
stateListDrawable.addState(new int[] { android.R.attr.state_pressed,
android.R.attr.state_enabled }, pressedDrawable);
stateListDrawable.addState(new int[] { android.R.attr.state_focused,
android.R.attr.state_enabled }, normalDrawable);
stateListDrawable.addState(new int[] { android.R.attr.state_enabled },
normalDrawable);
button.setBackgroundDrawable(stateListDrawable);
}
至于动态布局来取代layout.xml就不说了,比较简单。