提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Android Studio是由Google开发的官方集成开发环境(IDE),用于开发Android应用程序。它提供了一套强大的工具和功能,帮助开发人员创建、调试和测试Android应用程序。Android Studio基于IntelliJ IDEA,是一个功能齐全的开发环境,为开发人员提供了许多有用的功能和工具,包括代码编辑器、调试器、布局编辑器、性能分析工具和模拟器等。
Android Studio支持使用Java、Kotlin和C++等编程语言开发Android应用程序。它提供了丰富的代码编辑功能,包括自动完成、代码模板、重构工具和错误检查等,以提高开发效率并减少错误。此外,Android Studio还集成了Android SDK,使开发人员可以轻松地访问Android平台的各种功能和API。
除了开发工具之外,Android Studio还提供了一套强大的布局编辑器,可以帮助开发人员设计和调整应用程序的用户界面。它还包括性能分析工具,可以帮助开发人员识别和解决应用程序中的性能问题。
一、AS安装与安卓环境搭建
(1)从官网获取安装包
(网址:Download Android Studio & App Tools - Android Developers)
(2)安装
等待下载完成之后,先解压,然后双击android-studio的exe文件运行,按照安装教程逐步安装(安装过程中需要注意SDK的安装路径)
二、Android Studio入门使用
(1)新建一个Android Studio项目
点击New Project,选择Empty Views Activity,等待初始化装载完毕
(2)查看Android Studio相关信息
1.Android Studio版本信息:
Android Studio Giraffe | 2022.3.1 Patch 1
Build #AI-223.8836.35.2231.10671973, built on August 17, 2023
Runtime version: 17.0.6+0-b2043.56-10027231 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 12
Registry:
external.system.auto.import.disabled=true
ide.text.editor.with.preview.show.floating.toolbar=false
2.Android Studio SDK 配置信息
3.虚拟机信息
(3)运行简单案例
以下是运行成功截图:
三、Android Studio类微信页面–凡人修仙传
(1)页面效果展示
1.主页面“修炼”展示
2.“一键开启修仙”点击效果
3.跳转效果展示
点击即可相互跳转
4.“法宝”页面展示和滚动效果
鼠标放在页面内上下拖拽即可实现滚动效果
5.“门派”页面展示和滚动效果
6.“外挂”页面展示
7.“开启关闭按钮”点击效果
(2)主要代码实现
1.页面布局XML文件
(主要存放在layout文件夹中)
1.1 main_acticity.xml
存放整体布局的三个重要组成部分top,content,buttom,并作出相应初始化配置
<?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="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity">
<include
android:id="@+id/top"
layout="@layout/top"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="681dp"
android:layout_weight="1" />
<include
android:id="@+id/bottom"
layout="@layout/bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
1.2 top.xml
头部“凡人修仙传”标题,初始化黑底白字,调整模块大小,字体大小
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="62dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="45dp"
android:background="@color/black"
android:textColor="@color/white"
android:text="凡人修仙传" />
</LinearLayout>
1.3 bottom.xml
尾部“修炼”、“法宝”、“门派”、“外挂”的标题布局,设置对应图片,初始化背景字体以及模块大小分布
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="bottom">
<LinearLayout
android:id="@+id/line1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:src="@drawable/xiake1" />
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="20dp"
android:text="修炼" />
</LinearLayout>
<LinearLayout
android:id="@+id/line2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="100dp"
android:src="@drawable/xiake2" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="20dp"
android:text="法宝" />
</LinearLayout>
<LinearLayout
android:id="@+id/line3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView3"
android:layout_width="match_parent"
android:layout_height="100dp"
android:src="@drawable/xiake3" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="20dp"
android:text="门派" />
</LinearLayout>
<LinearLayout
android:id="@+id/line4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView4"
android:layout_width="match_parent"
android:layout_height="100dp"
android:src="@drawable/xiake4" />
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="20dp"
android:text="外挂" />
</LinearLayout>
</LinearLayout>
1.4 item.xml
用来存放RecycleView的TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView31"
android:layout_width="match_parent"
android:layout_height="63dp"
android:text="TextView"
android:textColor="@color/black"
android:textSize="30sp" />
</LinearLayout>
1.5 kaishi.xml
设置“修炼”页面布局和点击按钮
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView5"
android:layout_width="318dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="仙界是神秘而又神奇的,白云缭绕,青山环绕,环境优雅,景色宜人,仙花缤纷,仙鹤翩跹,仙鹰扬翅,仙驹横行,仙静如梦,仙风吹拂,仙音传唱,仙飞游,仙气飘洒,仙语轻语,仙歌悠扬,形成一片神奇的仙界景象......"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.505"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.786" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="一键开启修仙"
android:textSize="60dp"
app:layout_constraintBottom_toTopOf="@+id/textView5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.351"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.504" />
</androidx.constraintlayout.widget.ConstraintLayout>
1.6 fabao.xml
设置“法宝”页面布局和滚动效果页面初始化
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView6"
android:layout_width="match_parent"
android:layout_height="65dp"
android:textSize="40dp"
android:background="@color/material_dynamic_tertiary80"
android:textColor="@color/cardview_shadow_start_color"
android:gravity="center"
android:text="请选择你的法宝" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/RecycleViewfabao"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
1.7 menpai.xml
设置“门派”页面布局和滚动效果页面初始化
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView7"
android:layout_width="match_parent"
android:layout_height="65dp"
android:textSize="40dp"
android:background="@color/material_dynamic_tertiary80"
android:textColor="@color/cardview_shadow_start_color"
android:gravity="center"
android:text="请选择你的门派" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/RecycleViewmenpai"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>
</LinearLayout>
1.8 waigua.xml
设置“外挂”页面布局和存放打开关闭控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView5"
android:layout_width="411dp"
android:layout_height="65dp"
android:layout_gravity="center"
android:gravity="center"
android:background="@color/material_dynamic_tertiary80"
android:textColor="@color/cardview_shadow_start_color"
android:text="请选择要开启的外挂"
android:textSize="40dp" />
<Switch
android:id="@+id/switch4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="35dp"
android:textOff="关"
android:textOn="开"
android:text="无敌" />
<Switch
android:id="@+id/switch5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="35dp"
android:text="刀刀暴击" />
<Switch
android:id="@+id/switch6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="35dp"
android:text="瞬间秒杀" />
<Switch
android:id="@+id/switch7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="35dp"
android:text="必爆金装" />
<Switch
android:id="@+id/switch8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="35dp"
android:text="飞升灵界" />
<Switch
android:id="@+id/switch9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="35dp"
android:text="飞升仙界" />
<TextView
android:id="@+id/textView6"
android:layout_width="411dp"
android:layout_height="200dp"
android:layout_gravity="center"
android:gravity="center"
android:background="@color/material_dynamic_neutral40"
android:textColor="@color/black"
android:text="付费解锁更多精彩内容"
android:textSize="40dp" />
</LinearLayout>
2.主要Java代码
2.1 MainActivity
进行点击配置,实现点击的界面的跳转,使用ViewBinding控件,对其他各种控件进行使用
package com.example.homework;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import com.example.homework.databinding.ActivityMainBinding;
// 一键开启修仙
// 选择法宝
// 选择门派
// 外挂界面
public class MainActivity extends AppCompatActivity {
ActivityMainBinding mainBinding;
Fragment kaishi,fabao,menpai,waigua;
FragmentManager fm;
FragmentTransaction ft;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
View view = mainBinding.getRoot();
setContentView(view);
fabao = new fabao();
kaishi = new kaishi();
menpai = new menpai();
waigua = new waigua();
fm = getSupportFragmentManager();
initial();
ft = fm.beginTransaction().show(kaishi);
ft.commit();
mainBinding.bottom.line1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragment_hide();
ft = fm.beginTransaction().show(kaishi);
ft.commit();
}
});
mainBinding.bottom.line2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragment_hide();
ft = fm.beginTransaction().show(fabao);
ft.commit();
}
});
mainBinding.bottom.line3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragment_hide();
ft = fm.beginTransaction().show(menpai);
ft.commit();
}
});
mainBinding.bottom.line4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragment_hide();
ft = fm.beginTransaction().show(waigua);
ft.commit();
}
});
}
//
private void fragment_hide() {
ft = fm.beginTransaction()
.hide(kaishi)
.hide(fabao)
.hide(menpai)
.hide(waigua);
ft.commit();
}
private void initial() {
ft = fm.beginTransaction()
.add(R.id.content,kaishi)
.add(R.id.content,fabao)
.add(R.id.content,menpai)
.add(R.id.content,waigua);
ft.commit();
fragment_hide();
}
}
2.2 MyAdapter
定义一个适配器,将list内容投影到recycleview当中去,该过程中需要注意:myHolder.setIsRecyclable(false)功能要打开
package com.example.homework;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
List<String> list1;
Context context1;
public MyAdapter(Context context,List list) {
this.context1 = context;
this.list1 = list;
}
@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view=View.inflate(context1,R.layout.item,null);
// View view= LayoutInflater.from(context1).inflate(R.layout.item,parent,false);
MyHolder myHolder = new MyHolder(view);
myHolder.setIsRecyclable(false);
return myHolder;
}
@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
holder.textView.setText(list1.get(position));
}
@Override
public int getItemCount() {
return list1.size();
}
class MyHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView31);
}
}
}
2.3 kaishi
实现启动按钮的点击测试,加入点击之后显示的效果文字
package com.example.homework;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
public class kaishi extends Fragment {
Button button;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.kaishi, container, false);
button = view.findViewById(R.id.button4);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getContext(),"正在进入江湖",Toast.LENGTH_LONG).show();
}
});
return view;
}
}
2.4 fabao
实现法宝数据的导入和滚动效果的实现,同时将法宝内容分为三列,更为美观
package com.example.homework;
import android.content.Context;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class fabao extends Fragment {
Context context;
RecyclerView recyclerView;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view=inflater.inflate(R.layout.fabao, container, false);
recyclerView= view.findViewById(R.id.RecycleViewfabao);
List<String> fabaos = new ArrayList<>(Arrays.asList("天幻宝扇", "天灵剑气", "魔龙印符", "追魂铃鼓", "霸王苍穹", "幻影幽珠", "迷境幻鼎", "魔降天符", "天灭魂刀", "凤羽神扇", "雷神霄珠", "七星宝花", "诛仙神剑", "九转金丹", "追魂幡旗", "魔龙甲胄", "紫云飞剑", "凤凰琴音", "妖魔封印", "冥灯幽钟", "天帝封印", "诛仙神剑", "幻神鼎铸", "碧火魔珠", "浩瀚天镜", "魂天妖印", "斩魂无刃", "神龙圣扇", "雷神霄珠", "彩凤琴音", "妖魔封印", "冥灯幽钟", "天帝封印", "诛仙神剑", "幻神鼎铸", "碧火魔珠", "浩瀚天镜", "魂天妖印", "斩魂无刃", "神龙圣扇"));
MyAdapter myadapter = new MyAdapter(getContext(),fabaos);
recyclerView.setAdapter(myadapter);
GridLayoutManager layoutManager = new GridLayoutManager(getContext(),3);
recyclerView.setLayoutManager(layoutManager);
return view;
}
}
2.5 menpai
实现门派数据的导入和滚动效果的实现,同时将法宝内容分为两列,更为美观
package com.example.homework;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class menpai extends Fragment {
View view;
RecyclerView recyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view=inflater.inflate(R.layout.menpai, container, false);
recyclerView= view.findViewById(R.id.RecycleViewmenpai);
List<String> menpais = Arrays.asList("太虚宗", "九天剑宫", "幽冥阁", "紫云宫", "火云宗", "风华宗", "天雷宗", "雪魄宫", "玄冥殿", "金阳宗", "龙脉宫", "天罡宗", "星辰派", "紫电宫", "魔音谷", "太清宫", "飞雪宗", "玄阳门", "冷月宫", "天翼门", "无极宫", "幻境派", "烈阳宫", "琉璃殿", "天机门", "凌霄宫", "紫霞宫", "千幻谷", "天机堂", "九幽门", "玄冰派", "碧波宫", "天音宗", "苍穹宫", "明月宫", "天魔教", "紫电宫", "魔音谷", "太清宫", "飞雪宗", "玄阳门", "冷月宫", "天翼门", "无极宫", "幻境派", "烈阳宫", "琉璃殿", "天机门", "凌霄宫", "紫霞宫", "千幻谷", "天机堂", "九幽门", "玄冰派", "碧波宫", "天音宗", "苍穹宫", "明月宫", "天魔教");
MyAdapter myadapter = new MyAdapter(getContext(),menpais);
recyclerView.setAdapter(myadapter);
recyclerView.setAdapter(myadapter);
GridLayoutManager layoutManager = new GridLayoutManager(getContext(),2);
recyclerView.setLayoutManager(layoutManager);
return view;
}
}
2.6waigua
写入所有开关按钮点击之后显示的效果
package com.example.homework;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Switch;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
public class waigua extends Fragment {
Switch aSwitch1,aSwitch2,aSwitch3,aSwitch4,aSwitch5,aSwitch6;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.waigua, container, false);
aSwitch1 = view.findViewById(R.id.switch4);
aSwitch1.setOnCheckedChangeListener((compoundButton, b) -> {
if (b){
Toast.makeText(getContext(),"无敌已打开",Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getContext(),"无敌已关闭",Toast.LENGTH_LONG).show();
}
});
aSwitch2 = view.findViewById(R.id.switch5);
aSwitch2.setOnCheckedChangeListener((compoundButton, b) -> {
if (b){
Toast.makeText(getContext(),"刀刀暴击已打开",Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getContext(),"刀刀暴击已关闭",Toast.LENGTH_LONG).show();
}
});
aSwitch3 = view.findViewById(R.id.switch6);
aSwitch3.setOnCheckedChangeListener((compoundButton, b) -> {
if (b){
Toast.makeText(getContext(),"瞬间秒杀已打开",Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getContext(),"瞬间秒杀已关闭",Toast.LENGTH_LONG).show();
}
});
aSwitch4 = view.findViewById(R.id.switch7);
aSwitch4.setOnCheckedChangeListener((compoundButton, b) -> {
if (b){
Toast.makeText(getContext(),"必爆金装已打开",Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getContext(),"必爆金装已关闭",Toast.LENGTH_LONG).show();
}
});
aSwitch5 = view.findViewById(R.id.switch8);
aSwitch5.setOnCheckedChangeListener((compoundButton, b) -> {
if (b){
Toast.makeText(getContext(),"已飞升灵界",Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getContext(),"已返回人界",Toast.LENGTH_LONG).show();
}
});
aSwitch6 = view.findViewById(R.id.switch9);
aSwitch6.setOnCheckedChangeListener((compoundButton, b) -> {
if (b){
Toast.makeText(getContext(),"已飞升仙界",Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getContext(),"已返回人界",Toast.LENGTH_LONG).show();
}
});
return view;
}
}
总结
在整个项目过程中,我完成了AS安装与安卓环境搭建,学会了Android Studio的入门使用。在类微信页面的制作过程中,我学会了TextView、Fragment、button、LinearLayout、switch等组件的使用,通过对RecycleView的使用实现了翻滚效果,了解了如何编写onClick点击事件的函数完成点击触发。最终在AS中完成了“凡人修仙传”的整体设计,搭建了一个app的门户框架,实现了4个tab切换效果,并且在两个tab页中实现列表效果。
所有以上详细代码文件已上传至Gitee中
可以通过我的个人网址(https://gitee.com/wndwx/wndwx.git)免费下载浏览