Android 12上全新的应用启动画面,还不适配一下?

你的Android App又需要适配了:Android 12,全新的App启动动画 由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。[外链图片转存中…(img-DsSXRrQ9-1711079554747)][外链图片转存中…(img-iXY2SNGu-1711079554748)]由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频。 阅读详情
AI摘要

本文详细介绍了Android 12中全新的SplashScreen API,如何通过XML定制启动画面的进入效果,如自定义静态和动画图标、品牌Logo等。此外,还展示了如何通过OnExitAnimationListener定制退出动画,延长启动画面显示时间以及注意事项。最后,提供了相关API和属性的总结,鼓励开发者尝试利用这些新特性为用户打造更具特色和创意的启动体验。

在这里插入图片描述

早期的Android上App的启动速度常为人诟病,如今的启动表现已不逊iOS。Google针对系统的不断优化绝对功不可没,从8.0独立出来的SplashWindow,到12上推出的全新SplashScreen。

在App的主要内容展示之前,按照需求的不同,或多或少会先展示这样几个画面。

画面用途
Splash Screen展示品牌Logo或Slogan
Advertisement Screen展示节日活动或日常广告
Guide Screen演示重点功能,一般只展示一次

启动过程示意图

1 前言

我们常常花费精力去打造引导画面或广告画面,而作为第一印象的启动画面却容易被忽视。回想下以前都是怎么处理这个画面的:

  1. 一般通过设置windowSplashscreenContent属性来展示UI提供的启动图,系统将为它创建专门的Window

  2. 假使忘记设置这个属性的话,默认的白色背景将导致启动过程中会有个白画面一闪而过

  3. 要去掉这个突兀的白画面可不能简单地设置Background为null,不然一闪而过的又会变成黑画面

  4. 最终发现windowDisablePreview属性可以彻底关闭这个画面,这样一来确实没有任何突兀的画面一闪而过了

但这又会带来启动"变慢"的副作用,因为用来过渡的启动画面被关闭之后,App描画前屏幕几乎没有什么变化。即便App性能没有劣化,但为了留住用户,我们还是得好好对待这个启动画面。

然而现有的windowSplashscreenContent可供定制的空间着实有限。也许官方也注意到了这点,便精心设计了Splash Screen API,并在Android 12里重磅推出。

有了这个全新特性的帮助,启动画面的定制将更加自由、方便。先来看下采用SplashScreen API 快速定制的启动效果。

在这里插入图片描述

下面将逐步演示全新SplashScreen可供定制的各个方面。

2 定制进入效果

采用xml即可快速定制各式进入效果。

2.1 默认的启动效果

默认情况下启动画面将展示白色背景和Launcher上的Adaptive Icon,也是不错的,比以前的白画面要好很多。

在这里插入图片描述

2.2 自定义静态Icon

替换Icon为Adaptive Icon的前景图,背景色微调为米黄色。

<item name="android:windowSplashScreenBackground">@color/newSplashScreenColor</item>
<item name="android:windowSplashScreenAnimatableIcon">@drawable/ic_kotlin_hero_new</item>

在这里插入图片描述

2.3 自定义Icon背景

Icon色调和画面背景色的对比不够明显的情况下,可以添加Icon背景色加强辨识度。

<item name=”android:windowSplashScreenIconBackground”>@color/newSplashIconMaskColor</item>

在这里插入图片描述

2.4 自定义品牌Logo

添加品牌Logo可以展示企业形象或Slogan,使得启动画面更为完整和精细。

<item name=”android:windowSplashScreenBrandingImage”>@drawable/ic_tm_brand_newer</item>

在这里插入图片描述

2.5 自定义动画Icon

动画形式的Icon可以增添设计和创意,使得启动流程更加流畅和有趣。

<item name="android:windowSplashScreenAnimatableIcon">@drawable/ic_kotlin_hero_new_animated_rotate</item>
<item name="android:windowSplashScreenAnimationDuration">@integer/icon_animator_duration</item>

比如让机器人图标旋转起来。

在这里插入图片描述

再比如让机器人在Kotlin上侧滑。

在这里插入图片描述

或者让几何图案拼凑出字母K之后和机器人汇合,象征着Android和Kotlin的强强联合。

在这里插入图片描述

注意:

  • 动画Icon的时长上限为1000ms。
  • 图标的进入动画可以定制,但由系统控制,不可以被监听和额外处理。

2.6 延长启动画面

The splash screen is dismissed as soon as your app draws its first frame. If you need to load a small amount of data such as in-app theme settings from a local disk asynchronously, you can use ViewTreeObserver.OnPreDrawListener to suspend the app to draw its first frame.

后台数据的加载难免耗时,启动画面结束了主要内容仍未加载好的话,体验不是太好。能够控制启动画面的持续时时长就好了。

现有的ViewTreeObserver的OnPreDrawListener回调是可以挂起描画的,如果我们在数据准备好之后再放行描画,就可以间接地延长启动画面的显示。

比如Activity初始化2s后才放行描画。

class SplashActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        keepSplashScreenLonger()
    }

    private fun keepSplashScreenLonger() {
        // 监听Content View的描画时机
        val content: View = findViewById(android.R.id.content)
        content.viewTreeObserver.addOnPreDrawListener(
            object : ViewTreeObserver.OnPreDrawListener {
                override fun onPreDraw(): Boolean {
                    // 准备好了描画放行,反之挂起
                    return if (viewModel.isDataReady()) {
                        content.viewTreeObserver.removeOnPreDrawListener(this)
                        true
                    } else {
                        false
                    }
                }
            }
        )
    }
}

class MyViewModel(application: Application): AndroidViewModel(application) {
    companion object {
        const val WORK_DURATION = 2000L
    }
    private val initTime = SystemClock.uptimeMillis()
    fun isDataReady() = SystemClock.uptimeMillis() - initTime > WORK_DURATION
}

看一下效果,发现启动画面的展示时间确实变长了。

在这里插入图片描述

3 定制退出效果

当App的第一帧开始描画,SplashScreen将会退出展示。为了丰富退出环节的体验,系统也开放了相应的入口,即画面退出的回调。在这个回调里可以开始退出效果的定制,包括整体的退出动画和图标的退出动画。

3.1 监听启动画面的退出

向SplashScreen注册OnExitAnimationListener接口即可监听启动画面的退出。

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    customizeSplashScreenExit()
}

private fun customizeSplashScreenExit() {
    splashScreen.setOnExitAnimationListener { splashScreenView ->
        Log.d("Splash", "SplashScreen#onSplashScreenExit view:$splashScreenView")
        sleep(1000)
        Log.d("Splash", "SplashScreen#remove after sleeping")
        splashScreenView.remove()
    }
}

可以看到启动画面展示之后,不作定制的默认情况下就是全屏一下再消失。

在这里插入图片描述

日志如下:

Splash  : Activity:com.example.splash.MainActivity@f70c0d0 Activity:com.example.splash.MainActivity@f70c0d0 onCreate
Splash  : Activity:com.example.splash.MainActivity@f70c0d0 onStart
Splash  : Activity:com.example.splash.MainActivity@f70c0d0 onResume
Splash  : SplashScreen#onSplashScreenExit view:android.window.SplashScreenView{18339d5 V.E...... ........ 0,0-1080,2280}
Splash  : SplashScreen#remove after sleeping

一定记得调用remove及时移除启动画面,否则SplashScreen会长时间盖在主画面上,大概在5s左右。

另外,回调的注册需要放在Activity#onResume前,不然监听不到。

3.2 定制整体的退出动画

可以给启动画面的整体设置TRANSLATE、SCALE、ROTATE、ALPHA等各种动画,使得退出更加自然。

比如给SplashScreen加上一个缩小出屏幕的动画。

private fun customizeSplashScreenExit() {
    splashScreen.setOnExitAnimationListener { splashScreenView ->
        showSplashExitAnimator(splashScreenView)
    }
}

private fun showSplashExitAnimator(splashScreenView: SplashScreenView) {
    val path = Path()
    path.moveTo(1.0f, 1.0f)
    path.lineTo(0f, 0f)
    val scaleOut = ObjectAnimator.ofFloat(
        splashScreenView,
        View.SCALE_X,
        View.SCALE_Y,
        path
    )
    ...
    scaleOut.doOnEnd {
        splashScreenView.remove()
    }
    scaleOut.start()
}

在这里插入图片描述

又或者从上方平移出屏幕的动画。

private fun showSplashExitAnimator(splashScreenView: SplashScreenView) {
    val slideUp = ObjectAnimator.ofFloat(
        splashScreenView,
        View.TRANSLATION_Y,
        0f,
        -splashScreenView.height.toFloat()
    )
    ...
    slideUp.start()
}

在这里插入图片描述

3.3 定制图标的退出动画

当然也可以给图标单独加上动画,比如将Icon上滑。

private fun customizeSplashScreenExit() {
    splashScreen.setOnExitAnimationListener { splashScreenView ->
        showSplashIconExitAnimator(splashScreenView)
    }
}

private fun showSplashIconExitAnimator(splashScreenView: SplashScreenView) {
    val iconView = splashScreenView.iconView ?: return
    val slideUp = ObjectAnimator.ofFloat(
        splashScreenView.iconView,
        View.TRANSLATION_Y,
        0f,
        -iconView.height * 2.toFloat()
    )
    ...
    slideUp.start()
}

在这里插入图片描述

3.4 退出动画的适当时长

针对退出动画的定制官方还有一段补充说明。

By the start of this callback, the animated vector drawable on the splash screen has begun. Depending on the duration of the app launch, the drawable might be in the middle of its animation. Use SplashScreenView.getIconAnimationStart to know when the animation started. You can calculate the remaining duration of the icon animation.

简言之,退出画面回调的时候Icon动画可能进行到了一半,最好计算Icon动画的剩余时长来执行退出动画。

原因在于设备性能会影响App描画的早晚,而第一帧描画的时候上述的退出回调将被执行。也就是说,性能的优劣会影响启动画面退出的回调时机。

  • 性能好的话,画面退出的回调较早。此时Icon动画尚在进行当中,可以将Icon动画的预设时长的剩余时间交接给退出效果来执行
  • 性能差的话,画面退出的回调稍晚。Icon动画早已经结束,为了让用户尽早看到画面内容,就不该再执行退出效果了而是直接退出

不能为了展示效果而让用户久等,否则会弄巧成拙。

借助SplashScreenView的iconAnimationStartMillis和iconAnimationDurationMillis方法可以推算出Icon动画的剩余时长。

*模拟器上运行的缘故,大部分时候我的Demo在启动画面退出的时候Icon动画都结束了,少部分情况下动画还剩余一点时间,可能实机的情况会不一样。

private fun showSplashIconExitAnimator(splashScreenView: SplashScreenView) {
    slideUp.duration = getRemainingDuration(splashScreenView)
    ...
}

fun getRemainingDuration(splashScreenView: SplashScreenView): Long  {
    // 取得Icon动画的时长
    val animationDuration = splashScreenView.iconAnimationDurationMillis
    // 取得Icon动画的开始时刻
    val animationStart = splashScreenView.iconAnimationStartMillis

    // 再结合当前时间计算出Icon动画的剩余时长
    // 1. 时长为负则固定为0ms即直接退出
    // 2. 时长为正则采用该时长执行退出动画
    return if (animationDuration != null && animationStart != null) {
        (animationDuration - SystemClock.uptimeMillis() + animationStart)
        .coerceAtLeast(0L)
    } else {
        0L
    }
}

4 SplashScreen相关API

4.1 类和接口

类/接口作用
SplashScreen启动画面管理接口,通过Activity#getSplashScreen取得
OnExitAnimationListener启动画面退出的回调接口,通过SplashScreen#setOnExitAnimationListener注册
SplashScreenView启动画面包含的视图,用以定制整体或Icon的退出动画

4.2 属性

attr作用备注
splashScreenTheme指定SplashScreen相关的Style存在一点问题比如brand图片会不显示
windowSplashScreenBackground定制启动画面的背景默认从windowBackground里读取
windowSplashScreenBrandingImage指定启动画面底部的品牌图标-
windowSplashScreenAnimatedIcon指定Icon,支持静态或动画Drawable-
windowSplashScreenAnimationDuration指定动画Icon时长上限1000ms
windowSplashScreenIconBackgroundColor补充Icon背景色-

注意:windowSplashscreenContent是8.0版本新增的定制启动画面的属性,自12开始废弃了,使用windowSplashscreenAnimatedIcon替代

4.3 SplashScreen的构成

构成示意图

5 注意

需要尝鲜SplashScreen的话,需要在Android 12上开发,并做如下必要配置。

  • compileSdkVersion和targetSdkVersion声明为S

  • android:exported="true",明示声明启动画面的可见性,否则会安装失败

另外启动页的Icon无论是静态的还是动画效果的,都应遵循Adaptive Icon的规范,不然Icon会发生变形。

6 结语

Android 12上全新的SplashScreen API非常简单清晰,整个定制过程非常流畅!

相信在全新的API加持下,APP的启动画面可以迸发出更多特色的、好玩的创意。

快快尝试起来,给你的用户留下第一眼的好印象~

本文DEMO

https://github.com/ellisonchan/SplashScreen

参考资料

欢迎体验 | Android 12 开发者预览版 3

SplashScreen的官方文档

SplashScreen API

SplashScreen相关attr

推荐阅读

全面复盘Android开发者容易忽视的Backup功能

Jetpack Hilt有哪些改善又有哪些限制?

Dagger2和它在SystemUI上的应用

Android 12之启动画面Splash Screens(一) -- 适配 通过// 需要在动画结束后移除SplashScreenView slideUpAnimator . addListener(new AnimatorListenerAdapter() {} });});更多请参考自定义用于关闭启动画面的动画如果想保留原启动画面Activity(),原逻辑保持为主入口,在启动画面结束后显示的内容。Google建议完全移除自定义启动画面Activity。 阅读详情

相关推荐

Android将启动画面实现迁移到 Android 12 及更高版本

迁移到适用于 Android 12 及更高版本的启动画面后,请决定如何处理之前的自定义启动画面Activity。保留自定义 activity,但不让它显示。出于品牌推广原因保留自定义 activity。移除自定义 activity,然后根据需要来调整应用。如果旧启动画面Activity主要用于路由,请考虑移除它的方法。例如,可以直接链接到 activity 或移至具有子组件的单个 activity。如果 可行,可以使用将路由 activity 保留到位,但使其停止渲染。

安卓开发&音视频开发 1199

全面适配 Android12

以上内容为流利说各 APP 适配 Android12 改动范围。Android12 本身改变内容还有很多,比如定位精度、应用休眠、前台服务、蓝牙权限等等。2022年8月 Android13 正式版发布,更细化的权限和更多后台运行限制, 总体上感觉 Google 花了很大精力在提升 Android 安全性(当然还有稳定性),作为开发者很高兴看到 Android 生态越来越健康, 流利说作为保护用户隐私典范企业一直积极响应政策走在规范行业前沿,为我们的用户提供安全可靠的服务。

Androiddddd的博客 2109

Android 12 启动画面-SplashScreen

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

2401_84132423的博客 1281

Android 12 保姆级适配指南

之前还推动过一篇,欢迎一起查阅。 分享一下适配 Android 12 遇到的坑 近期,Google Play向所有的应用开发者发送了一封邮件,邮件中明确了应用将目标API级别更新为Android 12的最后期限。 这表示,Android 12的适配工作不得不提上日程了。 本着将改动最小化的原则,建议在开始适配之前,可以将此次需要适配的一系列行为变更,按照对自身项目的影响程度,先进行优先级划分,并依据此优先级去分批、逐步完成适配工作。 该如何进行划分呢?可能具体到每个人的项目情况都有

chuyouyinghe的专栏 1977

Android 12 应用兼容性适配指导

Android 12 应用兼容性适配指导 一、兼容性调试工具 Android 11开始引入了新的工具,可针对Android新平台中的行为变更进行测试和调试。这些工具是兼容性框架的一部分,该框架使得开发者可通过开发者选项或adb命令单独打开和关闭各项变更。藉此,可在最新android预览版中测试我们的app受到新平台及target api调整的影响,完成app对新平台的兼容适配。 使用adb命令打开或关闭变更,请运行以下命令之一: adb shell am compat enable (C..

irizhao的专栏 2万+

Android 12之启动画面Splash Screens(二) -- framework原理

本篇介绍Splash Screens的framework层原理。

分享技术与经验的博客 6521

Android 12 上全新的应用启动画面,适配一下?| 开发者说·DTalk

本文原作者:小虾米君,原文发布于: TechMerger。早期的 Android 上 App 的启动速度常为人诟病,如今的启动表现已不逊 iOS。Google 针对系统的不断优化绝对功不...

Android开发者 1763

Android 12 启动画面-SplashScreen(1),安卓未来路在何方

???? 画面底部的图片(尺寸比例需要为 2.5:1,谷歌不推荐用) 效果图: 这里使用的尺寸是500:200。 代码如下: ???? 最终效果 效果: 代码如下: ???? 让其在屏幕上显示更长时间 启动画面最长1000毫秒。如果你的广告页需要更多时间来加载数据,谷歌也提供了让其显示更长时间的方法,咱们一起来试试。 效果: 跟上面对比明显发现时间延长了不少。 代码如下: public class AdvertiseActivity extends A

m0_66144992的博客 800

Android 12上全新的应用启动API,适配一下?

/ 今日科技快讯 /近日,谷歌宣布,将在欧洲市场上销售的Android手机中免费添加更多移动搜索应用,欧洲Android用户可以通过全新的“搜索引擎选项”来选择并设置自己设备上的默...

郭霖 1203

Android设置应用启动动画

首先,我们需要在res目录下创建一个名为"anim"的文件夹,用于存放我们的动画资源文件。在该文件夹中,我们可以创建一个XML文件来定义启动动画的动画效果。在Android应用开发中,为应用程序添加启动动画可以提升用户体验和应用的吸引力。当用户启动应用程序时,将会显示定义的启动动画,并在动画结束后跳转到主Activity。接下来,在我们的应用程序的启动Activity中,我们需要加载并显示这个启动动画。,我们可以实现应用程序在启动时逐渐放大的效果。,我们可以实现应用程序在启动时逐渐淡出的效果。

KkvlCapture的博客 588

Android实现App启动动画 (附完整源码)

Android实现App启动动画 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 676

适配Android 12 新APP启动画面(SplashScreen)的一点分享

适配Android 12 新APP启动画面(SplashScreen)的一点分享

Roy1986613的博客 4905

别再乱点U盘里的.exe了!手把手教你清除‘Usb Disk.exe’病毒并恢复隐藏文件

本文详细介绍了如何识别和清除U盘病毒(如Usb Disk.exe),并提供从终止病毒进程到恢复隐藏文件的完整步骤。通过禁用自动播放、清理注册表和使用命令行工具,帮助用户彻底清除病毒并预防未来感染,确保数据安全。

weixin_42530732的博客 586

ImmersionBar适配Android 12 SplashScreen:启动画面沉浸式处理

你是否在Android 12及以上设备上遇到过启动画面(Splash Screen)与状态栏/导航栏样式不一致的问题?本文将带你使用ImmersionBar库解决这一痛点,实现从系统启动画面到应用界面的无缝沉浸式过渡。 ## 问题分析:Android 12启动画面的新挑战 Android 12(API 31)引入了系统级[SplashScreen](https://developer.andr...

gitblog_01148的博客 975

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2935

STM32与SD卡SPI接口硬件设计:从原理图到调试的完整指南

SPI(串行外设接口)作为一种广泛应用的同步串行通信协议,以其接线简单、驱动成熟的特点,成为连接微控制器与各类外设的经典方案。其工作原理基于主从架构,通过时钟、数据线和片选信号实现全双工通信,在嵌入式系统中具有极高的技术价值,常用于连接传感器、存储设备和显示模块等。在数据存储场景中,SD卡凭借其大容量和便携性成为首选,而通过SPI模式驱动SD卡,则平衡了性能与设计复杂度。本文聚焦于使用Altium Designer进行硬件设计的工程实践,详细解析了STM32微控制器与SD卡通过SPI通信时,电源管理、上拉电

weixin_34101784的博客 554

Android 12 变更及适配攻略

从 Android 12 开始, API 可为所有Android 12或更高版本的设备上运行的应用启用新的应用启动动画。

唯鹿的博客 7640

使用Xpath语法爬取豆瓣读书Top250

使用Xpath语法爬取豆瓣读书Top250 使用的软件是Spyder 网页地址:https://book.douban.com/top250?start=0 直接上代码: # -*- coding: utf-8 -*- """ Created on Thu Apr 30 18:35:17 2020 @author: ASUS """ import requests import csv fr...

weixin_43987253的博客 2081

Android 12 启动画面-SplashScreen(1)

关于应用启动模式可以参考:Android 性能优化之启动优化。🔥 动画的元素和机制===========动画的元素由 Android 清单中的 XML 资源文件定义。每个元素都有浅色模式和深色模式版本。它们由窗口背景、动画形式的应用图标和图标背景组成:关于这些元素,请注意以下几点:应用图标 (1) 应该是矢量可绘制对象,它可以是静态或动画形式。不超过 1000 毫秒。默认情况下,使用启动图标。图标背景 (2) 是可选的,在图标与窗口背景之间需要更高的对比度时很有用。如果您使用一个自适应图标,当该图标与窗口

2401_84132401的博客 1601

【多模态实验总结】整理了几十篇文章,理清 多模态目标检测 在写论文中需要做哪些实验

此篇文章中将多模态目标检测所做的实验,分成了各个类别,目的是为了对多模态的实验有一个清晰的理解。可以看到,很多表格中放的并不是做了单一的某一个对比,而是将提出的模型,在不同的骨干、数据集上的效果与基线进行对比,使内容更全面。因此这里提到的各种实验,大家在后续改进写论文过程中可以根据自己的论文内容进行整合。对于这里提到的这些文章,大家都可以看看,我只是按照我这里的分类截取了部分实验,这里提到的所有实验在每篇文章中也基本能看到相应的实验。

Limiiiing的博客 3138

Unity如何实现数字人口型同步

SALSA LipSync v2是一款实时唇音同步系统,无需音素映射即可根据音频自动生成口型动画。系统提供三大核心功能:基于音频波形分析的智能口型同步、EmoteR表情随机化工具以及Eyes眼睛/头部追踪系统。配置流程简单快捷,只需导入模型后通过一键配置完成基础设置,再添加A/E/I/O/U等基本口型混合变形即可实现基础功能。进阶功能支持表情池管理(手动/随机/强调/重复触发)和眼部动作配置(骨骼旋转或混合变形)。系统支持三种输入方式:本地音频文件分析、麦克风实时输入和文本转语音,为数字人角色提供完整的表情

TxNet 759
上一篇: Android Backup功能之全面实战
下一篇: Android 12上焕然一新的小组件:美观、便捷和实用
TechMerger
博客等级 码龄15年 963粉丝 105原创
评论 37
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechMerger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值