Android自定义滑动开关按钮教程.zip

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

简介:滑动开关按钮是Android用户界面中用于功能开启和关闭的交互组件。本压缩包介绍了如何在Android应用中实现和自定义滑动开关,包括ToggleButton和Switch的使用及编程控制。它包含开发指南、XML布局与Java代码控制示例、自定义滑动开关样式和主题的详细说明。通过本教程,开发者可以学习如何通过继承 CompoundButton 类并重写 onDraw() 方法来自定义滑动开关的外观和动画效果,从而提升应用的交互体验。

1. Android滑动开关按钮基础

滑动开关是Android应用中常见的一种控件,它允许用户通过简单的滑动来开启或关闭一个功能。理解滑动开关的类型和它们在应用中的基本使用是为用户提供直观交互体验的第一步。

1.1 滑动开关的种类和用途

滑动开关主要分为 ToggleButton Switch 两种类型。 ToggleButton 提供一个按钮形式的开关,而 Switch 则呈现为一个滑动杆。它们都用于切换应用内的选项状态,如开启/关闭设置项。

1.2 开发环境的准备

要创建和使用滑动开关控件,需要配置好Android开发环境,如安装Android Studio和相应版本的SDK。这为后续的开发工作提供基础支持。

<!-- 一个简单的Switch组件的XML声明示例 -->
<Switch
    android:id="@+id/switch_example"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Toggle Me!"/>

在上述代码中,我们简单声明了一个 Switch 控件,并指定了其ID和基本属性。实际开发时,我们会在Java代码中进一步定义其行为和样式。这是实现一个基础开关功能的第一步,为后续更深入的定制和功能实现打下了基础。

2. ToggleButton与Switch组件使用

在移动应用界面中,滑动开关组件提供了一种直观的方式来选择开启或关闭状态。本章深入探讨了ToggleButton和Switch组件的使用细节,包括它们的属性、事件监听以及如何在应用中实现状态切换。

2.1 ToggleButton组件的介绍与应用

ToggleButton是一个用户界面组件,通常用于启用或禁用某个功能。与普通的按钮不同,ToggleButton可以保持两种状态中的任一种,它与Switch组件在视觉上相似,但通常用于控制更具体的选项。

2.1.1 ToggleButton基本属性和方法

ToggleButton的基本属性包括 textOn textOff text button ,分别用于设置开启状态下的文本、关闭状态下的文本、当前状态下的文本和按钮图形。以下是定义一个ToggleButton的XML代码示例:

<ToggleButton
    android:id="@+id/toggleButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textOn="On"
    android:textOff="Off"
    android:text="Toggle"
    android:button="@drawable/ic_toggle_button"
    android:padding="16dp"/>

2.1.2 ToggleButton事件监听与状态切换

ToggleButton的状态切换通常通过事件监听器来实现。在Java代码中,我们可以注册一个 CompoundButton.OnCheckedChangeListener 来监听状态变化事件,并在回调方法中处理相应的逻辑:

ToggleButton toggleButton = findViewById(R.id.toggleButton);
toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // 在这里处理状态变化逻辑
        if (isChecked) {
            // 按钮被选中时的操作
        } else {
            // 按钮未被选中时的操作
        }
    }
});

2.2 Switch组件的特点与运用

Switch组件是Android提供的另一种用于表示开关状态的UI控件。它比ToggleButton更加现代化,且更适合用于设置选项。Switch的属性和方法与ToggleButton相似,但其视觉效果和交互方式更适合现代Android应用的风格。

2.2.1 Switch组件的基本属性和方法

Switch组件的基本属性包括 textOn textOff thumb track ,分别用于定义开启状态下的文本、关闭状态下的文本、滑块图形和轨道图形。以下是定义一个Switch组件的XML代码示例:

<Switch
    android:id="@+id/aSwitch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textOn="ON"
    android:textOff="OFF"
    android:track="@drawable/switch_track"
    android:thumb="@drawable/switch_thumb"/>

2.2.2 Switch组件事件监听与状态切换

Switch组件同样支持状态监听和状态切换。在Java代码中,我们可以通过注册一个 CompoundButton.OnCheckedChangeListener 来监听状态变化:

Switch aSwitch = findViewById(R.id.aSwitch);
aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // 在这里处理状态变化逻辑
    }
});

在这部分的实践中,开发者应该意识到ToggleButton和Switch在不同场景下的适用性,并根据实际需求选择合适的组件。同时,在设计和实现时应该考虑到用户交互的直观性和反馈的及时性。接下来的章节将深入介绍如何在XML布局文件中声明和高级应用这些滑动开关控件,并探讨在Java代码中如何实现状态控制。

3. XML布局文件中滑动开关的声明

3.1 声明ToggleButton与Switch的XML语法

3.1.1 XML中ToggleButton的属性设置

在Android应用开发中,ToggleButton是一个允许用户切换开关状态的按钮,它有开和关两种状态。我们通过XML布局文件声明ToggleButton组件,可以对其进行外观和行为的定制。以下是ToggleButton在XML中的基本属性设置:

<ToggleButton
    android:id="@+id/toggleButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textOn="开"
    android:textOff="关"
    android:background="@drawable/toggle_background"
    android:button="@drawable/toggle_drawable"
    android:checked="false"/>

3.1.2 XML中Switch的属性设置

Switch组件是Android中用于状态切换的另一种滑动开关控件,适用于开关频繁切换的场景。Switch组件的属性设置在XML中如下:

<Switch
    android:id="@+id/switchButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="启用"
    android:textOff="关闭"
    android:textOn="打开"
    android:thumb="@drawable/switch_thumb"
    android:track="@drawable/switch_track"
    android:checked="false"/>

3.2 XML中滑动开关属性的高级应用

3.2.1 定制化属性的创建与应用

在XML布局文件中,我们可以通过定制化属性来增强滑动开关的外观和功能。例如,创建一个自定义属性来改变开关的背景色,如下所示:

<resources>
    <attr name="custom_background" format="reference"/>
</resources>

<com.example.customviews.ToggleButton
    android:id="@+id/customToggleButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textOn="开"
    android:textOff="关"
    app:custom_background="@color/custom_color"/>

在上述代码中, custom_background 是一个自定义属性,它引用了一个颜色资源 @color/custom_color

3.2.2 属性动画与交互效果的实现

为了增强用户体验,我们可以在用户与开关交互时使用属性动画。在XML中,可以使用 android:animateLayoutChanges="true" 属性来启用布局变化的动画效果。

<Switch
    android:id="@+id/animatedSwitch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="启用动画"
    android:animateLayoutChanges="true"
    android:checked="false"/>

以上代码片段说明了如何通过XML属性为开关添加动画效果,其中 android:animateLayoutChanges="true" 确保当开关状态改变时,布局的变化会有一个平滑的过渡动画。

接下来的章节将深入探讨如何在Java代码中处理滑动开关的状态控制,并实现自定义的滑动开关功能。这将涉及对组件状态变化的监听和响应,以及如何通过编程逻辑来实现开关的自定义行为。

4. Java代码中滑动开关的状态控制

在移动应用中,滑动开关(Switch)组件的交互体验对于提升用户满意度至关重要。状态控制是实现这一交互的核心,它允许开发者在Java代码中精确地处理用户输入、状态变化和响应动作。本章将深入探讨如何在Java代码中有效地控制滑动开关的状态,并实现状态的持久化和恢复机制。

4.1 Java中监听滑动开关状态变化

4.1.1 基于Listener的滑动开关状态监听

在Android开发中,滑动开关组件通常会注册一个状态改变监听器来响应用户的操作。 CompoundButton.OnCheckedChangeListener 是专门用于监听滑动开关状态变化的接口。通过实现该接口,开发者可以定义状态变化时的具体行为。

// 注册监听器到滑动开关组件
slider.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // 当滑动开关开启时的操作
            Log.d("SwitchState", "Switch is ON.");
        } else {
            // 当滑动开关关闭时的操作
            Log.d("SwitchState", "Switch is OFF.");
        }
    }
});

在上述代码中, setOnCheckedChangeListener 方法被用来设置状态变化的监听器。每当滑动开关的状态发生改变时, onCheckedChanged 方法会被调用,并传递当前的开关状态。

4.1.2 基于Callback的状态变化处理

除了基于监听器的模式之外,还可以利用回调机制(Callback)来处理状态变化。虽然在滑动开关中这种用法不如监听器广泛,但某些情况下通过设置回调可以更加灵活地控制状态变化的处理。

// 设置回调接口实现,以响应滑动开关的状态变化
slider.setSwitchCallback(new SwitchCallback() {
    @Override
    public void onSwitchChanged(boolean isChecked) {
        // 在这里处理滑动开关状态变化的逻辑
    }
});

SwitchCallback 是一个自定义的回调接口,你需要在你的 Slider 类中定义并实现它。回调机制提供了一种解耦的方式,允许组件在状态改变时通知外部代码,而无需直接依赖于组件内部的监听器实现。

4.2 滑动开关状态控制的代码实现

4.2.1 实现状态切换的逻辑代码

要控制滑动开关的状态,需要在合适的时机调用 isChecked() setChecked(boolean checked) 方法。 isChecked() 方法用于获取当前开关的状态,而 setChecked(boolean checked) 方法则用于改变状态。

// 获取滑动开关的状态
boolean currentState = slider.isChecked();

// 根据某些条件改变滑动开关的状态
if (someCondition) {
    slider.setChecked(true);
} else {
    slider.setChecked(false);
}

在上述代码中, someCondition 代表了一个条件判断,根据该条件来决定滑动开关是否应当被切换到开启或关闭状态。这种控制状态的方式对于实现条件性行为非常有用,例如根据网络连接状态、用户设置或其他程序逻辑来控制开关。

4.2.2 状态保持与恢复机制

为了保证用户界面的状态在配置更改(如屏幕旋转)后能够被保持和恢复,开发者需要使用 SharedPreferences 或者数据库等存储机制来记录开关的状态,并在应用恢复时重新设置。

// 保存滑动开关状态
SharedPreferences sharedPreferences = getSharedPreferences("SwitchState", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("sliderState", slider.isChecked());
editor.apply();

// 恢复滑动开关状态
boolean savedState = sharedPreferences.getBoolean("sliderState", false);
slider.setChecked(savedState);

在这段代码示例中,使用 SharedPreferences 来持久化开关的状态。当应用首次启动或在生命周期的恢复阶段,可以从持久化存储中读取状态,并应用到滑动开关上。这样可以确保用户体验的连贯性和一致性。

在本章节中,我们深入探讨了如何在Java代码中控制滑动开关的状态,包括监听状态变化和实现状态切换逻辑。此外,还介绍了如何通过持久化存储机制来维护和恢复滑动开关的状态,以提供更加完善的用户交互体验。在接下来的章节中,我们将详细讨论自定义滑动开关的实现方法,进一步提升滑动开关组件的功能和可定制性。

5. 自定义滑动开关的实现方法

滑动开关是Android应用中常见的交互元素之一。开发者有时需要根据具体的设计需求,实现具有特殊外观和行为的自定义滑动开关。本章节将详细介绍如何从布局设计到Java逻辑实现,全面构建一个自定义的滑动开关组件。

5.1 自定义滑动开关的布局设计

为了实现一个自定义的滑动开关,首先需要从其布局设计入手。这包括创建XML布局文件以及利用图形编辑器设计组件的外观。

5.1.1 创建自定义组件的XML布局

自定义滑动开关的XML布局定义了组件的基本结构。开发者需要合理使用布局容器和控件来构建滑动开关的外观。以下是一个基础的自定义滑动开关XML布局示例:

<RelativeLayout xmlns:android="***"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp">

    <com.example.customtoggle.CustomToggleView
        android:id="@+id/custom_toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="8dp"
        android:background="@drawable/track_background"
        android:thumb="@drawable/thumb" />
</RelativeLayout>

这里, CustomToggleView 是我们自定义的滑动开关组件类。 track_background thumb 则是我们自定义的背景和滑块图形资源。

5.1.2 使用图形编辑器定制组件外观

为了让滑动开关更符合UI设计,使用图形编辑器来定制组件的外观是必须的。可以使用Android Studio内置的Vector Asset Studio或任何图像编辑软件来设计滑块(Thumb)和轨道(Track)的图形。

例如,使用Vector Asset Studio创建滑块图形的过程如下:

  1. 打开Android Studio,选择 File > New > Vector Asset
  2. 选择 Clip Art ,挑选适合滑块设计的图形。
  3. 调整图形大小、颜色和样式,以符合应用的整体设计风格。
  4. 将生成的矢量图形资源(通常为 .xml 文件)存放在 res/drawable 目录下。
  5. 确保在自定义视图的布局文件中引用这些资源,以显示设计好的图形。

5.2 自定义滑动开关的Java逻辑实现

创建了自定义的XML布局之后,接下来需要通过Java代码实现组件的逻辑,包括绘制和状态更新。

5.2.1 组件绘制与状态更新逻辑

自定义滑动开关的绘制和状态更新逻辑可以在 CustomToggleView 类中实现。该类需要继承自 View 类,并重写 onDraw 方法来绘制滑动开关的轨道和滑块。以下是绘制滑块的基本示例代码:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 绘制轨道
    Paint trackPaint = new Paint();
    trackPaint.setColor轨道路由颜色);
    canvas.drawRect(trackRectF, trackPaint);
    // 绘制滑块
    Paint thumbPaint = new Paint();
    thumbPaint.setAntiAlias(true);
    thumbPaint.setColor(滑块颜色);
    canvas.drawOval(thumbRectF, thumbPaint);
    // 更多绘制逻辑...
}

状态更新逻辑通常需要处理用户的滑动操作,并在滑动过程中实时更新滑动开关的状态。这可以通过覆写 onTouchEvent 方法来实现。

5.2.2 事件分发与自定义行为

自定义滑动开关的事件分发机制通常需要处理触摸事件,并将其转化为状态更新。这涉及到 onTouchEvent 方法的覆写和滑动开关状态逻辑的实现。以下是一个简化的逻辑示例:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            // 计算滑块的新位置,并判断状态变化
            boolean isChecked = calculateNewState(event.getX());
            if (isChecked != isChecked) {
                isChecked = !isChecked;
                // 更新滑动开关状态
                updateToggleState(isChecked);
                // 通知监听器状态改变
                if (onChangeListener != null) {
                    onChangeListener.onToggleChange(isChecked);
                }
            }
            break;
        case MotionEvent.ACTION_UP:
            // 最终确认状态并重绘视图
            invalidate();
            break;
        default:
            return false;
    }
    return true;
}

在这个例子中, calculateNewState 方法负责根据触摸事件的X坐标计算滑块的新位置,并返回是否需要更新状态。 updateToggleState 则是更新视图状态并可能触发状态变化的方法。此外,我们还假设有 onChangeListener 用于监听状态变化,并在状态更新时作出响应。

通过对以上代码的逐步分析,我们了解到自定义滑动开关的实现需要对组件的外观进行详细设计,并且通过覆写特定方法来处理绘制逻辑和事件分发。在此基础上,开发者可以根据不同的需求,增加更多功能和交互效果,来提升用户界面的可用性和美观性。

6. 滑动开关样式和主题的定制

6.1 样式定制基础与应用

滑动开关作为一种常用的UI组件,在不同的应用中,常常需要根据应用的整体风格进行视觉上的调整。在Android系统中,可以通过样式(Style)来实现对滑动开关外观的定制。

6.1.1 样式文件(styles.xml)的使用

样式的定义通常位于资源文件(res/values/styles.xml)中。一个样式是一个属性集合,可以用来定义一个视图的外观。例如,我们想要自定义一个ToggleButton的样式,我们可以创建一个新的style项:

<style name="CustomToggleStyle" parent="Widget.AppCompat.ToggleButton">
    <item name="colorControlNormal">@color/gray</item>
    <item name="colorControlActivated">@color/green</item>
    <item name="colorControlHighlight">@color/dark_green</item>
    <!-- 更多样式属性可以根据需要添加 -->
</style>

在这个样式中, colorControlNormal colorControlActivated 、和 colorControlHighlight 分别定义了ToggleButton在不同状态下的颜色。

6.1.2 滑动开关样式的自定义方法

要应用上面定义的样式到ToggleButton,我们只需要在ToggleButton的XML声明中引用这个样式:

ToggleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@style/CustomToggleStyle"
    android:textOff="OFF"
    android:textOn="ON" />

通过这种方式,我们可以控制开关按钮的外观,包括颜色、字体大小、背景等。同样的方法也可以应用于Switch组件。

6.2 主题定制与系统兼容性处理

样式和主题是Android设计体系中的重要组成部分。主题对整个应用界面的外观有着全局的影响,包括滑动开关的样式。

6.2.1 主题定制对滑动开关的影响

主题(Theme)是样式(Style)的扩展,它们可以定义整个应用或某个活动(Activity)的外观和感觉。对于滑动开关来说,主题可以包含一些默认的样式设置。例如,如果在一个Material主题的环境中,所有的开关组件可能会默认具有Material Design风格。

要创建一个自定义主题,可以继承自现有的主题,然后修改特定的属性值:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
</style>

<style name="CustomToggleTheme" parent="AppTheme">
    <item name="toggleStyle">@style/CustomToggleStyle</item>
</style>

在这里, CustomToggleTheme 继承自 AppTheme ,同时定义了 toggleStyle 属性,将之前定义的 CustomToggleStyle 应用到了所有Toggle按钮上。

6.2.2 处理不同系统版本的样式适配

在进行主题和样式定制时,需要考虑到不同版本的Android系统可能对样式属性的支持情况。为了确保兼容性,可以使用Android Studio的"Theme Editor"来检查并编辑主题和样式。

一个适配策略是使用条件资源(比如不同的 styles-v21.xml styles-v22.xml 文件),针对不同的API级别应用不同的样式:

<!-- styles-v21.xml for Android Lollipop and above -->
<style name="CustomToggleStyle" parent="Widget.Material.ToggleButton">
    <!-- API 21+ specific styles -->
</style>

<!-- styles.xml for older versions -->
<style name="CustomToggleStyle" parent="Widget.AppCompat.ToggleButton">
    <!-- Styles for older API levels -->
</style>

通过这种方式,我们可以针对不同版本的Android系统进行精确的样式控制,确保应用的用户体验在不同设备上的一致性。

滑动开关样式和主题定制示例代码:

以下是创建一个自定义ToggleButton样式的示例代码:

// Java代码部分
public class CustomToggleButton extends AppCompatToggleButton {

    public CustomToggleButton(Context context) {
        super(context);
        init();
    }

    public CustomToggleButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // 初始化代码,比如设置监听器、适配不同样式等
    }

    // 更多自定义的方法和逻辑
}

该代码段创建了一个自定义的ToggleButton类,你可以在此基础上添加更多自定义逻辑,比如监听器的设置、适配不同主题和样式的代码等。

通过以上的介绍,我们可以了解到滑动开关样式的定制是多方面的,包括样式和主题的定义以及如何应用这些定制。同时,我们也学习到了如何处理不同系统版本对样式的影响,并确保滑动开关组件在所有设备上的一致性和兼容性。

7. 总结与展望

随着移动应用的发展,滑动开关组件在用户交互中扮演着越来越重要的角色。从简单的开关到更复杂的自定义滑动开关,它们不仅影响用户体验,也驱动着技术的不断创新。本章将回顾我们在前几章中学到的关键知识,并展望未来滑动开关组件可能的发展方向。

7.1 滑动开关组件的实战经验总结

7.1.1 常见问题的解决方案

在实际开发中,我们可能会遇到各种问题,例如如何处理状态保持与恢复、如何优化性能以及如何实现更复杂的交互效果。以下是针对这些问题的一些解决方案:

  • 状态保持与恢复 :使用SharedPreferences或数据库来保存开关的状态,确保应用在重新启动后能够恢复到之前的状态。
  • 性能优化 :通过减少不必要的视图更新和使用缓存策略来提升滑动开关的性能。
  • 复杂交互效果 :利用属性动画(Property Animation)和自定义Drawable资源来创建复杂的交互效果,从而提升用户体验。

7.1.2 高级功能的实现策略

实现高级功能,如自定义滑动效果或响应式更新,需要在理解组件原理的基础上进行更深入的开发。下面提供一些实现策略:

  • 自定义滑动效果 :通过覆写 onTouchEvent 方法,我们可以实现自定义的滑动效果,以满足特定的交互需求。
  • 响应式更新 :利用观察者模式(Observer Pattern),当滑动开关状态改变时,通知相关的UI组件进行更新。

7.2 滑动开关开发的未来趋势

7.2.1 新兴技术对开关组件的影响

随着技术的发展,如人工智能(AI)、增强现实(AR)和虚拟现实(VR)等新兴技术的应用,滑动开关组件可能会迎来新的变革。例如,AI技术可以用来预测用户的行为并自动切换开关状态,而AR/VR技术则可能要求开关组件能够更好地融入虚拟环境的交互中。

7.2.2 滑动开关在不同场景下的应用展望

在智能家居、汽车控制、游戏开发等领域,滑动开关组件将发挥更大的作用:

  • 智能家居 :通过滑动开关控制灯光、温度等,滑动开关将变得更加智能和网络化。
  • 汽车控制面板 :车辆控制面板上的滑动开关将更加直观和安全,同时集成触觉反馈来增强操作体验。
  • 游戏开发 :在游戏界面中,滑动开关可以用来调节音量、视角等,使玩家能更快地适应游戏环境。

滑动开关组件的未来充满了无限可能,持续关注并实践新技术,将是每一位开发者在这一领域不断前进的动力。

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

简介:滑动开关按钮是Android用户界面中用于功能开启和关闭的交互组件。本压缩包介绍了如何在Android应用中实现和自定义滑动开关,包括ToggleButton和Switch的使用及编程控制。它包含开发指南、XML布局与Java代码控制示例、自定义滑动开关样式和主题的详细说明。通过本教程,开发者可以学习如何通过继承 CompoundButton 类并重写 onDraw() 方法来自定义滑动开关的外观和动画效果,从而提升应用的交互体验。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值