理财通app的设计与实现(四)

一、数据分析界面

  1、界面效果

 2、前期准备

    2.1 首先添加 AndroidMPChart 的依赖

(1)在素材文件夹中,选择 jar 包文件:MPAndroidChart-v3.0.3.jar,复制该 文件。

 (2)展开 Android 的工程目录结构,在 app 下方,选择 libs 文件夹,将 jar 包文件粘贴到此文件夹下如图所示:

 (3)展开 Android 的工程目录结构,在 app 下方,打开 build.grandle 文件, 便看到了下方添加进来的依赖

  3、数据分析布局界面 activity_data_analysel.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/welcomebg"tools:context=".activity.DataAnalyseActivity">
<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="个人收入预览图"android:textColor="#ffffff"android:textStyle="bold"android:textSize="25sp"android:gravity="center"/><com.github.mikephil.charting.charts.LineChartandroid:id="@+id/income_chart_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"/><Viewandroid:layout_width="match_parent"android:layout_height="2dp"android:background="#ffffff"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="个人支出预览图"android:textColor="#ffffff"android:textStyle="bold"android:textSize="25sp"android:gravity="center"/><com.github.mikephil.charting.charts.LineChartandroid:id="@+id/outpay_chart_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"/>
</LinearLayout>

  4、数据分析类文件 DataAnalyseActivity.java

public class DataAnalyseActivity extends AppCompatActivity {
//1 定义对象LineChart income_chart,outpay_chart;MyDBHelper mhelper;SQLiteDatabase db;String[] indata={"学习-奖金","补助-奖金","比赛-奖励","业余-兼职","基本工资","福利-分红","加班-津贴","其他"};//收入类型数据统计的初始值int xxjjmoney=0;int bzjjmoney=0;int bsjlmoney=0;int yyjzmoney=0;int jbgzmoney=0;int flfhmoney=0;int jbjtmoney=0;int qtmoney=0;String[] outdata={"电影-娱乐","美食-畅饮","欢乐-购物","手机-充值","交通-出行","教育-培训","社交-礼仪","生活-日用","其他"};//收入类型数据统计的初始值int dyylmoney=0;int mscymoney=0;int hlgwmoney=0;int sjczmoney=0;int jtcxmoney=0;int jypxmoney=0;int sjlymoney=0;int shrymoney=0;int othermoney=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_data_analyse);//2 绑定控件initView();//3 收入汇总分析inComeData();//4 支出汇总分析outComeData();}//2 绑定控件---------------代码private void initView() {income_chart=findViewById(R.id.income_chart_data);outpay_chart=findViewById(R.id.outpay_chart_data);mhelper=new MyDBHelper(DataAnalyseActivity.this);db=mhelper.getWritableDatabase();}//3 收入汇总分析-------------------代码private void inComeData() {//第一部分:获取数据Cursor cursor =db.rawQuery("select * from in_come",null);while(cursor.moveToNext()){Double mymoney=cursor.getDouble(cursor.getColumnIndex("inmoney"));String mytype=cursor.getString(cursor.getColumnIndex("intype"));if(mytype.equals("学习-奖金")){xxjjmoney+=mymoney;}else if(mytype.equals("补助-奖金")){bzjjmoney+=mymoney;}else if(mytype.equals("比赛-奖励")){bzjjmoney+=mymoney;}else if(mytype.equals("业余-兼职")){yyjzmoney+=mymoney;}else if(mytype.equals("基本-工资")){jbgzmoney+=mymoney;}else if(mytype.equals("福利-分红")){flfhmoney+=mymoney;}else if(mytype.equals("加班-津贴")){jbjtmoney+=mymoney;}else if(mytype.equals("其他")){qtmoney+=mymoney;}}//第二部分:LineChart 图表初始化设置---Xy 轴的设置XAxis xAxis=income_chart.getXAxis();//获取此图表的 x 轴轴线YAxis yAxisleft =income_chart.getAxisLeft();//获取此图表的 Y 轴左侧轴线YAxis yAxisright =income_chart.getAxisRight();//获取此图表的 Y轴右侧轴线xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置 X 轴线的位置为底部yAxisleft.setAxisMinimum(0f);//保证 Y 轴从 0 开始,不然会上移一点。yAxisright.setAxisMinimum(0f);xAxis.setValueFormatter(new IAxisValueFormatter() {//x 轴自定义标签的设置@Overridepublic String getFormattedValue(float v, AxisBase axisBase) {return indata[(int) v];}});//第三部分:LineDataSet 曲线初始化设置List<Entry> inentries=new ArrayList<>();//Y 轴的数据inentries.add(new Entry(0,xxjjmoney));inentries.add(new Entry(1,bzjjmoney));inentries.add(new Entry(2,bsjlmoney));inentries.add(new Entry(3,yyjzmoney));inentries.add(new Entry(4,jbgzmoney));inentries.add(new Entry(5,flfhmoney));inentries.add(new Entry(6,jbjtmoney));inentries.add(new Entry(7,qtmoney));LineDataSet lineDataSet=new LineDataSet(inentries,"金额");//代表一条线,“金额”是曲线名称lineDataSet.setValueTextSize(25);//曲线上文字的大小lineDataSet.setValueTextColor(Color.WHITE);//曲线上文字的颜色lineDataSet.setDrawFilled(true);//设置折线图填充//第四部分:曲线展示LineData data=new LineData(lineDataSet);//创建 LineData 对象 属于LineChart 折线图的数据集合income_chart.setData(data);// 添加到图表中}//4 支出汇总分析--------------------代码private void outComeData() {//第一部分:获取数据Cursor cursor =db.rawQuery("select * from pay_out",null);while(cursor.moveToNext()){Double mymoney=cursor.getDouble(cursor.getColumnIndex("outmoney"));String mytype=cursor.getString(cursor.getColumnIndex("outtype"));if(mytype.equals("电影-娱乐")){dyylmoney+=mymoney;}else if(mytype.equals("美食-畅饮")){mscymoney+=mymoney;}else if(mytype.equals("欢乐-购物")){hlgwmoney+=mymoney;}else if(mytype.equals("手机-充值")){sjczmoney+=mymoney;}else if(mytype.equals("交通-出行")){jtcxmoney+=mymoney;}else if(mytype.equals("教育-培训")){jypxmoney+=mymoney;}else if(mytype.equals("社交-礼仪")){sjlymoney+=mymoney;}else if(mytype.equals("生活-日用")){shrymoney+=mymoney;}else if(mytype.equals("其他")){othermoney+=mymoney;}}//第二部分:LineChart 图表初始化设置---Xy 轴的设置XAxis xAxis=outpay_chart.getXAxis();//获取此图表的 x 轴轴线YAxis yAxisleft =outpay_chart.getAxisLeft();//获取此图表的 Y 轴左侧轴线YAxis yAxisright =outpay_chart.getAxisRight();//获取此图表的 Y 轴右侧轴线xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置 X 轴线的位置为底部yAxisleft.setAxisMinimum(0f);//保证 Y 轴从 0 开始,不然会上移一点。yAxisright.setAxisMinimum(0f);xAxis.setValueFormatter(new IAxisValueFormatter() {//x 轴自定义标签的设置@Overridepublic String getFormattedValue(float v, AxisBase axisBase) {return outdata[(int) v];}});//第三部分:LineDataSet 曲线初始化设置List<Entry> outentries=new ArrayList<>();//Y 轴的数据outentries.add(new Entry(0,dyylmoney));outentries.add(new Entry(1,mscymoney));outentries.add(new Entry(2,hlgwmoney));outentries.add(new Entry(3,sjczmoney));outentries.add(new Entry(4,jtcxmoney));outentries.add(new Entry(5,jypxmoney));outentries.add(new Entry(6,sjlymoney));outentries.add(new Entry(7,shrymoney));outentries.add(new Entry(8,othermoney));LineDataSet lineDataSet=new LineDataSet(outentries,"金额");//代表一条线,“金额”是曲线名称lineDataSet.setValueTextSize(25);//曲线上文字的大小lineDataSet.setValueTextColor(Color.WHITE);//曲线上文字的颜色lineDataSet.setDrawFilled(true);//设置折线图填充//第四部分:曲线展示LineData data=new LineData(lineDataSet);//创建 LineData 对象 属于LineChart 折线图的数据集合outpay_chart.setData(data);// 添加到图表中}
}

  5、AndroidMPChart的步骤

第一步:获取数据

第二步:LineChart 图表初始化设置---Xy 轴的设置

第三步:LineDataSet 曲线初始化设置

第四步:曲线展示

二、系统设置界面

  1、界面效果

   2、前期准备

2.1 打开配置文件,将程序启动的四行代码放到欢迎界面的开始节点与结束节点 之间。

 (2)打开登录界面 LoginActivity.java,在用户名和密码正确时,添加代码, 实现用户名和密码存储到一个键值对里面。

SharedPreferences.Editor editor=getSharedPreferences("userinfo",0).edit(); editor.putString("username",inputname); editor.putString("userpwd",inputpwd); editor.commit();

   3、系统设置布局界面 activity_sys_setting.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/welcomebg"tools:context=".activity.SysSettingActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginLeft="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="当前用户:"android:textColor="#ffffff"/><TextViewandroid:id="@+id/txt_name_sys"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ffffff"/></LinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="用户密码修改"android:textSize="30sp"android:textStyle="bold"android:textColor="#ffffff"android:layout_margin="80dp"android:gravity="center"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="原始密码:"android:textColor="#ffffff"/><EditTextandroid:id="@+id/et_ypwd_sys"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入原密码"android:textColor="#ffffff"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="新 密 码:"android:textColor="#ffffff"/><EditTextandroid:id="@+id/et_xpwd_sys"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入新密码"android:textColor="#ffffff"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="再次输入:"android:textColor="#ffffff"/><EditTextandroid:id="@+id/et_zxpwd_sys"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请再次输入新密码"android:textColor="#ffffff"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="80dp"><Buttonandroid:id="@+id/bt_modify_sys"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确认修改"android:textColor="#000000"android:background="@drawable/btn_style_two"android:layout_marginRight="40dp"android:layout_weight="1"/><Buttonandroid:id="@+id/bt_cancel_sys"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="取消"android:textColor="#000000"android:background="@drawable/btn_style_two"android:layout_weight="1"/></LinearLayout>
</LinearLayout>

   4、数据分析类文件 DataAnalyseActivity.java

public class SysSettingActivity extends AppCompatActivity {//1 定义对象TextView txt_user;//创建一个显示用户名的文本对象EditText et_ypwd, et_xpwd, et_zxpwd;// 创建三个 EditText 对象Button bt_modify, bt_cancel;// 创建两个 Button 对象MyDBHelper mhelper;SQLiteDatabase db;String name;String pwd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sys_setting);//第二步:绑定控件initView();//第三步:显示当前登录的用户名displayInfo();//第四步:修改按钮功能btnModify();//第五步:取消按钮功能btncancel();}//第二步:绑定控件-----------------代码private void initView() {txt_user=findViewById(R.id.txt_name_sys);et_ypwd=findViewById(R.id.et_ypwd_sys);et_xpwd=findViewById(R.id.et_xpwd_sys);et_zxpwd=findViewById(R.id.et_zxpwd_sys);bt_modify=findViewById(R.id.bt_modify_sys);bt_cancel=findViewById(R.id.bt_cancel_sys);mhelper=new MyDBHelper(SysSettingActivity.this);db=mhelper.getWritableDatabase();}//第三步:显示当前登录的用户名-------代码private void displayInfo() { name=getSharedPreferences("userinfo",0).getString("username",""); pwd=getSharedPreferences("userinfo",0).getString("userpwd","");txt_user.setText(name);}//第四步:修改按钮功能----------------------代码private void btnModify() {bt_modify.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//获取三个输入框中的内容String ypwd = et_ypwd.getText().toString();//获取输入的原密码String xpwd = et_xpwd.getText().toString();//获取输入的新密码String zxpwd = et_zxpwd.getText().toString();//获取第二次输入的新密码//对每个密码进行逻辑判断if(ypwd.equals("")){Toast.makeText(SysSettingActivity.this, "请输入原始密码", Toast.LENGTH_SHORT).show();}else if(!ypwd.equalsIgnoreCase(pwd)){Toast.makeText(SysSettingActivity.this, "输入的密码与原密码不一致",Toast.LENGTH_SHORT).show();}else if(xpwd.equals("")){Toast.makeText(SysSettingActivity.this, "请输入新密码", Toast.LENGTH_SHORT).show();}else if(xpwd.equalsIgnoreCase(ypwd)){Toast.makeText(SysSettingActivity.this, "所输入的新密码与原密码不能相同", Toast.LENGTH_SHORT).show();}else if(zxpwd.equals("")){Toast.makeText(SysSettingActivity.this, "请再次输入新密码", Toast.LENGTH_SHORT).show();}else if(!zxpwd.equalsIgnoreCase(xpwd)){Toast.makeText(SysSettingActivity.this, "两次输入的新密码不一致",Toast.LENGTH_SHORT).show();}else{ContentValues values =new ContentValues();values.put("pwd",xpwd);db.update("tb_userinfo",values,"name=?",new String[]{name});Toast.makeText(SysSettingActivity.this, "密码修改成功", Toast.LENGTH_SHORT).show();Intent intent=new Intent(SysSettingActivity.this,                   LoginActivity.class);startActivity(intent);finish();}}});}//第五步:取消按钮功能-----------------------代码private void btncancel() {bt_cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(SysSettingActivity.this, MainActivity.class);startActivity(intent);finish();}});}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/66228.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港长和集团开创P2F金融理财新征程

2019年致2022年全球经济遭受严峻考验&#xff0c;疫情影响更为深远&#xff01;凭借稳健发展策略&#xff0c;长和集团于十九世纪建基香港&#xff0c;是一家业务遍布全球的大型跨国综合企业&#xff0c;一向锐意创新&#xff0c;在不同业务范围广泛应用新科技&#xff0c;集团…

小米的创新四则

什么叫创新&#xff1f;我的理解&#xff0c;创新就是要做别人没做过的事情&#xff0c;或者是别人做过没有做成的事情。这样的事情一定不容易&#xff0c;它们有个特点&#xff0c;就是风险特别大。 风险大的事情一般不适合大企业干&#xff0c;所以创新的主体往往是创业的小公…

一名米粉述说:当年雷军是如何带领小米发展的

Author&#xff1a;Runsen 8月11日&#xff0c;小米集团董事长兼CEO雷军在小米北京总部举行了一场主题为《一往无前》的小米十周年演讲。 小时候的雷军&#xff0c;是“别人家的孩子” 雷军出生于仙桃市&#xff0c;仙桃位于湖北省中南部的江汉平原&#xff0c;拥有1500年多年…

小米方法论总结:雷军首部商业思考著作《小米创业思考》面世

8月11日晚&#xff0c;小米秋季新品发布会在京举行&#xff0c;小米集团创始人、董事长兼CEO雷军第三次做年度公开演讲&#xff0c;分享他曾经遇到的人生低谷&#xff0c;以及如何逆境中发现机会、奋起前行的故事。在发布会上&#xff0c;雷军还首次披露自己的首部商业思考著作…

【软件应用开发】小米便签APP维护开发

本文主要介绍在小米便签APP原有功能的基础上&#xff0c;设计并实现了便签添加图片的功能&#xff0c;从开发过程、运行界面、源代码三个方面进行详细介绍。 本文引用小米便签社区开源版代码&#xff1a;https://github.com/MiCode/Notes 小米便签APP维护开发完整源代码地址&am…

粗谈小米商业模式

01小米的“新零售” https://mp.weixin.qq.com/s/-_VLWX25eXdo6su8sE01nA 零售&#xff1a;其实就是信息流、资金流、物流的三种基本要素的万千组合。商品展现的参观和体验是信息流&#xff1b;付款收款是资金流&#xff1b;自己取回或快递送家是物流&#xff1b; 电商相对于…

新媒体短视频运营培训骗局

现在新媒体短视频运营培训的广告铺天盖地&#xff0c;是不是骗子啊?现在很多人会有这样的疑问&#xff0c;针对这个问题&#xff0c;我还是提醒同学们提高警惕&#xff0c;市场上有好有坏&#xff0c;就像当初UI设计四个月骗局一样&#xff0c;同学们还是保持一定的甄别意识。…

为什么做短视频你的一直不爆?

大家好&#xff0c;我是我赢助手短视频运营&#xff0c;专注于短视频去水印、去重和文案提取及短视频运营创作。 今天给大家分享的为什么做短视频你的一直不爆&#xff1f; 你在做账号之前&#xff0c;最多准备了多少条视频&#xff0c;有五条吗&#xff1f;有三十条吗&#…

某音短视频评论采集翻页(移动安全篇)

本章测试一个作品的评论及翻页&#xff1a; 以及前面的抓x包方式&#xff0c;在专栏里也有很多&#xff0c;xposed抓包过sslping&#xff0c;通用版本等&#xff1b; https://codeooo.blog.csdn.net/category_11500477.html 翻页通过页码来控制&#xff1a; # -*- coding:…

IT技能产品做短视频宣传应该怎么做?短视频宣传策略分析

对于IT技能产品来说&#xff0c;短视频宣传已经成为一种有效的宣传策略&#xff0c;能够有效地传播信息、激发消费者的兴趣。下面将从几个方面对IT技能产品短视频宣传策略进行分析&#xff1a; 在制作短视频的时候&#xff0c;要充分考虑到产品的特性&#xff0c;做出吸引人的短…

做短视频创业之前必须确定的内容:变现形式,短视频玩法和人设定位

做短视频创业之前必须确定的内容&#xff1a;变现形式&#xff0c;短视频玩法和人设定位。这是短视频的根基&#xff0c;打好基础才能更好的实现盈利目标。 开始做短视频的时候&#xff0c;走了很多弯路&#xff0c;这段时间总结了之前的经验教训&#xff0c;结合在我赢助手上…

什么类型的短视频更容易吸粉?分享三种短视频类型,可参考

什么类型的短视频更容易吸粉&#xff1f;分享三种短视频类型&#xff0c;可参考 现在做短视频的人越来越多&#xff0c;有趣有创意的短视频更是层出不穷&#xff0c;而这也就让刚接触短视频的小白们犯难了&#xff1a;好像每一种短视频都很能吸引粉丝&#xff0c;那么自己究竟…

视频号容易被官方封号的违规操作,你中招了吗?

视频号作为一个新崛起的流量池,已经成为许多企业、淘金者追捧的新流量阵地,但目前平台规则还不是那么完善,这就非常考验创作者的运营额能力和政策敏感度。 无论是哪个平台,一旦触碰红线,不管你的作品有多厉害、粉丝有多少,哪怕是不小心,也会受到相应的惩罚。 轻则限流…

视频号|常见违规限流情况及解除方法

在视频号创作过程中&#xff0c;大家有没有遇到过视频号限流的问题&#xff1f;或者直接收到过视频号官方发出的违规通知&#xff1f; 视频号被限流&#xff0c;最能在视频播放数据上体现出来。比如&#xff0c;平时的播放数据一直很好&#xff0c;突然间数据就变差了&#xf…

年薪百万难求的AI新技能:Prompt工程中文教程来了!

写出优质的提示词&#xff0c;让AI生成惊艳的图文作品。 ——这就是如今年薪百万仍一人难求的提示词工程师们在解决的问题。大语言模型时代下&#xff0c;不断涌现出众多让人瞳孔地震的绘画、拍案叫绝的文案&#xff0c;它们的创作者并非传统定义的画家、作家&#xff0c;而是这…

巴比特 | 元宇宙每日必读:AIGC的监管来了!国家网信办发布生成式人工智能服务管理办法(征求意见稿),哪些红线不能碰?...

摘要&#xff1a;随着AIGC迅猛发展&#xff0c;相关风险也逐渐显露出来。4 月 11 日&#xff0c;国家互联网信息办公室发布关于《生成式人工智能服务管理办法&#xff08;征求意见稿&#xff09;》公开征求意见的通知。征求意见稿拟规定&#xff0c;利用生成式人工智能生成的内…

谷歌2022年Q4净利润同比下滑34%,还能靠广告业务翻身么?

在美联储加息、宏观环境低迷的情况下&#xff0c;科技巨头们的日子并不好过。 2月2日美股盘后&#xff0c;数字广告和搜索巨头、谷歌母公司Alphabet发布了2022年四季度财报。财报显示&#xff0c;2022年Q4其总营收为760.48亿美元&#xff0c;略低于分析师预期的765亿美元&#…

AGI 通用人工智能的演变 | The Evolution of Artificial General Intelligence

目录 AGI Introduction | 通用人工智能介绍 一、引言 二、AGI 的概念和定义

喜大普奔!微软开发基于 Chromium 的浏览器

&#xff08;给程序员的那些事加星标&#xff09; 原创整理&#xff1a;程序员的那些事&#xff08;id&#xff1a;iProgrammer&#xff09; 大家以前应该听过类似的段子&#xff1a; 微软正在开发下一代浏览器&#xff0c;性能大提升&#xff0c;下载 Chrome 的速度将提升 3 倍…

Eege浏览器和Chrome浏览器选中文本朗读

Edge AND Chrome 方法一&#xff08;Edge专属&#xff09;&#xff1a; 选中文字直接右键&#xff0c;选中朗读所选内容即可&#xff08;这个操作直接秒杀所有朗读插件&#xff0c;音色也很棒&#xff09; 方法二&#xff08;Edge和Chrome通用&#xff09;&#xff1a; 下载…