您的位置:首页 > 移动开发 > Android开发

解决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的使用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐