使用路径动画完成一个简洁优雅的启动页动画

UniApp离线打包实战:彻底移除启动页加载图标与雪花效果的终极方案 本文详细介绍了UniApp离线打包时彻底移除启动页加载图标与雪花效果的终极方案。通过分析安卓和iOS平台的底层实现机制,提供修改原生资源文件、禁用加载动画以及自定义启动页等多种解决方案,帮助开发者实现更纯净的启动页效果。特别适合需要高度定制启动页面的UniApp项目。 阅读详情

是不是受够了千篇一律的透明度变化的启动页动画,快来试试使用路径动画和属性动画构建一个特别的启动页动画吧.

最近在网上看到一个路径动画的例子,感觉效果很不错,仿照着例子写了一个路径动画的库,并且上传到jcenter,方便AS玩家通过依赖使用.
github地址:https://github.com/sunflowerseat/PathAnim
先上效果图,让图说话:
这里写图片描述
接下来,我讲讲怎么通过这个路径动画库来完成一个简洁优雅的启动页动画
首先在module中添加依赖

compile 'com.fancy.library:pathanim:1.0.1'

首先要完成路径动画,我们必须要先有一个路径.
可以使用GIMP 2这个工具来获取一个路径
这里写图片描述

导出路径:
这里写图片描述

得到一个路径之后,我们开始写布局文件
简单写一个logo背景,启动页显示的文字和一个版本号
布局文件参考:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:oak="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:id="@+id/big_background"
        >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/cpb_background"
        android:id="@+id/rl_background"
        android:layout_centerInParent="true"
        >
        <com.fancy.path_anim_lib.AnimatedSvgView
            android:id="@+id/animated_svg_view"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_centerInParent="true"
            oak:oakSvgFillStart="500"
            oak:oakSvgFillTime="100"
            oak:oakSvgImageSizeX="200"
            oak:oakSvgImageSizeY="200"
            oak:oakSvgTraceTime="2000"
            oak:oakSvgTraceTimePerGlyph="1000" />

    </RelativeLayout>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动页动画"
        android:textSize="30sp"
        android:layout_below="@+id/rl_background"
        android:textStyle="bold"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:textColor="@color/startpage_blue"
        android:id="@+id/name"
        />

    </RelativeLayout>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="8.1.3"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="10dp"
        android:textSize="20sp"
        android:textColor="@color/startpage_blue"
        android:id="@+id/versionCode"
        />
</RelativeLayout>

解释一下AnimatedSvgView中一些重要参数的作用:
oakSvgFillTime路径动画填充时间
oakSvgImageSizeX 原图x所占像素
oakSvgImageSizeY 原图y所占像素
oakSvgTraceTimePerGlyph 路径绘制时间

Activity完成动画参考:

public class MainActivity extends AppCompatActivity {

    private AnimatedSvgView mAnimatedSvgView;
    private RelativeLayout rl_background;
    private RelativeLayout big_background;
    private TextView versionCode;
    private TextView name;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_svg);
        //路径动画的View
        mAnimatedSvgView = (AnimatedSvgView) findViewById(R.id.animated_svg_view);
        //需要整体上移的RelativeLayout
        rl_background = (RelativeLayout) findViewById(R.id.rl_background);
        //需要变换形状的RelativeLayout
        big_background = (RelativeLayout) findViewById(R.id.big_background);
        //版本号文字
        versionCode = (TextView) findViewById(R.id.versionCode);
        versionCode.setAlpha(0);
        //logo下方文字
        name = (TextView) findViewById(R.id.name);
        name.setAlpha(0);
        preAnim(rl_background);
        mAnimatedSvgView.getLayoutParams().width = getScreenWidth(this) / 2;
        mAnimatedSvgView.getLayoutParams().height = getScreenWidth(this) / 2;


        //路径传入,把GIMP2工具导出的path部分作为String传递给该方法.
        mAnimatedSvgView.setGlyphStrings(AnimPath.ANIM_PATH);
        //Path填充颜色
        mAnimatedSvgView.setFillPaints(255,255,255,255);
        //设置跑动光线的颜色
        mAnimatedSvgView.setTraceColors(255,255,255,255);
        //设置轮廓颜色
        mAnimatedSvgView.setTraceResidueColors(255,255,255,255);

        mAnimatedSvgView.setOnStateChangeListener(new AnimatedSvgView.OnStateChangeListener() {
            @Override
            public void onStateChange(int state) {
                if (state == AnimatedSvgView.STATE_FILL_STARTED) {

                    AnimatorSet set = new AnimatorSet();
                    Interpolator interpolator = new DecelerateInterpolator();
                    ObjectAnimator a1 = ObjectAnimator.ofFloat(mAnimatedSvgView, "translationY", 0);
                    a1.setInterpolator(interpolator);
                    set.playTogether(a1);
                    set.start();
                }
            }
        });
    }

    public void preAnim(final View v) {
        GradientDrawable drawable = (GradientDrawable) v.getBackground();
        drawable.setCornerRadius(0);
        ObjectAnimator anim = ObjectAnimator.ofFloat(v, "scaleX", new float[]{1f,1f});
        anim.setDuration(1);
        anim.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                start(v,700);
            }
        });
        anim.start();
    }

    public void endAnim() {
        AnimatorSet set = new AnimatorSet();
        ObjectAnimator a2 = ObjectAnimator.ofFloat(big_background, "y", big_background.getY(),big_background.getY()/8);
        ObjectAnimator a3 = ObjectAnimator.ofFloat(versionCode, "alpha", 0f,1f);
        ObjectAnimator a4 = ObjectAnimator.ofFloat(name, "alpha", 0f,1f);
        set.playTogether(a2, a3, a4);
        set.setDuration(700);
        set.start();
        mAnimatedSvgView.start();
    }

    /**
     * 矩形变圆角动画
     */
    public void start(final View v,long duration) {
        //需要的参数 drawable对象
        ObjectAnimator cornerAnimation = ObjectAnimator.ofFloat(v.getBackground(), "cornerRadius", new float[]{0, v.getWidth() / 2});
        cornerAnimation.setDuration(duration);
        final ObjectAnimator heightAnimation = ObjectAnimator.ofInt(v, "xxx", new int[]{v.getHeight(), v.getWidth() / 2});
        heightAnimation.setDuration(duration);
        heightAnimation.addUpdateListener(new com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(com.nineoldandroids.animation.ValueAnimator valueAnimator) {
                v.getLayoutParams().height = (int) heightAnimation.getAnimatedValue();
                v.requestLayout();
            }
        });
        ObjectAnimator animator = ObjectAnimator.ofInt(v, "xx", v.getWidth(), v.getWidth() / 2).setDuration(duration);
        animator.addUpdateListener(new ObjectAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(com.nineoldandroids.animation.ValueAnimator valueAnimator) {
                int value = (int) valueAnimator.getAnimatedValue();
                v.getLayoutParams().width = value;
                v.requestLayout();
            }
        });

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.play(cornerAnimation).with(heightAnimation).with(animator);
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                endAnim();
            }
        });
        animatorSet.start();
    }

    public int getScreenWidth(Context context) {
        WindowManager manager = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        Display display = manager.getDefaultDisplay();
        return display.getWidth();
    }
}

好了,经过以上步骤就能完成一个简洁大方的启动页动画了.
最后有几点补充:
关于demo中的矩形变圆的属性动画,需要启动该动画的view背景必须是drawable文件,如下形式:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="0dp" />
    <solid android:color="@color/startpage_blue"/>
</shape>

否则在使用启动属性动画是会报错,当然你也可以不使用这个属性动画,用自己的动画替代.

源码已上传到github

快动手写一个属于你的独特的启动页动画吧.
有任何问题欢迎加群讨论:283272067
希望大家多聊技术,多分享代码.

Android启动页适配避坑指南:从windowBackground到SplashScreen API的演进与实战 本文详细解析Android启动页适配方案,从传统的windowBackground方法到Android 12 SplashScreen API的演进。重点介绍了如何避免厂商ROM兼容性问题,优化启动体验,并通过实战代码展示windowSplashScreenAnimatedIcon等核心配置的使用技巧,帮助开发者实现无缝过渡的启动效果。 阅读详情

相关推荐

Android APP应用启动页白屏(StartingWindow)优化

前言 StartingWindow 的处理方式: 使用系统默认的 StartingWindow :用户点了应用图标启动应用,马上弹出系统默认的 StartingWindow(就是做动画的那个 Window) ,等应用加载好第一帧之后,StartingWindow 消失,显示应用第一帧,无缝衔接,体验还不错,这也是通常大部分 Android 应用的场景;比如大部分 Android 系统的自带应用...

weixin_43887839的博客 945

前端SVG实现各式图片和动画

SVG介绍 SVG(Scable vector Graphics 可缩放矢量图形), 是一种使用XML来描述2D图形的语言; 因为是基于XML,那么svg DOM中的每一个元素都可以,绑定上javascript事件处理器; 在svg中每一个绘制的图形都被视为对象,svg元素的属性发生变化那么浏览器也会重新渲染图形的。 注意: 1、SVG并不属于html5专有内容,在html5之前就有SVG。 2、SVG文件的扩展名是".svg"。 3、SVG绘制的图像在图片质量不下降的情况下被放大。 4、SVG

m0_37820751的博客 5455

Android 12+启动页适配踩坑实录:SplashScreen API与传统方案的无缝衔接指南

本文深入解析Android 12+启动页适配中的兼容性问题,重点介绍如何无缝衔接SplashScreen API与传统方案。通过对比新旧启动机制的差异,提供视觉一致性保障、动画过渡处理及性能优化方案,帮助开发者避免常见陷阱,实现流畅的用户体验。特别针对Android 12的SplashScreen API进行了详细的技术指导。

weixin_29284885的博客 425

前端svg路径path指令动画(一)

一、svg 的 path 介绍 1.1 path元素的形状是通过属性d来定义的,属性d的值是一个命令+参数的序列。 1.2 path 指令 M = moveto(M X,Y) : 将画笔移动到指定的坐标位置 L = lineto(L X,Y) :画直线到指定的坐标位置 H = horizontal lineto(H X):画水平线到指定的X坐标位置 V = vertical lineto(V Y...

RIDER_hjf的博客 1730

别再搞混了!UniApp启动页、引导页、闪屏页到底有啥区别?附实战配置避坑

本文详细解析了UniApp中启动页、引导页和闪屏页的核心区别与配置方法,帮助开发者避免常见误区。通过实战示例和优化技巧,指导如何精准配置这三种页面以提升应用启动体验,特别适合uniapp开发者参考。

weixin_33743661的博客 557

CocosCreator H5游戏启动页优化实战:从默认进度条到个性化品牌体验

在Web前端开发与H5游戏开发中,加载体验是影响用户留存的关键环节。其核心原理在于通过视觉反馈管理用户等待预期,技术价值体现在降低启动阶段流失率、强化品牌认知。通常,开发者会利用进度条可视化、交互反馈等技术手段优化感知性能。对于使用CocosCreator引擎的H5游戏,默认启动页往往缺乏个性,无法满足品牌展示与氛围营造的需求。本文聚焦于通过覆盖默认加载流程与DOM结构,实现高定制化的启动页,有效融入品牌元素与平滑进度反馈,从而提升整体用户体验与留存数据。

weixin_34235457的博客 331

SVG/CSS路径动画

路径动画路径动画路径动画路径动画路径动画路径动画

qq_38946996的博客 1123

前端SVG路径指令动画

总结一下,我们通过使用SVG路径指令和CSS动画属性,实现了前端SVG路径指令动画。的值,我们可以实现路径的动态变化。在0%和100%时,路径指令的值与初始路径相同,而在50%时,我们修改了路径,使其形状发生变化。你可以尝试使用其他路径指令,如曲线指令(C、Q、S、T)或椭圆指令(A),来创建更加复杂的路径动画。在上面的代码中,我们创建了一个400x400像素大小的SVG元素,并添加了一个路径元素。首先,让我们创建一个基本的SVG元素,并添加一个路径元素,该路径元素将作为我们动画的目标。

DgboSql的博客 328

应用启动页工程化实践:从性能优化到用户体验的完整解决方案

在Web与移动应用开发中,首屏加载性能与用户体验是衡量产品品质的关键指标。其核心原理在于优化关键渲染路径,通过资源内联、异步加载和硬件加速等技术手段,显著提升应用的启动速度与视觉流畅度。这项技术的工程价值在于,它将直接影响用户的留存率与产品口碑,是构建专业形象的第一道门槛。典型的应用场景包括单页应用(SPA)、渐进式Web应用(PWA)以及各类移动端Hybrid应用,需要在不同网络条件与设备环境下确保稳定、快速的初始呈现。本文聚焦于应用启动页这一具体载体,深入探讨如何通过组件化、状态管理与响应式设计等工程化

weixin_30945039的博客 729

ios-自定义启动页面(带动画).zip

自定义启动页,带动画的,使用方法见简书 简书地址:https://www.jianshu.com/p/769e2d909bc3

维纳滤波和卡尔曼滤波

本文的主要内容是维纳滤波和卡尔曼滤波的介绍,包含匹配滤波器、维纳滤波器、维纳预测、卡尔曼滤波等内容。

西岸贤 9520

5个惊艳的iOS动画效果:从入门到精通的终极指南

在移动应用开发中,优雅的UI动画是提升用户体验的关键因素。今天我们将深入探索一个专注于iOS动画的开源项目,它汇集了多个精美的动画效果实现,为开发者提供了丰富的参考和学习资源。这些动画不仅视觉上令人愉悦,更重要的是它们展示了如何通过代码实现流畅的用户交互体验。 ## 🔥 曲线下拉刷新动画 curverAnim_2.gif展示了独特的曲线下拉刷新效果,这种动画通过自定义的曲线路径和贝塞尔曲线计

gitblog_00367的博客 618

基于cat12和SPM12进行VBM&SBM数据分析笔记1——数据预处理

基于cat12数据分析基础教程笔记 今年是小编步入研究生生活的第一年,研究方向待定,但主要以磁共振成像为主,以后会不断地总结这方面的知识,涉及MRI扫描,数据分析基础方法理论,软件操作教程,文献阅读笔记总结等等,用来记录我的研究生三年学习过程。编写尽量简洁明了,通俗易懂,本就是小白,也能体会小白的痛。不过这也要谢谢一个人手动@小白(网名),是他教我要把自己所学的写下来,讲出来才能真正的做到输入和输出,查漏补缺。而cat12软件操作是我面临的第一个数据分析的训练,写的可能也不会非常到位,还望各位专业人士指出改

Sophia2023的博客 4万+

推荐文章:探索动画SVG路径绘制的神器 —— TGDrawSvgPathView

推荐文章:探索动画SVG路径绘制的神器 —— TGDrawSvgPathView 在数字界面设计的世界里,生动的动画效果总能为应用增添无限魅力。今天,我们来一起揭开一个针对iOS平台的开源宝藏——TGDrawSvgPathView的神秘面纱,它是开发者实现SVG文件动态路径绘制的强大助手。 项目介绍 TGDrawSvgPathView是一个简洁高效的Objective-C类库,专为iOS开发者设计...

gitblog_00284的博客 911

【智能制造】- APS系列|05 APS 排产的五大底层算法逻辑

很多人误以为APS只是给生产工单排先后顺序,实则整套系统依托成熟算法体系,完成多维度约束下的最优生产决策在制造业数字化排产普及的当下,依旧有不少制造管理者对APS存在认知误区,将其等同于简易工单排序工具。事实上,专业级高级计划与排程系统,早已脱离单纯按时间排序的基础功能,而是依托一整套成熟完善的底层算法逻辑,整合现场各类生产限制条件,在海量变量中自动推演、筛选、输出最贴合企业经营目标的生产方案。

qq_40821260的博客 435

渗透测试自学日志之漏洞复现篇:漏洞列表

复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关

maverickpig的博客 2175

HagiCode 启动页设计:React 19 应用中填补 Hydration 空白期的极致体验

HagiCode启动体验设计:12种风格填补加载空白 本文介绍了为HagiCode项目设计的12种启动风格系统,用于填补React应用下载和Hydration过程中的用户等待时间。系统采用HTML/CSS/JS内联实现,遵循零依赖原则,包含极简主义、骨架屏拟态、抽象艺术等六大类风格。文章详细阐述了技术架构设计(Shell & Injector模式)、12种具体风格的实现思路,以及防御式CSS、优雅过渡、字体预加载等关键实践。这些启动风格不仅提升了用户体验,还能通过性能监控量化其效果,使产品在加载间隙

newbe36524 715

爆肝5万字❤️Open3D 点云数据处理基础(Python版)

本文为Open3D 点云数据处理基础教程(Python版),小白也能轻松上手!还等什么呢,学起来!

孙悟空 13万+

探索时间的美学:GAHonorClock,一款优雅的开源动画时钟项目

探索时间的美学:GAHonorClock,一款优雅的开源动画时钟项目 在数字世界中寻找艺术与技术的交汇点,我们不期而遇了【GAHonorClock】——一个以创新为灵魂的开源项目,旨在将时间的流转化作一场视觉盛宴。通过三种截然不同的实现方式,该项目展示了如何将普通的时间显示转化为令人瞩目的动画时钟。 项目介绍 GAHonorClock是由GAStudio精心打造的一款开源项目,其核心魅力在于实现了...

gitblog_00023的博客 435

推荐11个顶级的Claude Code Skills

ClaudeCode的Skills系统为程序员提供了11个强大的AI辅助工具,包括代码审查、重构建议、单元测试生成、API文档自动生成、性能分析、安全扫描、数据库迁移脚本生成、CI/CD配置、依赖管理、ER图生成和日志分析等功能。这些"技能包"可大幅提升开发效率,从代码质量到协作沟通全方位优化工作流程。用户可根据需求选择2-3个核心功能开始尝试,熟练后还可自定义Skills。该系统需要配合Anthropic的API使用,建议先在小型项目测试再应用于核心业务。

分享AI、区块链技术及应用,未来已来 1853

全网唯一OpenCyphal/UAVCAN教程(8)libcanard介绍

当Cyphal里,这个结构体代表一条完整的Cyphal消息,之后我们会根据metadata里提供的元信息,其实就是消息ID,调用对应的反序列化函数,将payload还原成具体的Cyphal消息。用于构造一个新的发送队列,原则上一个can物理接口需要分配一个发送队列,如果它们的MTU大小一致,是可以共用一条的。这个库不包含IO层,是平台无关的,意义是没有实现具体的数据收发,仅提供将发送出去的Cyphal消息转成can帧,以及将收到的can帧转成Cyphal消息。返回值是这条消息拆解成的can帧的数目。....

二进制君 2407

HarmonyOS Next 优雅的路由跳转方案 ZRouter

ZRouter 是一款轻量级且非侵入性的鸿蒙动态路由框架,基于 Navigation 封装,广泛应用于鸿蒙生态中。它具有简单易用、支持链式调用、页面模板化、自定义拦截器、服务路由、生命周期管理、跨页面参数传递、自定义 URL 跳转、多种转场动画等特性,并能与现有项目无缝融合。ZRouter 的快速上手步骤包括配置插件、安装库、初始化、设置根容器、修饰页面等。它还支持启动页流程,通过 Index.ets 作为根容器,Splash 页面展示后跳转至业务首页。ZRouter 提供了灵活的路由管理方案,适用于复杂的

不懂先生的博客 1218

YOLOv10改进,YOLOv10二次创新C2f结构采用WTConv卷积(感受野的小波卷积),ECCV 2024

WTConv 的核心思想是通过结合卷积神经网络(CNN)的强大特征提取能力与小波变换的多尺度特性,来实现大感受野的卷积操作,同时避免传统大卷积核带来的参数爆炸问题。传统的卷积操作通过滑动小窗口在图像上逐步执行局部特征提取,感受野的大小直接取决于卷积核的尺寸。随着卷积核的增大,参数量呈指数增长,导致网络训练效率降低、计算资源消耗增加。为解决这些问题,WTConv 提出了在小波域中执行卷积操作的策略。小波变换是一种常用于信号处理的技术,能够将信号分解为不同频率成分。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1024

Unity WebGL启动页深度定制:从原理到实战的完整指南

WebGL作为将高性能图形应用部署到浏览器的关键技术,其加载流程与用户体验优化是前端工程实践中的重要环节。在Unity引擎的WebGL构建中,默认启动页往往无法满足品牌化与个性化需求,这需要开发者深入理解其底层加载机制。通过分析Unity WebGL的模板系统与加载流程,我们可以掌握拦截并接管进度显示的核心原理,实现从被动等待到主动品牌沟通的技术升级。这种定制不仅涉及前端三件套(HTML、CSS、JavaScript)与Unity运行时的通信,更涵盖了加载状态管理、资源预加载等工程实践。本文聚焦于【启动页定

weixin_33910460的博客 387

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

动态SVG动画终极指南:三分钟让你的Android应用炫酷起来!

还在为应用的启动界面平淡无奇而烦恼吗?AnimatedSvgView为你带来革命性的矢量图形动态绘制方案,只需简单几步就能将静态SVG图标转化为令人惊艳的动画效果。这个专为Android设计的开源库,让每一位开发者都能轻松打造专业级的视觉体验。 [![动态SVG动画演示](https://raw.gitcode.com/gh_mirrors/an/AnimatedSvgView/raw/a917

gitblog_01020的博客 697

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Cocos Creator Android自定义启动页实现:告别黑屏,提升游戏启动体验

在Android应用开发中,启动优化是提升用户体验的关键环节。应用启动时,从系统加载Activity到渲染引擎初始化完成之间,常会出现短暂的黑屏或白屏,这被称为启动“真空期”。其核心原理在于系统默认窗口背景的显示与引擎初始化耗时之间的窗口期。为了解决这一问题,开发者可以通过自定义启动页技术,在引擎就绪前瞬间展示品牌视觉,从而在感知上大幅缩短启动耗时,提升应用的专业度与第一印象。这一技术对于游戏和应用开发尤为重要,能有效降低用户流失率。在Cocos Creator引擎的Android原生平台开发中,通过动态添

weixin_33888907的博客 401
上一篇: 使用友盟统计解决程序中的bug
下一篇: 使用FindBugs-IDEA插件找到代码中潜在的问题
浅浅清风
博客等级 码龄12年 42粉丝 31原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值