/* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.micode.notes.tool; import android.content.Context; import android.content.res.Resources; import android.preference.PreferenceManager; import android.util.SparseIntArray; import net.micode.notes.R; import net.micode.notes.ui.NotesPreferenceActivity; /** * 资源解析工具类 - 提供笔记应用中各种UI资源的统一管理 * 功能包括: * 1. 笔记背景资源管理 * 2. 笔记布局资源管理 * 3. 小部件资源管理 * 4. 文本外观资源管理 * * 设计原则: * - 资源ID与语义常量分离 * - 添加深色模式支持 * - 增强资源选择的灵活性 */ public class ResourceParser { // 防止实例化 private ResourceParser() { throw new AssertionError("This class cannot be instantiated"); } /* ================== 颜色常量枚举 ================== */ /** * 预定义颜色类型枚举 */ public enum NoteColor { YELLOW(0), BLUE(1), WHITE(2), GREEN(3), RED(4), // 扩展更多颜色选项 PURPLE(5), ORANGE(6); public final int id; NoteColor(int id) { this.id = id; } private static final int DEFAULT_ID = YELLOW.id; /** * 获取默认颜色ID */ public static int getDefault() { return DEFAULT_ID; } /** * 从整数值获取颜色枚举 */ public static NoteColor fromId(int id) { for (NoteColor color : values()) { if (color.id == id) { return color; } } return YELLOW; } } /* ================== 字体大小常量枚举 ================== */ /** * 预定义字体大小类型枚举 */ public enum FontSize { SMALL(0), MEDIUM(1), LARGE(2), SUPER(3); public final int id; FontSize(int id) { this.id = id; } private static final int DEFAULT_ID = MEDIUM.id; /** * 获取默认字体大小ID */ public static int getDefault() { return DEFAULT_ID; } } /* ================== 主题模式常量 ================== */ /** * 应用主题模式 */ public enum ThemeMode { LIGHT(0), DARK(1), AUTO(2); public final int id; ThemeMode(int id) { this.id = id; } public static ThemeMode fromId(int id) { switch (id) { case 1: return DARK; case 2: return AUTO; default: return LIGHT; } } } /* ================== 笔记背景资源管理 ================== */ /** * 笔记背景资源集合 */ public static class NoteBgResources { // 编辑界面背景资源 private static final SparseIntArray BG_EDIT_RESOURCES = new SparseIntArray(); // 编辑界面标题背景资源 private static final SparseIntArray BG_EDIT_TITLE_RESOURCES = new SparseIntArray(); // 静态初始化资源映射 static { // 浅色主题资源 BG_EDIT_RESOURCES.put(NoteColor.YELLOW.id, R.drawable.edit_yellow); BG_EDIT_RESOURCES.put(NoteColor.BLUE.id, R.drawable.edit_blue); BG_EDIT_RESOURCES.put(NoteColor.WHITE.id, R.drawable.edit_white); BG_EDIT_RESOURCES.put(NoteColor.GREEN.id, R.drawable.edit_green); BG_EDIT_RESOURCES.put(NoteColor.RED.id, R.drawable.edit_red); BG_EDIT_RESOURCES.put(NoteColor.PURPLE.id, R.drawable.edit_purple); BG_EDIT_RESOURCES.put(NoteColor.ORANGE.id, R.drawable.edit_orange); BG_EDIT_TITLE_RESOURCES.put(NoteColor.YELLOW.id, R.drawable.edit_title_yellow); BG_EDIT_TITLE_RESOURCES.put(NoteColor.BLUE.id, R.drawable.edit_title_blue); BG_EDIT_TITLE_RESOURCES.put(NoteColor.WHITE.id, R.drawable.edit_title_white); BG_EDIT_TITLE_RESOURCES.put(NoteColor.GREEN.id, R.drawable.edit_title_green); BG_EDIT_TITLE_RESOURCES.put(NoteColor.RED.id, R.drawable.edit_title_red); BG_EDIT_TITLE_RESOURCES.put(NoteColor.PURPLE.id, R.drawable.edit_title_purple); BG_EDIT_TITLE_RESOURCES.put(NoteColor.ORANGE.id, R.drawable.edit_title_orange); } /** * 获取笔记编辑背景资源ID * * @param colorId 颜色ID * @return 对应的背景资源ID */ public static int getNoteBgResource(int colorId) { return BG_EDIT_RESOURCES.get(colorId, R.drawable.edit_yellow); } /** * 获取笔记标题背景资源ID * * @param colorId 颜色ID * @return 对应的标题背景资源ID */ public static int getNoteTitleBgResource(int colorId) { return BG_EDIT_TITLE_RESOURCES.get(colorId, R.drawable.edit_title_yellow); } /** * 获取支持的颜色ID数组 * @return 所有可用的颜色ID数组 */ public static int[] getAvailableColorIds() { int[] ids = new int[BG_EDIT_RESOURCES.size()]; for (int i = 0; i < BG_EDIT_RESOURCES.size(); i++) { ids[i] = BG_EDIT_RESOURCES.keyAt(i); } return ids; } } /** * 获取默认背景颜色ID * * @param context 上下文对象 * @return 背景颜色ID */ public static int getDefaultBgId(Context context) { // 检查是否启用随机背景颜色 if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { // 获取所有可用颜色ID int[] colorIds = NoteBgResources.getAvailableColorIds(); if (colorIds.length > 0) { return colorIds[(int) (Math.random() * colorIds.length)]; } } // 返回默认颜色 return NoteColor.getDefault(); } /* ================== 笔记布局资源管理 ================== */ /** * 笔记布局资源集合 */ public static class NoteLayoutResources { // 列表顶部背景资源 private static final SparseIntArray BG_FIRST_RESOURCES = new SparseIntArray(); // 列表中部背景资源 private static final SparseIntArray BG_NORMAL_RESOURCES = new SparseIntArray(); // 列表底部背景资源 private static final SparseIntArray BG_LAST_RESOURCES = new SparseIntArray(); // 单条笔记背景资源 private static final SparseIntArray BG_SINGLE_RESOURCES = new SparseIntArray(); // 文件夹背景资源 private static final SparseIntArray BG_FOLDER_RESOURCES = new SparseIntArray(); // 静态初始化资源映射 static { // 浅色主题资源 BG_FIRST_RESOURCES.put(NoteColor.YELLOW.id, R.drawable.list_yellow_up); BG_FIRST_RESOURCES.put(NoteColor.BLUE.id, R.drawable.list_blue_up); BG_FIRST_RESOURCES.put(NoteColor.WHITE.id, R.drawable.list_white_up); BG_FIRST_RESOURCES.put(NoteColor.GREEN.id, R.drawable.list_green_up); BG_FIRST_RESOURCES.put(NoteColor.RED.id, R.drawable.list_red_up); BG_FIRST_RESOURCES.put(NoteColor.PURPLE.id, R.drawable.list_purple_up); BG_FIRST_RESOURCES.put(NoteColor.ORANGE.id, R.drawable.list_orange_up); BG_NORMAL_RESOURCES.put(NoteColor.YELLOW.id, R.drawable.list_yellow_middle); BG_NORMAL_RESOURCES.put(NoteColor.BLUE.id, R.drawable.list_blue_middle); BG_NORMAL_RESOURCES.put(NoteColor.WHITE.id, R.drawable.list_white_middle); BG_NORMAL_RESOURCES.put(NoteColor.GREEN.id, R.drawable.list_green_middle); BG_NORMAL_RESOURCES.put(NoteColor.RED.id, R.drawable.list_red_middle); BG_NORMAL_RESOURCES.put(NoteColor.PURPLE.id, R.drawable.list_purple_middle); BG_NORMAL_RESOURCES.put(NoteColor.ORANGE.id, R.drawable.list_orange_middle); BG_LAST_RESOURCES.put(NoteColor.YELLOW.id, R.drawable.list_yellow_down); BG_LAST_RESOURCES.put(NoteColor.BLUE.id, R.drawable.list_blue_down); BG_LAST_RESOURCES.put(NoteColor.WHITE.id, R.drawable.list_white_down); BG_LAST_RESOURCES.put(NoteColor.GREEN.id, R.drawable.list_green_down); BG_LAST_RESOURCES.put(NoteColor.RED.id, R.drawable.list_red_down); BG_LAST_RESOURCES.put(NoteColor.PURPLE.id, R.drawable.list_purple_down); BG_LAST_RESOURCES.put(NoteColor.ORANGE.id, R.drawable.list_orange_down); BG_SINGLE_RESOURCES.put(NoteColor.YELLOW.id, R.drawable.list_yellow_single); BG_SINGLE_RESOURCES.put(NoteColor.BLUE.id, R.drawable.list_blue_single); BG_SINGLE_RESOURCES.put(NoteColor.WHITE.id, R.drawable.list_white_single); BG_SINGLE_RESOURCES.put(NoteColor.GREEN.id, R.drawable.list_green_single); BG_SINGLE_RESOURCES.put(NoteColor.RED.id, R.drawable.list_red_single); BG_SINGLE_RESOURCES.put(NoteColor.PURPLE.id, R.drawable.list_purple_single); BG_SINGLE_RESOURCES.put(NoteColor.ORANGE.id, R.drawable.list_orange_single); BG_FOLDER_RESOURCES.put(ThemeMode.LIGHT.id, R.drawable.list_folder_light); BG_FOLDER_RESOURCES.put(ThemeMode.DARK.id, R.drawable.list_folder_dark); } /** * 获取列表首项背景资源 * * @param colorId 颜色ID * @return 背景资源ID */ public static int getNoteBgFirstRes(int colorId) { return BG_FIRST_RESOURCES.get(colorId, R.drawable.list_yellow_up); } /** * 获取列表末项背景资源 * * @param colorId 颜色ID * @return 背景资源ID */ public static int getNoteBgLastRes(int colorId) { return BG_LAST_RESOURCES.get(colorId, R.drawable.list_yellow_down); } /** * 获取单条笔记背景资源 * * @param colorId 颜色ID * @return 背景资源ID */ public static int getNoteBgSingleRes(int colorId) { return BG_SINGLE_RESOURCES.get(colorId, R.drawable.list_yellow_single); } /** * 获取列表中间项背景资源 * * @param colorId 颜色ID * @return 背景资源ID */ public static int getNoteBgNormalRes(int colorId) { return BG_NORMAL_RESOURCES.get(colorId, R.drawable.list_yellow_middle); } /** * 获取文件夹背景资源(支持主题模式) * * @param themeMode 主题模式 * @return 文件夹背景资源ID */ public static int getFolderBgRes(ThemeMode themeMode) { return BG_FOLDER_RESOURCES.get(themeMode.id, R.drawable.list_folder_light); } } /* ================== 小部件资源管理 ================== */ /** * 小部件背景资源集合 */ public static class WidgetBgResources { // 2x小部件背景资源 private static final SparseIntArray BG_2X_RESOURCES = new SparseIntArray(); // 4x小部件背景资源 private static final SparseIntArray BG_4X_RESOURCES = new SparseIntArray(); // 静态初始化资源映射 static { // 浅色主题资源 BG_2X_RESOURCES.put(NoteColor.YELLOW.id, R.drawable.widget_2x_yellow); BG_2X_RESOURCES.put(NoteColor.BLUE.id, R.drawable.widget_2x_blue); BG_2X_RESOURCES.put(NoteColor.WHITE.id, R.drawable.widget_2x_white); BG_2X_RESOURCES.put(NoteColor.GREEN.id, R.drawable.widget_2x_green); BG_2X_RESOURCES.put(NoteColor.RED.id, R.drawable.widget_2x_red); BG_2X_RESOURCES.put(NoteColor.PURPLE.id, R.drawable.widget_2x_purple); BG_2X_RESOURCES.put(NoteColor.ORANGE.id, R.drawable.widget_2x_orange); BG_4X_RESOURCES.put(NoteColor.YELLOW.id, R.drawable.widget_4x_yellow); BG_4X_RESOURCES.put(NoteColor.BLUE.id, R.drawable.widget_4x_blue); BG_4X_RESOURCES.put(NoteColor.WHITE.id, R.drawable.widget_4x_white); BG_4X_RESOURCES.put(NoteColor.GREEN.id, R.drawable.widget_4x_green); BG_4X_RESOURCES.put(NoteColor.RED.id, R.drawable.widget_4x_red); BG_4X_RESOURCES.put(NoteColor.PURPLE.id, R.drawable.widget_4x_purple); BG_4X_RESOURCES.put(NoteColor.ORANGE.id, R.drawable.widget_4x_orange); } /** * 获取2x小部件背景资源 * * @param colorId 颜色ID * @return 背景资源ID */ public static int getWidget2xBgResource(int colorId) { return BG_2X_RESOURCES.get(colorId, R.drawable.widget_2x_yellow); } /** * 获取4x小部件背景资源 * * @param colorId 颜色ID * @return 背景资源ID */ public static int getWidget4xBgResource(int colorId) { return BG_4X_RESOURCES.get(colorId, R.drawable.widget_4x_yellow); } } /* ================== 文本外观资源管理 ================== */ /** * 文本外观资源集合 */ public static class TextAppearanceResources { // 文本外观资源映射 private static final SparseIntArray TEXTAPPEARANCE_RESOURCES = new SparseIntArray(); // 静态初始化资源映射 static { TEXTAPPEARANCE_RESOURCES.put(FontSize.SMALL.id, R.style.TextAppearanceSmall); TEXTAPPEARANCE_RESOURCES.put(FontSize.MEDIUM.id, R.style.TextAppearanceMedium); TEXTAPPEARANCE_RESOURCES.put(FontSize.LARGE.id, R.style.TextAppearanceLarge); TEXTAPPEARANCE_RESOURCES.put(FontSize.SUPER.id, R.style.TextAppearanceSuper); } /** * 获取文本外观资源 * * @param fontSizeId 字体大小ID * @return 文本外观资源ID */ public static int getTextAppearanceResource(int fontSizeId) { // 边界检查防止越界 int resourceId = TEXTAPPEARANCE_RESOURCES.get(fontSizeId, -1); return resourceId != -1 ? resourceId : FontSize.getDefault(); } /** * 获取可用文本大小数量 * * @return 可用字体大小数量 */ public static int getAvailableSizeCount() { return TEXTAPPEARANCE_RESOURCES.size(); } /** * 获取实际字体大小值(单位为sp) * * @param context 上下文 * @param fontSizeId 字体大小ID * @return 字体大小值(sp) */ public static float getFontSizeSp(Context context, int fontSizeId) { Resources res = context.getResources(); // 映射字体大小ID到实际尺寸值 switch (fontSizeId) { case 0: return res.getDimension(R.dimen.text_size_small) / res.getDisplayMetrics().scaledDensity; case 1: return res.getDimension(R.dimen.text_size_medium) / res.getDisplayMetrics().scaledDensity; case 2: return res.getDimension(R.dimen.text_size_large) / res.getDisplayMetrics().scaledDensity; case 3: return res.getDimension(R.dimen.text_size_super) / res.getDisplayMetrics().scaledDensity; default: return 16; // 默认16sp } } } /* ================== 新功能:主题资源解析 ================== */ /** * 获取当前应用主题模式 * * @param context 上下文 * @return 当前主题模式 */ public static ThemeMode getCurrentThemeMode(Context context) { // 从偏好设置获取主题ID int themeId = PreferenceManager.getDefaultSharedPreferences(context) .getInt(NotesPreferenceActivity.PREFERENCE_THEME_MODE, 0); return ThemeMode.fromId(themeId); } /** * 根据主题模式获取对应颜色ID * * @param colorId 基础颜色ID * @param themeMode 主题模式 * @return 适应主题的颜色ID */ public static int getThemeAdjustedColor(int colorId, ThemeMode themeMode) { // 深色模式下调整颜色饱和度 if (themeMode == ThemeMode.DARK) { switch (NoteColor.fromId(colorId)) { case YELLOW: return NoteColor.ORANGE.id; case WHITE: return NoteColor.BLUE.id; case GREEN: return NoteColor.PURPLE.id; default: return colorId; } } return colorId; } }