夜间模式切换的实现库,三行代码实现流畅切换

本文介绍了一种适用于Android应用的简易夜间模式切换方案,通过自定义属性和样式资源实现ListView及RecyclerView等组件的日夜间模式快速切换。

Implementation of night mode for Android.

用最简单的方式实现夜间模式,支持ListView、RecyclerView

项目GitHub地址: https://github.com/zhangke301...

Preview


ChangeMode

Usage xml

    android:background="?attr/zzbackground"
    app:backgroundAttr="zzbackground"//如果当前页面要立即刷新,这里传入属性名称  比如R.attr.zzbackground  传zzbackground即可
    
    android:textColor="?attr/zztextColor"
    app:textColorAttr="zztextColor"//如需立即刷新页面效果  同上

java

@Override
    protected void onCreate(Bundle savedInstanceState) {
            // 在要立即切换效果的页面调用此方法
            ChangeModeController.getInstance().init(this,R.attr.class).setTheme(this, R.style.DayTheme, R.style.NightTheme);
            //在其他页面调用此方法  
            //ChangeModeController.setTheme(this, R.style.DayTheme, R.style.NightTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //添加额外view至夜间管理
        // ChangeModeController.getInstance().addBackgroundColor(toolbar, R.attr.colorPrimary);
        //ChangeModeController.getInstance().addBackgroundDrawable(view,R.attr.colorAccent);
       // ChangeModeController.getInstance().addTextColor(view,R.attr.colorAccent);


       // 设置切换
       //ChangeModeController.changeDay(this, R.style.DayTheme);
       //ChangeModeController.changeNight(this, R.style.NightTheme);
    }
         
 @Override
    protected void onDestroy() {
        super.onDestroy();
        //   在onDestroy调用
        ChangeModeController.onDestory();
    }

详细操作描述


第一步:自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
                <attr name="zzbackground" format="color|reference"/>
                <attr name="zzbackgroundDrawable" format="reference"/>
                <attr name="zztextColor" format="color"/>
                <attr name="zzItemBackground" format="color"/>
</resources>

第二步:配置夜间style文件

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
       <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowNoTitle">true</item>
    </style>

    <!--日间模式 -->
    <style name="DayTheme" parent="AppTheme">
        <item name="zzbackground">@color/dayBackground</item>
        <item name="zzbackgroundDrawable">@drawable/ic_launcher</item>
        <item name="zztextColor">@color/dayTextColor</item>
        <item name="zzItemBackground">@color/dayItemBackground</item>
    </style>

    <!--夜间模式 -->
    <style name="NightTheme" parent="AppTheme">
        <item name="zzbackground">@color/nightBackground</item>
        <item name="zzbackgroundDrawable">@color/nightBackground</item>
        <item name="zztextColor">@color/nightTextColor</item>
        <item name="zzItemBackground">@color/nightItemBackground</item>

        <item name="colorPrimary">@color/colorPrimaryNight</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDarkNight</item>
        <item name="colorAccent">@color/colorAccentNight</item>
    </style>


    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

为相关属性设置对应模式的属性值:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="dayBackground">#F2F4F7</color>
    <color name="dayTextColor">#000</color>
    <color name="dayItemBackground">#fff</color>

    <color name="nightItemBackground">#37474F</color>
    <color name="nightBackground">#263238</color>
    <color name="nightTextColor">#fff</color>
</resources>

第三步:在布局文件中配置使用对应属性

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:background="?attr/zzbackground"
    app:backgroundAttr="zzbackground"
    tools:context="com.thinkfreely.changemode.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:theme="@style/AppTheme.AppBarOverlay">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:backgroundAttr="colorPrimary"
            app:titleTextColor="?attr/zztextColor"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            />
    </android.support.design.widget.AppBarLayout>

        <Button
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:gravity="center"
            android:textColor="?attr/zztextColor"
            app:textColorAttr="zztextColor"
            android:background="?attr/zzItemBackground"
            app:backgroundAttr="zzItemBackground"
            android:padding="10dp"
            android:layout_marginBottom="8dp"
            android:textSize="22sp"
            android:textAllCaps="false"
            android:text="夜间模式切换by Mr.Zk" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"/>
</LinearLayout>

注意textColorAttrbackgroundAttrbackgroundDrawableAttr三个属性。如需当前页面立即刷新,需填加相应属性。

属性描述
textColorAttr修改字体颜色时设置。如R.attr.zztextColor 传zztextColor 即可。例:app:textColorAttr="zztextColor"
backgroundAttr修改背景颜色/背景图片时设置。同上。例: app:backgroundAttr="zzbackground"
backgroundDrawableAttr修改背景颜色/背景图片时设置。同上。例: app:backgroundDrawableAttr="zzbackground"

第四步:页面调用java代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
            //1. 在要立即切换效果的页面调用此方法
            ChangeModeController.getInstance().init(this,R.attr.class).setTheme(this, R.style.DayTheme, R.style.NightTheme);
            //在其他页面调用此方法  
            //ChangeModeController.setTheme(this, R.style.DayTheme, R.style.NightTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       //2.设置切换夜间活日间模式
       //ChangeModeController.changeDay(this, R.style.DayTheme);//切换日间模式
       //ChangeModeController.changeNight(this, R.style.NightTheme);//切换夜间模式
    }
 @Override
    protected void onDestroy() {
        super.onDestroy();
        //3.   在onDestroy调用
        ChangeModeController.onDestory();
    }

代码调用三步,即可开始夜间之旅。
如果页面有新创建的视图要加入夜间模式控制,代码调用:

         //添加额外view至夜间管理
        // ChangeModeController.getInstance().addBackgroundColor(toolbar, R.attr.colorPrimary);
        //ChangeModeController.getInstance().addBackgroundDrawable(view,R.attr.colorAccent);
       // ChangeModeController.getInstance().addTextColor(view,R.attr.colorAccent);

如果在改变夜间模式时有其他非标准定义的属性时,可在ChangeModeController.changeDayChangeModeController.changeNight之后调用如下代码给相关属性赋值:

   TypedValue  attrTypedValue = ChangeModeController.getAttrTypedValue(this, R.attr.zztextColor);
   toolbar.setTitleTextColor(getResources().getColor(attrTypedValue.resourceId));

项目GitHub地址: https://github.com/zhangke3016/ChangeMode

<think>好的,用户想要关于实现TXT阅读功能的具体建议。首先,我需要明确用户的具体需求。TXT阅读功能可能涉及多个方面,比如文件读取、编码处理、内容展示、用户界面设计、搜索功能、书签管理等等。用户可能是一个开发者,正在开发一个应用程序,需要集成TXT阅读功能,或者是想了解实现的基本步骤。 首先,考虑文件读取部分。TXT文件通常有不同的编码格式,比如UTF-8、GBK、ANSI等。如果编码处理不当,会导致乱码。所以需要确保程序能自动检测或正确处理不同编码。可能需要使用一些来自动检测文件的编码,比如Python中的chardet。 接下来是内容展示。如果是移动应用或桌面应用,需要处理分页或滚动显示。分页的话,需要计算每页能显示多少行,根据屏幕大小和字体尺寸动态调整。如果是Web应用,可能需要使用分页组件或者无限滚动。同时,字体大小和背景颜色的调整也是常见的需求,应该允许用户自定义这些设置,提升阅读体验。 然后是用户界面设计。需要简洁明了,可能包括目录结构显示(如果有章节的话)、进度条、跳转到指定页面的功能。如果是长文本,目录导航会很有帮助。另外,夜间模式也是一个受欢迎的功能,可以切换背景和文字颜色,减少眼睛疲劳。 搜索功能也是重要的。用户可能需要查找特定关键词,所以需要实现全文搜索,并高亮显示结果。同时,替换功能也可能有用,但TXT阅读通常以查看为主,替换可能不是必须的。 书签和阅读进度管理。用户希望下次打开时能继续阅读,所以需要保存进度,可能用本地存储或数据记录位置。书签功能允许用户标记多个位置,方便快速跳转。 性能优化方面,处理大文件时,不能一次性加载整个文件到内存,可能会造成卡顿或崩溃。需要分块读取,或者使用缓冲机制,逐步加载内容。比如在移动端,读取大文件时可以逐行读取,只显示当前页的内容,减少内存占用。 异常处理也很重要。比如文件损坏、权限问题、编码不支持等,需要有友好的错误提示,而不是让程序崩溃。 跨平台考虑。如果用户需要在不同操作系统或设备上使用,要确保编码兼容性和UI适配。例如,Windows和Linux对文件路径的处理不同,需要注意。 扩展功能方面,可以考虑朗读功能,集成TTS(文本到语音)引擎,或者添加翻译功能,调用API进行实时翻译。统计信息如字数、阅读时间,也可能对用户有帮助。 测试部分,需要覆盖不同大小的TXT文件,测试各种编码,模拟低内存情况,确保稳定性和响应速度。同时,用户交互测试,确保界面操作流畅。 技术选型的话,根据平台不同,选择适合的语言和框架。比如Python的PyQt做桌面端,Android用Java/Kotlin,iOS用Swift,Web用JavaScript框架如React或Vue。文件处理如Python的codecs、Java的InputStreamReader等。 可能用户没有提到的深层需求,比如支持其他格式转换,比如TXT转PDF,或者导出笔记。但这些可能超出基础阅读功能,属于进阶需求。另外,云同步功能,让用户在不同设备间同步阅读进度和书签,但需要后端支持。 总结下来,我需要分步骤给出建议,涵盖主要模块和注意事项,帮助用户系统性地实现功能,同时避免常见问题。</think>以下分步骤说明实现TXT阅读功能的具体建议: --- ### **一、核心功能实现** #### 1. 文件读取与编码处理 ```python # Python示例:自动检测编码并读取文件 import chardet def read_txt(file_path): with open(file_path, 'rb') as f: raw_data = f.read() encoding = chardet.detect(raw_data)['encoding'] return raw_data.decode(encoding, errors='replace') ``` - **关键点**:使用编码检测(如`chardet`),对GBK/UTF-8/ANSI等编码兼容处理 #### 2. 内容分页与渲染 - **分页算法**: $$ \text{每页行数} = \frac{\text{屏幕高度} - \text{边距}}{\text{行高}} $$ - **动态渲染**:根据字体大小、屏幕尺寸实时计算分页位置 #### 3. 基础交互功能 - 实现手势滑动/按钮翻页 - 添加进度条显示与页码跳转(如:`跳转到第$$ \frac{n}{总页数} \times 100\% $$进度`) --- ### **二、增强功能设计** #### 1. 搜索与高亮 - 使用正则表达式实现全文搜索 - 对匹配结果生成位置索引并高亮显示 #### 2. 书签与历史记录 - 使用本地存储(如`SQLite`)记录结构: ```json { "file_path": "/books/example.txt", "bookmarks": [{"page": 42, "timestamp": "2023-10-01"}] } ``` #### 3. 阅读优化 - **夜间模式**:通过CSS或主题引擎切换颜色方案 $$ \text{背景色} = (R,G,B) \rightarrow (255-R, 255-G, 255-B) $$ - **字体调节**:提供字号选择器(12pt-24pt) --- ### **三、性能优化** #### 1. 大文件处理策略 - **分块加载**:仅预加载当前页前后各10%的内容 - **内存映射**:使用`mmap`技术减少内存占用(适合C++/Java) #### 2. 异常处理 - 捕获并处理以下异常: ```java // Java示例:处理文件读取异常 try (BufferedReader br = new BufferedReader(new FileReader(file))) { // 读取操作 } catch (UnsupportedEncodingException e) { showToast("不支持的文本编码"); } ``` --- ### **四、技术选型建议** | 平台 | 推荐方案 | |------------|-----------------------------------| | **桌面端** | Python + PyQt/Qt的QTextEdit组件 | | **移动端** | Android-Jetpack Compose / iOS-SwiftUI | | **Web端** | React + Monaco Editor(支持大文件) | --- ### **五、测试要点** 1. 10MB以上大文件打开速度需 ≤2秒 2. 混合编码文件测试(如UTF-8与GBK交替段落) 3. 低内存设备压力测试(内存峰值 ≤ 150MB) --- 通过上述分层实现,可逐步构建一个支持基础阅读、搜索、个性化设置的健壮TXT阅读器。实际开发中建议先完成核心文件读取与分页功能,再逐步叠加增强模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值