Files
MoGoAiCloudSdk/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinAttribute.java
donghongyu cb397d919a 「Update」
1、增加isUseSkin属性,来针对性的开启换肤,防止大面积误伤其它View。原因是很多数据、图片都是动态设置的。会把设置的数据冲掉;
2024-10-25 17:47:31 +08:00

131 lines
4.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.mogo.skin;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.mogo.skin.utils.SkinThemeUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author donghongyu
* @description : 属性集合 需要针对哪些属性进行替换
*/
public class SkinAttribute {
private static final List<String> mAttributes = new ArrayList<>();
static {
mAttributes.add("background");
mAttributes.add("src");
mAttributes.add("textColor");
mAttributes.add("textColorHint");
mAttributes.add("drawableLeft");
mAttributes.add("drawableTop");
mAttributes.add("drawableRight");
mAttributes.add("drawableBottom");
mAttributes.add("skinTypeface");
mAttributes.add("isUseSkin");
mAttributes.add("text");
mAttributes.add("hint");
}
private static final String TAG = "SkinAttribute";
/**
* 记录换肤需要操作的View
*/
List<SkinView> mSkinViews = new ArrayList<>();
public SkinAttribute() {
}
/**
* 记录View中哪几个属性需要换肤,找到当前页面的所有属性
*/
public void load(View view, AttributeSet attrs) {
// 记录View是否配置了isUseSkin属性
boolean isUseSkin = false;
List<SkinPair> skinPairs = new ArrayList<>();
for (int i = 0; i < attrs.getAttributeCount(); i++) {
//获得属性名
String attributeName = attrs.getAttributeName(i);
// 筛选配置了换肤属性的View防止因为换肤导致。动态控制了状态的View被还原的问题
if (attributeName.equals("isUseSkin")) {
isUseSkin = true;
}
//是否符合 需要筛选的属性名
else if (mAttributes.contains(attributeName)) {
//属性名写法
//#ffff
//?attr/xxx
//@string/xxx
String attributeValue = attrs.getAttributeValue(i);
//如果是写死的字符串 #fffff
if (attributeValue.startsWith("#")) {
continue;
}
//资源id
int resId = 0;
//以?开头的表示用属性
if (attributeValue.startsWith("?")) {
//attr Id
int attrId = Integer.parseInt(attributeValue.substring(1));
//获得 主题 style 中的 对应 attr 的资源id值
resId = SkinThemeUtils.getResId(view.getContext(), new int[]{attrId})[0];
} else {
try {
// 以@开头的
// @12343455332
String resIdStr = attributeValue.substring(1);
if (isNumeric(resIdStr)) {
resId = Integer.parseInt(resIdStr);
}
} catch (Exception e) {
// 由于有时候TextView会直接配置文字而不是用 @string/XXX 所以会导致这里转换异常,车里简单的处理异常跳过即可
e.printStackTrace();
}
}
if (resId != 0) {
//可以被替换的属性
SkinPair skinPair = new SkinPair(attributeName, resId);
skinPairs.add(skinPair);
}
}
}
//将View与之对应的可以动态替换的属性集合 放入 集合中
if (isUseSkin) {
Log.d(TAG, "View 开启了换肤……isUseSkin");
if (!skinPairs.isEmpty() || view instanceof SkinViewSupport) {
//选择皮肤 更新
SkinView skinView = new SkinView(view, skinPairs);
skinView.applySkin();
mSkinViews.add(skinView);
}
}
}
public static boolean isNumeric(String str) {
if (str == null) {
return false;
}
return str.matches("-?\\d+(\\.\\d+)?"); // 匹配整数或小数
}
/**
* 换皮肤
*/
public void applySkin() {
for (SkinView mSkinView : mSkinViews) {
mSkinView.applySkin();
}
}
}