解决Android使用Svg兼容5.0以下手机导致OOM的问题
2018-02-23 13:00
561 查看
从上图别人测试结果可知,开启setCompatVectorFromResourcesEnabled(true)之后,每打开一个使用svg的页面,会生成一个新的Resources实例,从而导致的OOM。
从官方文档可知,开启setCompatVectorFromResourcesEnabled(true)之后可能存在问题。
避免vector导致OOM
1、xml中使用app:srcCompat来引用svg的drawable
2、代码中通过setImageResource(int)
3、其他public class ViewUtil {
public static void setViewBackground(View view, Drawable background) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setBackground(background);
} else {
view.setBackgroundDrawable(background);
}
}
/**
* 设置TextView使用Vector做drawableLeft
*
* @param drawableWidth 单位是dip
* @param drawableHeight 单位是dip
* @param drawablePadding 单位是dip
*/
public static void setVectorDrawableLeft(TextView textView, VectorDrawableCompat drawable, int drawableWidth,
int drawableHeight, int drawablePadding) {
if (drawable == null) {
return;
}
drawable.setBounds(0, 0, CommonUtils.dip2px(drawableWidth), CommonUtils.dip2px(drawableHeight));
textView.setCompoundDrawablePadding(CommonUtils.dip2px(drawablePadding));
textView.setCompoundDrawables(drawable, null, null, null);
}
/**
* 设置TextView使用Vector做drawableRight
*
* @param drawableWidth 单位是dip
* @param drawableHeight 单位是dip
* @param drawablePadding 单位是dip
*/
public static void setVectorDrawableRight(TextView textView, VectorDrawableCompat drawable, int drawableWidth,
int drawableHeight, int drawablePadding) {
if (drawable == null) {
return;
}
drawable.setBounds(0, 0, CommonUtils.dip2px(drawableWidth), CommonUtils.dip2px(drawableHeight));
textView.setCompoundDrawablePadding(CommonUtils.dip2px(drawablePadding));
textView.setCompoundDrawables(null, null, drawable, null);
}
/**
* 设置TextView使用Vector做drawableTop
*
* @param drawableWidth 单位是dip
* @param drawableHeight 单位是dip
* @param drawablePadding 单位是dip
*/
public static void setVectorDrawableTop(TextView textView, VectorDrawableCompat drawable, int drawableWidth,
int drawableHeight, int drawablePadding) {
if (drawable == null) {
return;
}
drawable.setBounds(0, 0, CommonUtils.dip2px(drawableWidth), CommonUtils.dip2px(drawableHeight));
textView.setCompoundDrawablePadding(CommonUtils.dip2px(drawablePadding));
textView.setCompoundDrawables(null, drawable, null, null);
}
/**
* 设置TextView使用Vector做drawableBottom
*
* @param drawableWidth 单位是dip
* @param drawableHeight 单位是dip
* @param drawablePadding 单位是dip
*/
public static void setVectorDrawableBottom(TextView textView, VectorDrawableCompat drawable, int drawableWidth,
int drawableHeight, int drawablePadding) {
if (drawable == null) {
return;
}
drawable.setBounds(0, 0, CommonUtils.dip2px(drawableWidth), CommonUtils.dip2px(drawableHeight));
textView.setCompoundDrawablePadding(CommonUtils.dip2px(drawablePadding));
textView.setCompoundDrawables(null, null, null, drawable);
}
/** 设置使用Vector做selector,作为view的背景 */
public static void setVectorSelectorBackground(View view, VectorDrawableCompat normalVector,
VectorDrawableCompat pressedVector) {
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressedVector);
stateListDrawable.addState(new int[]{}, normalVector);
setViewBackground(view, stateListDrawable);
}
}经测试不用开启setCompatVectorFromResourcesEnabled(true),在5.0以下可以正常使用svg。
以上基本满足大多数场景对svg的使用了。
相关文章推荐
- 解决Picasso在Android 5.0以下版本不兼容https导致图片不显示
- Android使用webview加载网页,解决上传文件适配3.0、4.0、5.0手机存在的问题。
- android 5.0以下版本使用atof报错解决
- Android:关于Android Studio连接手机的各种问题 & 解决“通常每个套接字地址(协议/网络地址/端口)只允许使用一次(10048)”的问题。
- Android Material Design 详解(使用support v7兼容5.0以下系统)
- Android 不同手机的cpu架构不同导致的一系列第三方sdk调用出问题的解决办法
- android 手机拍照后获取图片导致OOM问题
- Android使用bitmap导致内存溢出(oom)问题
- 已解决:EditText被底部固定栏挡住,使用AndroidBug5497Workaround出现兼容问题
- Linux应用随笔(五)64位Debian8兼容运行32位adb开发android应用,并解决手机驱动问题
- Android 调试遇到RSA key导致手机Offline或Unauthorized问题的终极解决方法
- Android 解决由于使用SlidingMenu导致虚拟键盘挡住底部菜单栏的问题
- 解决因手机客户端android网络不稳定而导致asmack不能自动重连接openfire的问题
- 使用Cordova来解决HTML5制作的WebView手机不兼容的问题
- Android Activity使用Dialog样式导致点击空白处自动关闭的问题解决
- 关于使用NotificationComat导致android2.3及以下版本无法显示自定义布局的解决方法.
- Android Material Design 详解(使用support v7兼容5.0以下系统(部分功能))
- Android中解决图像解码导致的OOM问题
- Android Material Design 详解(使用support v7兼容5.0以下系统)
- 【Android问题及其解决】又见图片导致的OOM