实现安卓Activity流畅动画切换:源码解析

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

简介:本文深入探讨了在安卓开发中通过源码实现四种基本动画类型:translate(平移)、scale(缩放)、alpha(透明度变化)以及rotate(旋转),并将这些动画应用于Activity切换过程,增强用户界面的流畅性和动态性。文章首先介绍每种动画的效果和创建方法,然后详细说明了如何设置动画监听器、应用动画、组合多个动画,并最终启动动画。这些步骤帮助开发者自定义Activity之间的切换效果,提升应用程序的个性化和用户体验。 动画效果

1. Android源码中的动画概述

在Android开发中,动画不仅给用户带来视觉上的愉悦感受,而且增强了应用的交互性。动画效果能够吸引用户的注意力,使操作流程更加自然流畅。随着Android版本的不断更新,动画实现方式也日益丰富,从简单的帧动画到属性动画,每一步的迭代都使得动画效果的实现更加强大而灵活。

动画可以分为帧动画、补间动画以及属性动画三大类。其中,补间动画包括平移(Translate)、旋转(Rotate)、缩放(Scale)和透明度(Alpha)变化四种类型。属性动画则更进一步,它允许开发者对任何对象的属性进行动画处理,而不仅仅是视图(View)对象。这些动画的实现,不仅仅依赖于XML文件的配置,更多的是通过编程的方式来动态控制。

本文将深入浅出地介绍Android中各种动画类型的基本概念、实现方法以及如何在实际开发中应用和优化动画效果。我们从第一章开始,将深入了解Android动画的底层原理与应用概述,为后续章节中详细介绍各类动画的实现打下坚实的基础。

flowchart LR
    A[动画概述] --> B[补间动画]
    B --> C[Translate动画]
    B --> D[Scale动画]
    B --> E[Alpha动画]
    B --> F[Rotate动画]
    A --> G[属性动画]
    G --> H[自定义动画]
    A --> I[动画应用与优化]
    I --> J[Activity切换动画]
    I --> K[动画监听与反馈]
    I --> L[复合动画与性能优化]

以上流程图展示了本文的主要内容结构,以及各章节之间的逻辑关系。在接下来的章节中,我们将详细探讨每一种动画类型的实现细节及其在Android应用中的具体应用。

2. Translate动画实现与应用

2.1 Translate动画的基本概念

2.1.1 动画在Android中的作用和意义

在Android开发中,动画是用来为用户界面添加动态效果的一系列技术手段。它们是让应用看起来更生动、更吸引人的重要元素。动画能够提升用户体验,引导用户的注意力,以及直观地展示界面元素的变化。

Translate动画是一种特定类型的动画,专注于对象在屏幕上的位置移动。例如,一个按钮可以沿着水平或垂直方向移动,或者沿着任意路径平滑地滑入或滑出屏幕。在某些情况下,Translate动画用于创建视图之间的过渡效果,或者在用户界面中传达一种流动感。

2.1.2 Translate动画的原理分析

Translate动画通过改变视图的位置属性来实现动画效果。在Android中,这主要通过修改视图的 translationX translationY 属性来完成,分别对应视图在X轴和Y轴上的偏移量。

动画的核心原理是通过一系列的帧来改变这些属性值,从而在视觉上产生平滑的移动效果。在Android动画框架中,可以通过定义动画的起始状态、结束状态以及持续时间来完成这些操作。动画框架会根据这些参数在指定时间内更新视图的属性,创建动态效果。

2.2 Translate动画的XML和代码实现

2.2.1 XML中定义Translate动画的方法

在Android开发中,使用XML来定义动画是一种非常普遍且直观的方式。Translate动画可以通过在 res/anim 目录下创建一个XML文件来定义。

下面是一个简单的Translate动画示例,该动画会使视图沿着X轴向右移动:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0%p" android:toXDelta="100%p"
    android:duration="300"
    android:interpolator="@android:anim/linear_interpolator" />

在这个例子中, fromXDelta 指定了动画开始时视图的水平位置(相对于视图本身的位置百分比), toXDelta 指定了结束位置, duration 设置了动画的持续时间,而 interpolator 定义了动画的速率变化,即动画速度是线性的。

2.2.2 代码中实现Translate动画的步骤

在代码中实现Translate动画涉及到以下几个步骤:

  1. 创建一个 Animation 对象。
  2. 加载上面创建的XML动画资源。
  3. 应用这个动画到特定的视图。
  4. 控制动画的启动和停止。

下面的示例代码展示了如何在Activity中实现Translate动画:

// 创建Animation对象并加载XML动画资源
Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_animation);

// 获取需要应用动画的视图对象
View myView = findViewById(R.id.my_view);

// 将动画应用到视图上
myView.startAnimation(translateAnimation);

// 设置动画监听器,可以获取动画开始、结束等事件
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        // 动画开始时的操作
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // 动画结束时的操作
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // 动画重复时的操作
    }
});

通过上述步骤,开发者可以在Android应用中轻松地添加Translate动画效果,以提升用户交互体验。

3. Scale动画实现与应用

Scale动画是Android开发中用于实现视图缩放效果的一种动画方式。通过改变视图的尺寸比例,开发者可以在界面中实现元素的放大和缩小效果,给用户带来视觉上的动态体验。Scale动画可以单独使用,也可以与Translate、Alpha、Rotate等其他类型的动画组合使用,创造出丰富的交云动效果。

3.1 Scale动画的基本原理

3.1.1 动画缩放效果的技术细节

Scale动画主要通过改变视图的缩放比例来实现动画效果。动画的执行可以设置为从一个缩放比例变化到另一个缩放比例,从而实现从一个状态平滑过渡到另一个状态的视觉效果。技术上,这一变化涉及到视图的两个维度(宽度和高度)的缩放。

3.1.2 Scale动画的XML配置方式

在XML中定义Scale动画主要涉及到 <scale> 标签,它可以指定动画开始时( fromXScale fromYScale )和结束时( toXScale toYScale )的缩放比例。此外,还可以通过 pivotX pivotY 属性来指定动画缩放的中心点。

下面是一个简单的Scale动画的XML配置示例:

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="1.5"
    android:toYScale="1.5"
    android:pivotX="50%"
    android:pivotY="50%">
</scale>

这段XML定义了一个动画,初始状态下视图保持原大小,经过300毫秒的时间,视图的宽度和高度都放大到原来的1.5倍。

3.2 Scale动画的编程实践

3.2.1 缩放动画在代码中的实现技巧

在代码中实现Scale动画需要使用 ScaleAnimation 类。这个类允许开发者通过构造函数或者设置属性的方法来指定动画的各种参数。比如,设置动画的起始和结束缩放比例、中心点、持续时间等。在代码中,我们还可以为动画添加监听器,以在动画的不同阶段执行特定的逻辑。

下面是如何通过代码实现Scale动画的示例:

ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f,
                                                    Animation.RELATIVE_TO_SELF, 0.5f,
                                                    Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(300);
scaleAnimation.setFillAfter(true); // 保持动画结束后的状态
scaleAnimation.setInterpolator(new AccelerateInterpolator()); // 设置动画加速器
view.startAnimation(scaleAnimation);

3.2.2 缩放动画与视图交互的场景应用

Scale动画在实际应用中可以用于强调界面元素,比如点击按钮时放大按钮表示被选中,或者在图片查看器中放大图片以查看细节。此外,还可以在动画中结合其他交互操作,如点击放大后的视图跳转到详情页面,实现平滑流畅的用户体验。

在实现这种交云动时,需要关注动画与用户的交互逻辑,确保动画的触发和执行与用户的操作同步。例如,在用户点击一个按钮时,可以通过按钮的点击事件触发Scale动画,并通过动画监听器来控制动画执行完毕后的行为。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f,
                                                        Animation.RELATIVE_TO_SELF, 0.5f,
                                                        Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnimation.setDuration(300);
        scaleAnimation.setFillAfter(true);
        scaleAnimation.setInterpolator(new AccelerateInterpolator());
        button.startAnimation(scaleAnimation);

        scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {}

            @Override
            public void onAnimationEnd(Animation animation) {
                // 动画结束后的操作,比如跳转到详情页面
            }

            @Override
            public void onAnimationRepeat(Animation animation) {}
        });
    }
});

通过以上章节内容,读者应该能够理解Scale动画的基本原理和实现方式,并能在实际开发中灵活运用。Scale动画不仅能够丰富用户界面的视觉效果,还能通过动画的交互性提升应用的用户体验。

4. Alpha动画实现与应用

4.1 Alpha动画的理论基础

4.1.1 透明度动画的工作机制

Alpha动画是改变视图透明度的动画效果,它在Android中的工作机制是通过改变视图的 alpha 值来实现视觉上的淡入淡出效果。透明度值是一个介于0(完全透明)到1(完全不透明)之间的浮点数,其中0.0表示完全透明,1.0表示完全不透明。通过动画系统,可以在设定的时间内平滑地改变这个值,从而达到渐变的效果。

在Android动画框架中,Alpha动画可以应用于 View 或者 ViewGroup ,它通过对目标视图设置不同的透明度值来实现动画效果。在动画过程中,系统会自动计算出每一帧的透明度值,并更新视图的显示,使得视图看起来像是在透明度之间平滑过渡。

4.1.2 XML中定义Alpha动画的方法

要在XML中定义Alpha动画,你需要创建一个 <alpha> 标签,并设置 fromAlpha toAlpha 属性,分别表示动画的起始透明度和结束透明度。下面是一个XML配置Alpha动画的例子:

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:duration="300">
</alpha>

在这个例子中, android:duration 属性定义了动画的持续时间,这里设置为300毫秒。动画将视图从完全不透明( fromAlpha 为1.0)过渡到完全透明( toAlpha 为0.0)。

4.2 Alpha动画的编程应用

4.2.1 代码中实现Alpha动画的步骤

要在代码中实现Alpha动画,你需要使用 Animation 类,并且通过其子类 AlphaAnimation 来创建动画。接下来,你可以通过调用 startAnimation() 方法将动画应用到目标视图上。以下是在代码中实现Alpha动画的步骤:

// 创建一个AlphaAnimation实例,设置动画持续时间和透明度变化范围
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
alphaAnimation.setDuration(300);

// 获取目标视图
View view = findViewById(R.id.my_view);

// 将动画应用到视图上
view.startAnimation(alphaAnimation);

在上述代码中, AlphaAnimation 的构造函数接受两个参数,分别是从 fromAlpha toAlpha 。然后,通过 setDuration() 方法设置动画的持续时间。最后,通过 startAnimation() 方法将动画应用到目标视图。

4.2.2 Alpha动画在界面交互中的运用

Alpha动画在界面交互中的应用非常广泛,它可以用来增加用户界面的流畅性和吸引力。例如,当用户点击一个按钮时,可以通过Alpha动画使按钮淡入淡出,以此来反馈用户的操作。Alpha动画也可以用来实现视图的渐显或渐隐效果,创建更加动态的用户界面。

此外,Alpha动画还可以用于界面元素的状态变化,如在加载新的内容时,通过淡出和淡入的动画效果,向用户表明当前界面元素正在更新。这种动画效果不仅可以提升用户体验,还能在视觉上引导用户的注意力。

Alpha动画的一个常见应用场景是在Activity切换时,通过淡入淡出效果平滑地过渡到另一个界面,这可以大大提升用户体验。实现这一点,你需要在Activity的生命周期方法中,如 onPause() onResume() 中添加相应的动画。

@Override
protected void onPause() {
    super.onPause();
    // 当Activity即将结束时,启动淡出动画
    View view = findViewById(R.id.my_view);
    AlphaAnimation fadeOut = new AlphaAnimation(1.0f, 0.0f);
    fadeOut.setDuration(500);
    view.startAnimation(fadeOut);
}

@Override
protected void onResume() {
    super.onResume();
    // 当Activity重新获得焦点时,启动淡入动画
    View view = findViewById(R.id.my_view);
    AlphaAnimation fadeIn = new AlphaAnimation(0.0f, 1.0f);
    fadeIn.setDuration(500);
    view.startAnimation(fadeIn);
}

在上述代码中, onPause() 方法中启动了一个淡出动画,而 onResume() 方法中则启动了一个淡入动画。这样当用户切换到其他Activity时,当前界面会淡出,而从其他Activity返回时,当前界面会淡入。这种动画效果使得界面切换看起来更加自然和流畅。

综上所述,Alpha动画在增强用户界面的动态效果和提升用户体验方面扮演着重要角色。通过合理地使用Alpha动画,开发者可以创建更加生动和引人入胜的应用程序界面。

5. Rotate动画实现与应用

5.1 Rotate动画的核心原理

5.1.1 动画旋转的基本理论

旋转动画(Rotate)是Android中实现视图元素围绕一个中心点旋转效果的一种动画形式。实现Rotate动画主要是通过改变视图对象的旋转角度来完成的,它可以是顺时针或逆时针旋转。在数学上,旋转可以通过旋转矩阵来实现,该矩阵描述了旋转角度和旋转轴的关系。在Android动画系统中,这一过程被封装成动画对象( Animation ),我们只需要关心旋转的参数,如角度、中心点等,无需深入到矩阵的计算。

旋转动画实现通常分为两种方式:属性动画(Property Animation)和补间动画(Tween Animation)。属性动画是API 11(Android 3.0)引入的,它提供了更强大和灵活的方式来创建动画效果。属性动画可以对任何对象的任何属性进行动画处理,而补间动画则更加简单,它只适用于视图对象,并且只能改变视图的缩放、旋转、透明度和位置属性。

5.1.2 XML中定义Rotate动画的方法

在XML中定义Rotate动画,我们需要在res/anim目录下创建一个XML文件,文件名可以任意取。在该文件中,我们通过 标签来定义旋转动画,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/cycle_interpolator"
    android:fillAfter="true"
    android:duration="1000">
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="infinite"
        android:repeatMode="restart"/>
</set>

在这个例子中,我们定义了一个旋转动画,视图从0度开始,旋转到360度,旋转的中心点在视图的中心位置,动画持续时间是1000毫秒。 repeatCount 设置为 infinite 表示动画无限次数重复播放, repeatMode 设置为 restart 表示每次动画结束后重新从头开始。

5.2 Rotate动画的实战演练

5.2.1 代码中实现Rotate动画的要点

在代码中实现Rotate动画,我们可以使用 AnimationSet RotateAnimation 两个类。以下是一个简单的示例:

// 获取动画对象
RotateAnimation rotate = new RotateAnimation(
    0, // 开始角度
    360, // 结束角度
    Animation.RELATIVE_TO_SELF, // 旋转中心点x轴相对于对象自身的百分比
    0.5f, // 旋转中心点x轴百分比
    Animation.RELATIVE_TO_SELF, // 旋转中心点y轴相对于对象自身的百分比
    0.5f // 旋转中心点y轴百分比
);

// 设置动画持续时间
rotate.setDuration(1000);

// 设置动画填充模式
rotate.setFillAfter(true);

// 启动动画
view.startAnimation(rotate);

在上述代码中, RotateAnimation 的构造函数接受六个参数。前两个参数分别代表旋转的起始角度和结束角度。接下来四个参数定义了旋转的中心点,可以相对于动画对象自身( Animation.RELATIVE_TO_SELF )或者相对于父容器( Animation.RELATIVE_TO_PARENT )。如果设置为百分比,则表示动画对象相对于自身的比例。

5.2.2 旋转动画在用户界面设计中的应用

在用户界面(UI)设计中,旋转动画可以用来吸引用户的注意力,或者在进行页面元素的动态加载时,给用户一个平滑的过渡体验。例如,在一个进度条加载完成后,可以使用旋转动画来表现加载的内容已经准备好,吸引用户进行下一步的操作。

另外,旋转动画也可以用于创建动态的logo或者图标效果,当用户进入一个新的界面时,旋转的动画可以给用户一个视觉上的提示,表明正在进入新内容。为了达到最佳用户体验,动画设计应保持简洁明了,避免使用过于复杂或者花哨的动画效果,以免分散用户的注意力。

在实现旋转动画时,开发人员还可以结合动画监听器( AnimationListener )来实现动画的回调,例如监听动画开始、结束、重复等事件,使得动画的执行更加可控。例如:

rotate.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        // 动画开始时的操作
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // 动画结束时的操作
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // 动画重复时的操作
    }
});

以上代码段展示了如何在旋转动画过程中,当动画开始、结束以及重复时进行特定的操作,从而进一步提升动画与用户交互的丰富性。

通过本章节的介绍,我们了解了Rotate动画的核心原理,学习了通过XML和代码实现 Rotate 动画的方法,以及如何将旋转动画应用到实际的UI设计中。通过具体的代码块和解释,我们展示了如何精细控制旋转动画的参数,以及在用户界面设计中如何有效地利用旋转动画来提升用户体验。

6. 动画效果在Activity切换中的高级应用

Activity切换在Android应用中是一个非常常见的操作,合理地运用动画不仅可以提高用户体验,还可以让界面之间的转换更加流畅。本章将探讨如何在Activity切换过程中高级应用动画效果,并提供一些设置动画监听器和优化动画的技巧。

6.1 动画监听器的设置技巧

6.1.1 监听动画开始与结束的方法

为了更好地控制动画流程,我们可以设置监听器来监听动画的开始和结束事件。在Android中,可以通过实现 AnimationListener 接口或使用匿名内部类来实现监听器。以下是一个简单的示例代码,展示如何监听动画的开始与结束事件:

// 动画加载
Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade_in);
// 设置动画监听器
animation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        // 动画开始时的操作
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // 动画结束时的操作,例如进行Activity切换
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // 动画重复时的操作
    }
});
// 触发动画
view.startAnimation(animation);

6.1.2 自定义动画监听器实现反馈功能

在某些情况下,我们可能需要根据动画的状态向用户或其他组件提供反馈。自定义动画监听器可以帮助我们在动画的不同阶段执行特定的逻辑。例如,在动画结束后,我们可以启动一个新的Activity:

AnimationListener customAnimationListener = new AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        // 动画开始时的操作
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // 动画结束后启动新的Activity
        Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
        startActivity(intent);
        overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // 动画重复时的操作
    }
};
animation.setAnimationListener(customAnimationListener);

6.2 动画与Activity切换的集成

6.2.1 动画在Activity切换中的应用策略

在Activity切换中集成动画需要考虑应用策略,以避免出现动画与界面内容不一致的情况。通常,在启动新的Activity时使用启动动画,在关闭当前Activity时使用结束动画。这样可以为用户呈现出平滑的界面过渡效果。在Android中,可以通过 startActivity() finish() 方法配合 overridePendingTransition() 来实现:

// 启动新Activity并应用动画
Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);

6.2.2 利用动画增强用户体验的案例分析

案例:在聊天应用中,当用户点击发送消息时,我们希望消息能够“飞”出去,并且界面能够平滑过渡到消息列表页面。我们可以通过结合缩放和位移动画来实现这一效果,并在动画结束后进行Activity切换。

<!-- res/anim/fly_out.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="300"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0.0"
        android:toYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
    <translate
        android:duration="300"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p"/>
</set>

6.3 复合动画组合与优化

6.3.1 创建复合动画的方法与场景

复合动画是组合多个动画效果而形成的动画。在Android中,可以通过 AnimationSet 来组合多种动画类型,例如 AlphaAnimation RotateAnimation ScaleAnimation TranslateAnimation 。复合动画适用于复杂的交互动画,例如引导页面或用户完成某个动作后的反馈动画。

// 创建一个动画集
AnimationSet animationSet = new AnimationSet(false);
// 添加旋转动画
RotateAnimation rotate = new RotateAnimation(0, 360,
    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
    0.5f);
rotate.setDuration(2000);
animationSet.addAnimation(rotate);
// 添加透明度动画
AlphaAnimation alpha = new AlphaAnimation(1.0f, 0.0f);
alpha.setDuration(1000);
animationSet.addAnimation(alpha);
// 设置动画监听器
animationSet.setAnimationListener(...);
// 应用动画集
view.startAnimation(animationSet);

6.3.2 动画效果的优化技巧与用户体验提升

动画优化的目的在于提升用户体验,减少资源消耗和提高动画性能。以下是一些优化技巧:

  • 降低分辨率 :根据不同的设备屏幕尺寸,适当降低动画资源的分辨率。
  • 避免过度使用动画 :过多的动画效果会使界面显得过于复杂,影响用户体验。
  • 使用帧动画的替代方案 :当需要复杂的动画效果时,可以考虑使用属性动画而不是帧动画,以提高性能。
  • 复用动画资源 :对于多个视图使用的相同动画效果,应该创建一次动画资源,并在不同的视图上复用。
  • 减少视图层级 :动画操作的视图层级越少,动画性能越好。

通过这些技巧,我们可以有效地提升应用的整体性能,同时为用户带来流畅的动画体验。

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

简介:本文深入探讨了在安卓开发中通过源码实现四种基本动画类型:translate(平移)、scale(缩放)、alpha(透明度变化)以及rotate(旋转),并将这些动画应用于Activity切换过程,增强用户界面的流畅性和动态性。文章首先介绍每种动画的效果和创建方法,然后详细说明了如何设置动画监听器、应用动画、组合多个动画,并最终启动动画。这些步骤帮助开发者自定义Activity之间的切换效果,提升应用程序的个性化和用户体验。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值