IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 根据主题不同,引用不同的资源文件 -> 正文阅读

[移动开发]根据主题不同,引用不同的资源文件

在开发中,一款APP会设置几款皮肤,也就会涉及到资源文件的引用问题。

现在来摸鱼记录一下吧。

一、首先建立几个style,也就是我们的皮肤style。比如:

<style name="ClassicTneme" parent="Theme.MaterialComponents.Light.NoActionBar">
        <item name="android:windowIsTranslucent">true</item>
        <item name="colorPrimary">@color/primaryColor_theme1</item>
        <item name="colorOnPrimary">#fafafa</item>
        <item name="colorPrimaryDark">@color/primaryDarkColor_theme1</item>
        <item name="colorPrimaryVariant">@color/primaryDarkColor_theme1</item>
        <item name="colorSecondary">@color/secondaryColor_theme1</item>
        <item name="colorSecondaryVariant">@color/secondaryLightColor_theme1</item>
        <item name="colorOnSecondary">#fafafa</item>
        <item name="android:textColor">#181818</item>
        <item name="colorSurface">#ffffff</item>
        <item name="colorOnSurface">#000000</item>
        <item name="colorError">#ff0000</item>
        <item name="actionModeBackground">@color/secondaryColor_theme1</item>
        <item name="actionModeCloseDrawable">@null</item>

    </style>
<style name="AppTheme2" parent="Theme.MaterialComponents.Light.NoActionBar">
        <item name="colorPrimary">@color/primaryColor_theme2</item>
        <item name= "colorPrimaryDark">@color/primaryDarkColor_theme2</item>
        <item name="colorPrimaryVariant">@color/primaryDarkColor_theme2</item>
        <item name="colorSecondary">@color/secondaryColor_theme2</item>
        <item name="colorSecondaryVariant">@color/secondaryLightColor_theme2</item>

        <item name="colorOnPrimary">#ffffff</item>
        <item name="colorOnSecondary">#fafafa</item>
        <item name="android:textColor">#181818</item>
        <item name="colorSurface">#ffffff</item>
        <item name="colorOnSurface">#000000</item>
        <item name="colorError">#ff0000</item>
        <item name="actionModeBackground">@color/secondaryColor_theme2</item>
        <item name="actionModeCloseDrawable">@null</item>


    </style>

可以看到,这两款风格都有相同name的item,它们在不同的风格下的设置不同,当然对于图片资源也可以使用这种方式来配置,但是当图片资源过多的时候,每个风格下面都需要建立一个同名item,然后将这个item值分别设置为这两张图片,这样配置就很麻烦了,而且在新增资源文件的时候,需要在每个风格下配置,也很麻烦呢。

这种情况下,可以采用某种规律对图片进行命名,然后定义一套基于主题来搜索图片的方法就可以啦。比如,界面在两种风格下分别引用的是图片A,图片B。那么我们可以对图片A命名为icon_background_theme1,icon_background_theme2.这样我们在引用文件的时候,直接传入icon_background_theme1,根据当前设置的主题来对引用的资源名进行剪切拼接,从而获取我们想要的资源名称或者id。

这个时候就需要写一个这样的工具类啦。

public class ThemeUtil {
    private static String sThemeValue = "1";
    private static int sTheme = R.style.ClassicTneme;
    private static ContextThemeWrapper contextThemeWrapper;

    
    public static void initTheme(Application context) {
        LocalSharePara localSharePara = new LocalSharePara(context.getSharedPreferences("localShare", MODE_PRIVATE));
        sThemeValue = localSharePara.getThemeStyle();
        if (sThemeValue.equals("1")) {
            sTheme = R.style.ClassicTneme;
        } else if (sThemeValue.equals("2")) {
            sTheme = R.style.AppTheme2;
        } else {
            sTheme = R.style.AppTheme3;
        }
        contextThemeWrapper = new ContextThemeWrapper(context, sTheme);
    }

    
    public static int getTheme() {
        return sTheme;
    }
  
    public static int getAttrColor(@AttrRes int attr) {
        TypedValue typedValue = new TypedValue();
        contextThemeWrapper.getTheme().resolveAttribute(attr, typedValue, true);
        return typedValue.data;
    }

    @Nullable
    public static Drawable loadThemeDrawable(@DrawableRes int id) {
        Resources resources = Utils.getApp().getResources();
        String defaultName = resources.getResourceEntryName(id);
        return loadThemeDrawable(defaultName);
    }
    public static Bitmap loadThemeBitmap(@DrawableRes int id){
        Drawable drawable = loadThemeDrawable(id);
        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE? Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565;
        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight(),config);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicWidth());
        drawable.draw(canvas);
        return bitmap;
    }


    @SuppressLint("RestrictedApi")
    public static int loadThemeColor(@AttrRes int attrResId){
        return MaterialColors.getColor(contextThemeWrapper,attrResId, Color.BLACK);
    }
    @Nullable
    public static Drawable loadThemeDrawable(String defaultName) {
        String name = defaultName.replace("theme1", "theme" + sThemeValue);
        int id = ResourceUtils.getDrawableIdByName(name);
        if (id != 0) {
            return ResourceUtils.getDrawable(id);
        }
        return null;
    }

    public static int loadThemeDrawableId(@DrawableRes int defaultId) {
        Resources resources = Utils.getApp().getResources();
        String defaultName = resources.getResourceEntryName(defaultId);
        String name = defaultName.replace("theme1", "theme" + sThemeValue);
        int id = ResourceUtils.getDrawableIdByName(name);
        return id;
    }

    public static void applyImageViewTheme(ImageView imageView, @DrawableRes int id) {
        Drawable d = loadThemeDrawable(id);
        if (d != null) {
            imageView.setImageDrawable(d);
        }
    }
}

然后我们在Java代码中引用资源文件的时候,就通过这个工具类来引用,这不是整挺好么?

整挺好。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:11:02  更:2022-01-16 13:12:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:04:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码