本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目提供了一个封装库,用于在Android应用中调用和使用百度ECharts库,以创建和管理丰富的数据可视化图表。介绍了集成ECharts到Android项目的步骤,包括添加依赖、设置权限、创建ECharts视图、初始化及配置、创建Option对象、图表更新、交互功能、性能优化、自定义样式及兼容性测试。封装库 htechart 可能提供了更易用的API和扩展功能,使开发者能通过ECharts实现直观的数据展示和打造具有吸引力的交互式Android应用。 android echart

1. ECharts库在Android中的集成和使用

1.1 ECharts概述与库的选择

ECharts是一个使用JavaScript编写的开源可视化库,它提供了丰富的图表类型和直观的数据展示方式。在Android上使用ECharts,我们通常会借助于WebView组件或者使用ECharts的移动端版本。对于Android开发来说,可以使用WebView来加载已经写好的网页版ECharts图表,也可以利用ECharts的移动端组件直接在Android应用中集成。

1.2 集成ECharts库的准备

首先,确保你的Android项目中已经集成了网络库如OkHttp或Volley,因为ECharts图表可能需要加载远程数据。然后,需要在项目的 build.gradle 文件中添加ECharts库的依赖项。例如,如果使用远程ECharts库:

dependencies {
    implementation 'com.github.etsustainable:echarts-android:5.3.2' // 替换为最新版本号
}

确保同步了Gradle文件以安装依赖。

1.3 ECharts基本使用方法

集成完成后,在你的Activity或Fragment中创建一个WebView对象,并加载ECharts的示例页面或本地HTML文件。例如:

WebView webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true); // 启用JavaScript
webView.loadUrl("file:///android_asset/echarts.html"); // 加载本地HTML文件

若需加载远程图表,只需将URL替换为远程HTML文件地址。这是最基础的集成方式,后面章节将详细介绍如何配置和优化ECharts的使用。

本章为ECharts在Android中的集成和使用奠定了基础,通过简单的几个步骤即可将强大的数据可视化能力嵌入到Android应用中。随着后续章节的深入,你将学会如何让ECharts更好地适配Android环境,并发挥出更强大的功能。

2. 权限设置和依赖添加

随着应用开发的不断进展,正确设置权限和管理依赖成为确保应用功能完整性的重要环节。Android应用权限系统旨在保护用户隐私和设备安全,而依赖管理则确保项目构建的顺利进行。本章内容将为你详细解释在Android中设置ECharts所需权限的方法、时机和方式,以及如何通过Gradle有效管理ECharts库的依赖。

2.1 Android权限申请

权限是Android系统用于限制应用程序访问系统资源和用户私有数据的机制。因此,在集成ECharts到Android项目中之前,确保应用已正确申请必要的权限是非常关键的一步。

2.1.1 必要权限的解释与申请

对于使用ECharts库的Android应用来说,主要的权限需求通常集中在网络访问、存储读写以及设备硬件特性等方面。具体到权限项:

  • INTERNET :允许应用打开网络连接。
  • ACCESS_NETWORK_STATE :获取网络状态信息。
  • WRITE_EXTERNAL_STORAGE :允许应用写入外部存储。
  • READ_EXTERNAL_STORAGE :允许应用读取外部存储。

在应用的 AndroidManifest.xml 文件中声明这些权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ...
</manifest>

2.1.2 权限申请的时机和方式

在Android 6.0(API级别23)及以上版本中,需要在应用运行时动态请求权限。以下是请求权限的基本流程:

  1. 检查权限是否已被授予 :使用 ContextCompat.checkSelfPermission 方法检查应用是否已经拥有指定权限。
  2. 请求权限 :如果未授权,则通过 ActivityCompat.requestPermissions 方法请求权限。
public class MainActivity extends AppCompatActivity {
    private static final int MY_PERMISSIONS_REQUEST_ACCESS_NETWORK_STATE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkAndRequestPermissions();
    }

    private void checkAndRequestPermissions() {
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_NETWORK_STATE}, MY_PERMISSIONS_REQUEST_ACCESS_NETWORK_STATE);
        } else {
            // 权限已被授予,可以执行ECharts相关操作
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == MY_PERMISSIONS_REQUEST_ACCESS_NETWORK_STATE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限被用户同意,现在可以使用ECharts
            } else {
                // 权限被用户拒绝,可以适当处理,比如提示用户
            }
        }
    }
}

2.2 Gradle依赖配置

在Android项目中,ECharts库通过Gradle作为依赖项被添加到项目中,从而使得开发人员能够更加方便地管理项目的依赖关系。

2.2.1 添加ECharts库依赖

为了在项目中使用ECharts,你需要将ECharts库添加到 build.gradle 文件的依赖项中。以ECharts Android版的依赖项为例:

dependencies {
    implementation 'org.echarts:echarts:版本号'
}

将 版本号 替换为你希望使用的具体版本号。添加完毕后,同步Gradle配置以下载并集成库到项目中。

2.2.2 依赖冲突的解决方法

依赖冲突是在使用第三方库时经常遇到的问题。当两个或更多的库依赖同一个库的不同版本时,就会产生依赖冲突。解决依赖冲突的一个常用策略是使用Gradle的 resolutionStrategy 指令。

configurations.all {
    resolutionStrategy {
        force 'org.echarts:echarts:特定版本号'
    }
}

在上述代码中,将 特定版本号 替换为期望的ECharts库版本号。通过强制指定版本号,可以解决ECharts库与其他依赖项之间的冲突。

在实际操作中,解决依赖冲突可能需要详细分析项目的依赖树,并在必要时对多个库进行版本号指定,以确保所有依赖项都能和谐共存。使用Android Studio的“Analyze > Run Inspection by Name…”功能,搜索 conflicting dependencies 可以帮助开发者快速定位并解决依赖冲突问题。

代码块逻辑分析

在本章节中,我们介绍了权限申请和依赖配置的基础知识,包括:

  • Android权限的种类及其在AndroidManifest.xml文件中的声明方式。
  • 运行时权限请求的流程和具体实现方法。
  • 通过Gradle添加ECharts库依赖的方式。
  • 解决依赖冲突的常用策略。

通过本节内容的学习,开发者将能够为Android项目中的ECharts集成工作顺利进行前期准备。下一章节将继续探讨如何创建和配置ECharts视图。

3. 创建和配置ECharts视图

3.1 ECharts视图的初始化

3.1.1 视图布局的XML配置

在Android应用中,ECharts视图通常需要在布局文件XML中进行初始化。一个基本的视图布局文件可能看起来如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.github.mikephil.charting.charts.BarChart
        android:id="@+id/chart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

在此布局文件中,我们定义了一个垂直方向的LinearLayout容器,并在其中放置了一个 BarChart 图表视图。该视图通过ID与后端代码相连接。

在定义ECharts视图时,请确保你已经正确添加了ECharts库作为依赖项,否则上述布局中引用的ECharts视图将无法识别。

3.1.2 视图对象的Java/Kotlin实例化

在XML布局文件定义了视图之后,需要在对应的Activity或Fragment的Java/Kotlin代码中进行视图的实例化:

public class MainActivity extends AppCompatActivity {

    private EChartsView chartView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        chartView = findViewById(R.id.chart);
        // 进一步的配置和初始化
    }

    // 其他方法...
}

findViewById 方法通过ID关联XML中的布局文件和Java/Kotlin代码中的视图对象。这样,我们就可以在后续的方法中对ECharts视图进行配置和操作。

3.2 ECharts视图的基本设置

3.2.1 样式和主题的设置

ECharts视图提供了多种样式和主题供选择,以适应不同的应用场景。例如,我们可以通过代码应用预设的主题:

public void setChartTheme(EChartsView chartView) {
    // 设置主题为预设的蓝色主题
    chartView.setTheme(ThemeLibrary.CHART BLUE);
}

在上述代码中, setTheme 方法被用来应用一个内置主题,诸如 ThemeLibrary.CHART_BLUE 为ECharts视图设置一个蓝色主题。你也可以选择其他内置主题,或者根据需求自定义主题。

3.2.2 视图大小和响应式配置

为了保证ECharts视图在不同设备和屏幕尺寸上都有良好的显示效果,我们需要对其进行响应式配置:

<com.github.mikephil.charting.charts.BarChart
    android:id="@+id/chart"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:layout_weight="1"
    android:padding="10dp" />

在上述布局中,通过使用 layout_weight 属性,我们可以确保图表视图在不同屏幕尺寸下能够均匀地分配可用空间,并适应其父容器的大小。同时,通过设置 padding 属性,我们可以调整图表边缘与其容器边缘之间的空白区域。

为了在代码中进一步调整视图的响应式行为,我们可以使用ECharts的API进行配置:

public void setChartResponsive(EChartsView chartView) {
    // 设置视图的最大宽度和高度
    chartView.setMaxWidth(100);
    chartView.setMaxHeight(100);

    // 设置视图的最小宽度和高度
    chartView.setMinWidth(50);
    chartView.setMinHeight(50);
}

通过上述代码,我们能够为图表视图设置最大和最小尺寸,确保在不同设备上,图表显示既不会过大也不会过小,从而提升用户体验。

4. Option对象的构建和图表数据设置

4.1 Option对象的结构和组成

4.1.1 Series的类型与选项

ECharts中图表的绘制依赖于Option对象,它代表了图表的各种配置以及数据。在Option对象中, series 数组是核心部分,每个 series 代表一个系列的数据,例如一个折线图、柱状图等。每个系列都有自己的类型,如 'line' , 'bar' , 'pie' 等,以及对应的配置选项。

option = {
    series: [
        {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
        }
    ]
};

在上面的代码中,我们定义了一个 series ,它的 type 是 'bar' ,表示我们想要绘制一个柱状图。 data 属性包含了六个数据点,这些数据点将被映射到柱状图的各个柱子上。 name 属性则为该系列提供了名称,这个名称会在图例中显示。

4.1.2 X轴和Y轴的配置方法

在ECharts中,X轴和Y轴的配置也非常关键。 xAxis 和 yAxis 数组允许我们定义图表的轴。对于不同的图表类型,轴的配置项也会有所不同。例如,在折线图中,我们可能需要设置 axisLabel 来显示轴标签,或者使用 splitLine 来分隔不同的数据段。

option = {
    xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    },
    yAxis: {
        type: 'value'
    },
    series: [
        {
            name: '销量',
            type: 'line',
            data: [5, 20, 36, 10, 10, 20, 3]
        }
    ]
};

在这个例子中, xAxis 被配置为 'category' 类型,它适用于分类数据。 data 属性提供了分类的名称。 yAxis 被配置为 'value' 类型,适用于数值型数据。这里我们没有为 yAxis 添加额外配置项,但通常你可能会需要配置它的范围、分割线等。

4.2 数据填充与动态更新

4.2.1 静态数据的绑定

在ECharts中,静态数据通常直接在配置项中定义,并通过 data 属性绑定到图表上。这些数据可以是数值数组,也可以是对象数组,取决于 series 中使用的图表类型和数据格式。

option = {
    series: [
        {
            name: '销量',
            type: 'line',
            data: [
                { value: 5, name: '周一' },
                { value: 20, name: '周二' },
                { value: 36, name: '周三' },
                // ... 其他数据点
            ]
        }
    ]
};

在这个例子中, data 是一个对象数组,每个对象包含 value 和 name 属性。 value 属性代表图表上的数值,而 name 属性是用于轴标签的文本。

4.2.2 动态数据源的链接与刷新机制

对于动态数据更新,可以使用 setOption 方法来更新图表数据。这个方法允许我们添加、修改或者删除图表上的系列( series ),并且可以重新绑定新的数据集,而不需要重新创建整个图表。

// 初始图表配置
var myChart = echarts.init(document.getElementById('main'));

var option = {
    // ... 其他配置项
    series: [
        {
            name: '销量',
            type: 'line',
            data: [5, 20, 36]
        }
    ]
};

// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);

// 假设我们有一个新的数据数组
var newData = [20, 10, 30];

// 新的数据替换旧的数据
option.series[0].data = newData;

// 通过setOption方法进行数据更新
myChart.setOption(option);

通过这种方式,可以实现图表的动态更新,适用于需要实时反映数据变化的场景。这种更新机制支持图表的平滑过渡,可以在数据更新时保持图表状态的连贯性。

以上各章节内容,需要根据实际项目和ECharts库的使用经验,结合示例代码和图表选项的详细解释,逐步引导读者理解并掌握如何在Android中集成ECharts,如何构建Option对象来设置图表数据,以及如何实现数据的动态更新。

5. 图表更新与交互功能实现

图表作为数据的可视化表达,在实际应用中,动态更新数据和用户交互是必不可少的。在这一章节中,我们将详细介绍如何在ECharts for Android中实现图表数据的动态更新和交互功能的高级应用。

5.1 图表数据的动态更新

在动态数据源的场景下,ECharts视图需要能够响应数据变化,并且实时反映在界面上。这要求开发者了解ECharts的事件监听机制和数据更新API。

5.1.1 监听事件处理

ECharts的事件处理机制是实现交互功能的基础。通过监听各种事件,可以实现图表的个性化行为。

echartsView.setOnChartTouchListener(new OnChartTouchListener() {
    @Override
    public void onTouchEvent(MotionEvent event) {
        // 处理事件
    }

    @Override
    public void onSingleTapUp(MotionEvent e) {
        // 处理点击事件
    }

    @Override
    public void onLongPress(MotionEvent e) {
        // 处理长按事件
    }

    // ... 其他事件的回调方法
});

在上述代码中, OnChartTouchListener 用于处理各种触摸事件,这是实现交互功能的起点。

5.1.2 数据更新的API使用

数据更新是图表响应实时变化的关键。ECharts为开发者提供了 setOption 方法来更新图表的数据和配置。

Option option = new Option();
option.series(new Series());
// 设置数据
Series series = option.series().get(0);
series.data(new Data(new double[]{120, 200, 150, 80, 70, 110, 130}));

echartsView.setOption(option);

在上面的代码块中,通过创建新的Option对象并设置数据,然后使用 setOption 方法将新的配置应用到图表上。这种方式可以用来响应用户交互或是定时任务等。

5.2 交互功能的高级应用

交互功能不仅包括事件监听,还涉及使用交互组件丰富图表的表现形式和用户体验。

5.2.1 交互组件的配置和使用

ECharts提供了一系列的交互组件,如提示框、数据区域缩放、图例开关等。开发者可以按照需求进行配置。

Series series = new Series();
series.type(SeriesType.BAR);
series.name("销量");
series.data(new Data(new double[]{120, 200, 150, 80, 70, 110, 130}));
Option option = new Option();
option.series(series);
option.tooltip(new Tooltip().trigger(Trigger.item).formatter("{a} <br/>{b} : {c}"));

echartsView.setOption(option);

在上面的代码中,我们配置了一个 Tooltip 组件,当鼠标悬停在数据点上时,会显示提示框。

5.2.2 用户交互与图表联动效果实现

用户交互和图表联动效果可以增强用户对数据的理解。开发者可以使用事件监听来实现联动效果。

echartsView.setOnChartTouchListener(new OnChartTouchListener() {
    @Override
    public void onSingleTapUp(MotionEvent e) {
        // 当图表数据被点击时,获取数据索引
        float x = e.getX();
        float y = e.getY();
        HitResult result = echartsView.hitTest(x, y);
        if (result != null && result.seriesName != null) {
            // 根据点击的数据索引更新其他图表或界面元素
        }
    }

    // ... 其他事件处理逻辑
});

通过上述代码,我们可以在用户点击图表时获取到被点击的数据点索引,然后根据这个索引更新其他图表或界面元素,实现联动效果。

图表的动态更新和交互功能实现是现代数据可视化应用中的核心功能。通过本章节的介绍,我们可以了解到如何通过ECharts在Android平台上实现这些功能,并且详细介绍了事件监听、数据更新API、交互组件配置和联动效果的实现方法。接下来,我们将讨论图表的性能优化策略,确保即使在复杂数据场景下也能保持良好的性能表现。

6. 图表性能优化策略

6.1 性能问题的诊断与分析

6.1.1 常见性能瓶颈的识别

在使用ECharts库开发Android图表应用时,性能问题可能会在运行时变得明显,尤其是当图表处理大量数据点或者进行复杂的视觉渲染时。常见的性能瓶颈包括:

  • 数据点过多:大量数据点在渲染时会导致图表加载缓慢。
  • 高级图形效果:如阴影、渐变色等,虽然视觉效果丰富,但计算成本高。
  • 动态交互操作:如缩放、拖动时,图表需实时重绘。
  • 缺乏必要的硬件加速:在支持硬件加速的设备上,如果没有充分利用,则可能造成不必要的CPU计算。

识别性能瓶颈通常需要结合具体应用场景和实际的性能测试结果,可以通过分析CPU、内存的使用情况,以及帧率的变化来初步判断。

6.1.2 优化前后的性能对比

一旦确定了性能瓶颈所在,接下来就是实施优化策略并对比优化前后的结果。性能对比可以通过以下指标来衡量:

  • 加载时间:图表从初始化到完全显示所消耗的时间。
  • 渲染帧率:图表更新时,每秒渲染的帧数。
  • 内存占用:图表运行时占用的内存大小。
  • CPU占用:图表在运行时对CPU的占用情况。

通过图表化(例如:使用折线图)的方式展示优化前后的各项性能指标对比,可以直观地显示优化效果。

6.2 优化技术与实践

6.2.1 硬件加速与渲染优化

ECharts在Android中的渲染可以通过启用硬件加速来优化,这通常能够提高图表的渲染性能。硬件加速是利用GPU进行渲染,可以减少CPU的计算负担。在Android中,可以在AndroidManifest.xml文件中对应Activity中加入以下设置:

<activity android:name=".YourChartActivity"
    android:hardwareAccelerated="true"
    ...>
    ...
</activity>

在渲染层面,还可以通过降低图表复杂度来提升性能。比如减少不必要的Series类型和视觉效果,只在需要强调的区域使用更复杂的图表,而在其他区域使用简化版本。

6.2.2 图表渲染的逻辑优化实例

为了更具体地展示性能优化的实践,我们可以从一个实例入手:假设有一个时间序列图表,随着时间的推移,数据点越来越多,导致图表渲染速度变慢。

一个有效的优化方法是使用“数据下采样”。具体来说,可以定期从数据集中删除历史数据点,只保留最近时期的数据点,以此减轻图表的渲染负担。示例代码如下:

private void sampleData() {
    // 假设原始数据点集合为List<DataPoint>
    List<DataPoint> dataPoints = ...;
    // 设定时间窗口,例如只保留最近7天的数据
    long timeWindow = 7 * 24 * 60 * 60 * 1000L; // 7天,单位毫秒
    long currentTime = System.currentTimeMillis();
    List<DataPoint> sampledPoints = new ArrayList<>();
    for (DataPoint point : dataPoints) {
        if (currentTime - point.timestamp < timeWindow) {
            sampledPoints.add(point);
        }
    }
    // 更新图表数据
    updateChart(sampledPoints);
}

通过上述方法,图表不需要渲染过多的数据点,从而改善了性能。

6.3 性能优化的测试与验证

图表性能优化之后,需要经过一系列的测试来确保优化效果,并进行验证。性能测试通常包括以下几个方面:

  • 自动化测试脚本 :使用UI自动化测试工具来模拟用户操作,持续运行,监控性能指标。
  • 用户接受测试(UAT) :让真实用户参与测试,根据用户的反馈和体验来评估性能。
  • 压力测试 :对图表应用进行极端条件下的测试,确保在高负载下仍能保持稳定性能。

针对图表优化后的性能,可以使用Android的Profiler工具,监控CPU、内存和帧率,记录性能数据,并进行分析。此外,可以使用图表的形式(例如:散点图、折线图)来可视化地展示优化前后的性能变化,辅助进行分析。

综上,图表性能优化不仅需要掌握具体的技术和方法,还需要系统性的测试和验证,以确保优化达到了预期效果,并保证应用在用户端的良好表现。

7. ECharts样式的自定义和兼容性测试

7.1 样式定制的基础

7.1.1 样式定制的途径与方法

在ECharts中,样式定制是非常灵活的,可以通过多种途径和方法来实现。首先,ECharts支持通过CSS来自定义样式,这适用于全局或特定图表的样式设置。例如,可以通过修改图表容器的CSS样式来改变图表的边距、背景色等。

其次,ECharts提供了丰富的API来动态设置样式,这些API可以响应用户的交互行为或数据更新。通过这些API,可以对图表的系列(series)、数据项、提示框(tooltip)、图例(legend)等进行样式上的定制。

7.1.2 自定义主题的创建与应用

ECharts支持主题的定制,这意味着开发者可以创建具有个性化视觉效果的主题,并应用到图表上。创建自定义主题可以通过修改内置主题的配置文件来完成。ECharts官方提供了一套工具 theme-builder ,可以轻松地在线定制和导出主题配置文件。

应用自定义主题到图表中,只需在初始化图表时,通过 echarts.init() 方法传入主题配置对象即可。需要注意的是,主题中可能包含大量的样式设置,应用时应确保不与其他样式产生冲突。

7.2 兼容性测试与解决方案

7.2.1 不同设备与Android版本的测试

在开发移动应用时,由于设备的多样性,进行兼容性测试是必不可少的一个环节。需要针对不同品牌、不同屏幕尺寸、不同Android版本的设备进行测试,以确保图表的显示效果和功能都能正常工作。

兼容性测试的方法包括手动测试和自动化测试。手动测试即开发者亲自使用不同设备进行验证。而自动化测试可以借助一些工具来实现,例如Appium、Gradle等。通过构建多种设备和Android版本的模拟器,运行自动化脚本来检查图表的兼容性。

7.2.2 解决方案与兼容性调整技巧

在测试过程中遇到的兼容性问题,需要逐一解决。例如,某些图表组件在小屏幕设备上显示不全,可以通过设置图表的 responsive 属性来进行适配。此外,对于不同版本的Android系统,可能需要调整字体大小或图例的显示方式来确保图表元素不被截断。

对于一些性能问题,如在旧版本Android设备上图表渲染缓慢,可以尝试优化图表的配置项,如减少 series 中的数据点数量,调整 markPoint 和 markLine 的使用策略等。还可以开启图表的 useHTML 属性,利用Web技术来渲染图表,有时候能提升兼容性和性能。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目提供了一个封装库,用于在Android应用中调用和使用百度ECharts库,以创建和管理丰富的数据可视化图表。介绍了集成ECharts到Android项目的步骤,包括添加依赖、设置权限、创建ECharts视图、初始化及配置、创建Option对象、图表更新、交互功能、性能优化、自定义样式及兼容性测试。封装库 htechart 可能提供了更易用的API和扩展功能,使开发者能通过ECharts实现直观的数据展示和打造具有吸引力的交互式Android应用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

更多推荐