巧用RecyclerView ItemDecoration 实现炫酷视差效果

CollapsingToolbarLayout 深度解析:滚动协同机制与实战避坑指南 CollapsingToolbarLayout 并非简单的折叠工具栏,而是 Android CoordinatorLayout 生态中实现滚动协同的核心组件。其本质是 AppBarLayout 与 CoordinatorLayout 共同构建的滚动状态翻译器,通过 Behavior 调度链路将用户滑动位移转化为 Toolbar 高度、标题缩放、状态栏渐变等连续视觉参数。理解其依赖的嵌套滚动协议(NestedScrollingChild)、app:layout_scrollFlags 位掩码逻辑、以及 col 阅读详情

目录

概述

分析

实现


概述

最近项目又开始大刀阔斧的改版迭代,PM也再次开始了其疯狂CX大法。不过对此早已习以为常了,毕竟我们也曾经看懂过这么一本书《RR is PM》。哈哈,有点扯远了,回归正题,先来看看这次要实现的交互效果(CX目标):

简单描述下,界面就是一个横向列表,滑动的时候,背景图跟着一起滑动,并且附带视差效果,随着滑动距离增加,背景图一直在循环展示。看到这种效果,列表方案肯定是首选RecyclerView,接着看这背景视差效果,首先想到的就是通过绘制background的方式实现。大家都知道,RecyclerView有这么一个内部类ItemDecoration,可以提供绘制前景,背景,Item分割线能力,所以我们可以通过构建一个ItemDecoration来绘制我们的背景。

分析

通过滑动RecyclerView仔细观察背景的内容,发现它是在一直循环展示的,因此猜测背景应该是一系列的图片横向并排拼凑成一个长图。为了验证我们的猜想,把对方的apk解压,找到对应的资源文件。果然证实了之前的猜想,背景长图是一系列的同尺寸图片拼接而成。

到此,我们基本上可以确定目标方案:

  1. 自定义一个ItemDecoration,传入一个背景图片集合
  2. 在ItemDecoration的onDraw方法中,计算出当前RecyclerView的滑动距离
  3. 根据RecyclerView的滑动距离和parallax视差系数,计算出当前背景的滑动距离
  4. 根据背景的滑动距离换算成坐标,绘制到RecyclerView的Canvas上
  5. 需要特别处理循环绘制逻辑,以及只绘制当前屏幕可见数量的图片

首先看下下面这张图:

上面这部分,屏幕完全可见的背景图片数量为3,当bg3的右边距与screen的右边距相差1px时,说明bg4有1px的内容显示在屏幕上,所以当前屏幕最大可见图片数量为4。

再来看看下面这部分,假设上面那张图bg3的右边距与screen的右边距相差2px时,并且在滑动过程中出现下面这张图的场景,也就bg2的左边距和scrren的左边距,bg4的右边距和screen的右边距都相差1px时,说明当前屏幕完全可见图片数量为3,但是最大可见数量为5。

因此,我们可以得出以下结论:

<ParallaxDecoration.kt>
...
// 完全可见的图片数量 = 屏幕宽度 / 单张图片宽度
val allInScreen = screenWidth / bitmapWidth
// 当前展示完完全可见图片数量后,距离屏幕边缘的剩余像素空间
val outOfScreenOffset = screenWidth % bitmapWidth
// 如果剩余像素 > 1px,说明会出现上面图2的场景
val outOfScreen = outOfScreenOffset > 1
// 因此得出最大可见数 = 屏幕剩余像素>1px ? 完全可见数+2 : 完全可见数+1
val maxVisibleCount = if (outOfScreen) allInScreen + 2 else allInScreen + 1

这样我们就知道在滑动过程中,我们需要在onDraw方法中绘制多少张图片了。

下一步,我们需要找到绘制的起点。

因为RecyclerView是可滑动的,所以屏幕内第一张可见的图片肯定不是固定的,我们只要找到当前可见的第一张图片在我们初始化背景图集合中的索引,我们就可以根据上面计算出来的需要绘制的图片数量,按顺序绘制出来就行了。

同样,先来看一张图:

实现

1. 我们暂时不考虑视差系数,获取到当前RecyclerView的滑动距离:

<ParallaxDecoration.kt>
...
// 当前recyclerView的滑动距离
val scrollOffset = RecyclerView.layoutManager.computeHorizontalScrollOffset(state)
// 滑动距离 / 单张图片宽度 = 当前是第几张图片
// 这里我们对图片集合的长度进行求余运算,即可获得当前第一个可见的图片索引
val firstVisible = (scrollOffset / bitmapWidth).toInt() % bitmapPool.size
// 获取当前第一张图片左边缘距离屏幕左边缘的偏移量
val firstVisibleOffset = scrollOffset % bitmapWidth

2. 我们确定了当前屏幕第一张可见的图片索引,以及第一张图片与屏幕左边缘的偏移量,下面就可以开始真正的绘制了:

<ParallaxDecoration.kt>
override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
    super.onDraw(c, parent, state)
    ...
    c.save()
    // 把画布平移到第一张图片的左边缘
    c.translate(-firstVisibleOffset, 0f)
    // 循环绘制当前屏幕可见的图片数量
    for ((i, currentIndex) in (firstVisible until firstVisible + bestDrawCount).withIndex()) {
        c.drawBitmap(
            bitmapPool[currentIndex % bitmapCount],
            i * bitmapWidth.toFloat(),
            0f,
            null
        )
    }
    // 恢复画布
    c.restore()
}

3. 上面在循环绘制过程中,我们进行了优化取值bestDrawCount,具体计算逻辑是,当firstVisibleOffset = 0时说明当前第一张可见图与屏幕左边缘对齐,相当于初始状态,所以最大可见数为maxVisibleCount - 1。虽然需要每循环bitmapPool.szie次才会触发一次该条件,但是在RecyclerView持续滑动过程中频繁触发此处的onDraw回调,降低一次循环对性能的提升还是可观的,同时我们在计算firstVisible的时候先不对bitmapCount进行取余操作,因为draw的时候我们依旧要取余保证索引的准确性:

<ParallaxDecoration.kt>
// 当前recyclerView的滑动距离
val scrollOffset = RecyclerView.layoutManager.computeHorizontalScrollOffset(state)
// 添加视差系数,换算成背景的滑动距离,与RecyclerView产生视差效果
val parallaxOffset = scrollOffset * parallax

4. 此时我们的背景图已经能够跟随RecyclerView滑动而循环展示了,对于视差效果,只需要在计算scrollOffset时添加一个视差系数parallax即可:

<ParallaxDecoration.kt>
// 当前recyclerView的滑动距离
val scrollOffset = RecyclerView.layoutManager.computeHorizontalScrollOffset(state)
// 添加视差系数,换算成背景的滑动距离,与RecyclerView产生视差效果
val parallaxOffset = scrollOffset * parallax

好了,到此一个支持背景视差效果的ItemDecoration就完成了。

最后还有一个问题,就是当我们的背景图不能铺满RecyclerView的高度时,我们需要怎么处理呢?这个对于熟悉绘制的同学来说应该很简单,只需要在绘制的时候对canvas.scale进行缩放处理,就能绘制出自动填充的背景图。

这里需要注意的是我们在计算滑动距离offset和firstVisible时,需要将bitmapWidth*scale才是实际的bitmapWidth,逻辑比较简单,这里就不展开了,同时还需要对RecyclerView的LayoutManager的方向进行区分处理,有兴趣的可自行阅读源码。

最后,下面是ParallaxDecoration.onDraw的核心逻辑,完整项目和使用方式见底部链接:

<ParallaxDecoration.kt>
override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
    super.onDraw(c, parent, state)
    if (bitmapPool.isNotEmpty()) {
        // if layoutManager is null, just throw exception
        val lm = parent.layoutManager!!
        // step1. check orientation
        isHorizontal = lm.canScrollHorizontally()
        // step2. check maxVisible count
        // step3. if autoFill, calculate the scale bitmap size
        if (isHorizontal && screenWidth == 0) {
            screenWidth = c.width
            screenHeight = c.height
            if (autoFill) {
                scale = screenHeight * 1f / bitmapHeight
                scaleBitmapWidth = (bitmapWidth * scale).toInt()
            }
            val allInScreen = screenWidth / scaleBitmapWidth
            val outOfScreen = screenWidth % scaleBitmapWidth > 1
            maxVisibleCount = if (outOfScreen) allInScreen + 2 else allInScreen + 1
        } else if (!isHorizontal && screenHeight == 0) {
            screenWidth = c.width
            screenHeight = c.height
            if (autoFill) {
                scale = screenWidth * 1f / bitmapWidth
                scaleBitmapHeight = (bitmapHeight * scale).toInt()
            }
            val allInScreen = screenHeight / scaleBitmapHeight
            val outOfScreen = screenHeight % scaleBitmapHeight > 1
            maxVisibleCount = if (outOfScreen) allInScreen + 2 else allInScreen + 1
        }
        // step4. find the firstVisible index
        // step5. calculate the firstVisible offset
        val parallaxOffset: Float
        val firstVisible: Int
        val firstVisibleOffset: Float
        if (isHorizontal) {
            parallaxOffset = lm.computeHorizontalScrollOffset(state) * parallax
            firstVisible = (parallaxOffset / scaleBitmapWidth).toInt()
            firstVisibleOffset = parallaxOffset % scaleBitmapWidth
        } else {
            parallaxOffset = lm.computeVerticalScrollOffset(state) * parallax
            firstVisible = (parallaxOffset / scaleBitmapHeight).toInt()
            firstVisibleOffset = parallaxOffset % scaleBitmapHeight
        }
        // step6. calculate the best draw count
        val bestDrawCount =
            if (firstVisibleOffset.toInt() == 0) maxVisibleCount - 1 else maxVisibleCount
        // step7. translate to firstVisible offset
        c.save()
        if (isHorizontal) {
            c.translate(-firstVisibleOffset, 0f)
        } else {
            c.translate(0f, -firstVisibleOffset)
        }
        // step8. if autoFill, scale the canvas to draw
        if (autoFill) {
            c.scale(scale, scale)
        }
        // step9. draw from current first visible bitmap, the max looper count is the best draw count by step6
        for ((i, currentIndex) in (firstVisible until firstVisible + bestDrawCount).withIndex()) {
            if (isHorizontal) {
                c.drawBitmap(
                    bitmapPool[currentIndex % bitmapCount],
                    i * bitmapWidth.toFloat(),
                    0f,
                    null
                )
            } else {
                c.drawBitmap(
                    bitmapPool[currentIndex % bitmapCount],
                    0f,
                    i * bitmapHeight.toFloat(),
                    null
                )
            }
        }
        c.restore()
    }
}

项目地址:https://github.com/seagazer/parallaxdecoration

BUUCTF逆向题Youngter-drive 其实线程一代码我自己也不大理解,看了正确的 flag 后,我自己推出来的是这样:在 couece 中取出字符,然后在 QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm 中找出一样的,取出该字符在 QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm 中的下标,如果取出的字符是大写则 在ASCII中找出【下标 - 38】值对应的字符替换couece中的字符,同理,小写就减 96。 阅读详情

相关推荐

华中农业大学C++考试基础练习题

实验一 1 通过日期求某月的天数。 输入日期的年份和月份,求该月有多少天。提示:对于月份为1、3、5、7、8、10、12的月份天数为31,月份为4、6、9、11的月份天数为30,月份为2时要结合年份考虑闰年的情况。 输入描述 输入两个正整数y和m分别表示年份和月份。 输出描述 如果y和m满足条件:1900<=y<3000,0<m<13,输出该月的天数;否则输出“Input error!”。 输入样例 2010 12 输出样例 31 #include"iostream" using n

雨的博客 1万+

RecycleView基于ItemDecoration实现自定义滚动条

效果如图简单查了一下,没有发现特别简洁的方式,自定义view配和绑定RecycleView再加上各种计算比较麻烦。这里实现方式是使用低侵入性的RecyclerView.ItemDecoration//总高度//指示器高度//总宽度//距离右侧距离//滚动条拇指的垂直范围//可滚动的区域大小//当前偏移量(当前滚动的距离)//最大偏移量(最大可滚动的距离)//可以滑动时,在绘制。如果数据不满一屏不能滑动则不会绘制显示startX,startX,paint。

欲买桂花同载酒,抬望眼,还看今朝。 1272

一种4位sar adc仿真验证

4位sar adc采用下图的电容阵列,电路如下图:所有电容的正端(也称为上极板)与比较器的反相端连接,比较器同相端接Vin,其工作过程进行大致分析见之前的文章《一种4位sar adc工作过程推导(三)》,下面对这个电路进行仿真验证。 两个参考电压VrefPV_{refP}VrefP​和VrefNV_{refN}VrefN​,V+=VinV_{+}=V_{in}V+​=Vin​,假设1116(VrefP−VrefN)+VrefN<Vin<1216(VrefP−VrefN)+VrefN\frac{

大学生视野 1954

Android RecyclerView 详解(三) RecyclerView的动画实现(移除、添加、改变、移动)和自定义动画的实现

Android RecyclerView 详解(三) RecyclerView的动画实现(移除、添加、改变、移动) 一丶添加删除时候的刷新问题 先上一下效果图吧 1.为了方便起见我们还是先添加三个按钮分别实现添加删除和改变 2.在Adapter中写调用方法并进行刷新 public void remove(int position){ list

SuperBigLw的博客 2万+

通过 CoovaChilli 和 FreeRADIUS 搭建一个公共 Wi-Fi 的认证系统,实现用户连接到 Wi-Fi 后通过 Captive Portal(强制登录页面)进行认证

要实现固定设备连接的功能,你可以通过MAC 地址认证来限制哪些设备可以通过 FreeRADIUS 进行身份验证和连接。你可以在 FreeRADIUS 的users文件中直接配置允许的设备的 MAC 地址,也可以通过数据库存储和查询设备信息,进一步提高管理效率。通过这些方法,你可以灵活地控制哪些设备能够访问你的 Wi-Fi 网络。

m0_69943017的博客 2646

告别regsvr32!易语言调用大漠插件dm.dll的免注册实战(附Win7/10/11避坑指南)

本文详细介绍了易语言如何免注册调用大漠插件dm.dll的实战方法,通过`dmreg.dll`实现真正的免注册调用,规避了传统`regsvr32`注册方式带来的权限和兼容性问题。文章包含核心原理剖析、易语言实现细节、多系统兼容性方案及高级应用场景,帮助开发者实现绿色化部署,提升自动化脚本开发效率。

weixin_42553471的博客 300

android recyclerview多布局_Android实现炫酷的视觉差效果

这次带来的是结合CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout和FloatingActionButton打造炫酷的视觉差效果。实现步骤一:需要在主题文件中将Activity的标题栏去掉‍二:编写Activity的布局文件<android.support.design.widget.CoordinatorLayout xm...

weixin_39759441的博客 191

15.1-缓存调试解析

摘要:DSU-120提供L3缓存和监听过滤器(SF)RAM的调试功能,通过CLUSTERCDBG寄存器控制访问。该功能需在集群ON电源模式下使用,且需确保单核访问。寄存器位字段根据读写操作不同,可配置WAY、RAM类型等参数。数据读取分为监听过滤器RAM、标签RAM、数据RAM及MTE标签四种类型,各有特定的位字段解释。配置参数包括切片ID宽度、标签索引宽度等,随缓存大小变化。

baron-周贺贺-代码改变世界ctw 110

Android视差特效

RecyclerView配合Imageview现实下拉视差特效 ParallaxRecyclerView继成RecyclerView并重写dispatchNestedPreScroll方法,即可达到上图效果,以前是继承ListView重写overScrollBy方法实现的 具体现实类如下: public class ParallaxRecyclerView extends RecyclerView { //视差动画view的父view private ViewGroup mParent;

SuperRMB的博客 525

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

RK3568下MIPI屏幕调试技巧

通过合理配置设备树节点、精确计算像素时钟并完成编译烧录,可高效实现RK3568平台MIPI屏幕的点亮与显示调试。关键在于严格遵循屏幕规格书参数,结合内核日志定位问题,逐步优化时序配置。掌握这一流程后,开发者可快速适配不同分辨率、刷新率的MIPI屏幕,为嵌入式系统显示模块开发奠定基础。如果在调试中遇到特定问题(如驱动匹配失败、时钟计算误差),建议优先查阅屏幕规格书和RK3568芯片手册,或通过内核社区(如Linux-DRI邮件列表)获取支持。

文石_2009的博客 1204

android控件滚动视差,视差式项目拖动Android(RecyclerView)

我正在尝试在Recyclerview中添加一些效果基本上,您可以将Recyclerview中的项目向右滑动,项目将按照您的触摸直到您滑动,比如说布局宽度的%30,然后该项目将以半速跟随您的触摸 . 通过项目视图下方的布局,它可以创建非常好的视差效果 . 你放开了这个项目,它顺利滑回到它开始的地方 . 可以在Spotify(至少在iOS上)上看到效果,您可以在其中拖动轨道以对其进行排队 .我到处寻找...

weixin_39955700的博客 223

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

recycleview横向展开_巧用RecyclerView ItemDecoration 实现炫酷视差效果

原标题:巧用RecyclerView ItemDecoration 实现炫酷视差效果本文作者作者:seagazerhttps://www.jianshu.com/p/b96ca7edba401概述最近项目又开始大刀阔斧的改版迭代,PM也再次开始了其疯狂CX大法。不过对此早已习以为常了,毕竟我们也曾经看懂过这么一本书《RR is PM》。哈哈,有点扯远了,回归正题,先来看看这次要实现的交互效果(CX...

weixin_39886469的博客 389

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

RecyclerView 视差装饰器—— ParallaxDecoration 详解

最近项目又开始大刀阔斧的改版迭代,PM也再次开始了其疯狂CX大法。不过对此早已习以为常了,毕竟我们也曾经看懂过这么一本书《RR is PM》。哈哈,有点扯远了,回归正题,先来看看这次要实现的交互效果(CX目标): 简单描述下,界面就是一个横向列表,滑动的时候,背景图跟着一起滑动,并且附带视差效果,随着滑动距离增加,背景图一直在循环展示。 看到这种效果,列表方案肯定是首选RecyclerView,接着看这背景视差效果,首先想到的就是通过绘制background的方式实现。大家都知道,RecyclerV

qq_39477770的博客 454

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

超越列表:用 RecyclerView 构建创意交互界面

本文探讨了如何利用Android RecyclerView构建超越传统列表的创意交互界面。通过自定义LayoutManager、高级ItemDecoration和ItemTouchHelper等技术,开发者可以实现环形布局、瀑布流、拖拽排序等丰富交互效果,提升移动应用的用户体验和视觉吸引力。

juice的博客 185

Android RecyclerView核心原理与性能优化实战

RecyclerView是Android开发中用于高效展示列表数据的核心组件,其核心设计基于视图回收复用机制。通过解耦Adapter、LayoutManager和ViewHolder三大组件,实现了比传统ListView更优的性能表现,特别是在处理大数据集和复杂布局时。在技术实现上,RecyclerView采用ViewHolder模式强制视图复用,配合多种LayoutManager支持线性、网格及瀑布流等布局方式。从工程实践角度看,合理使用RecycledViewPool、局部刷新(notifyItemCh

weixin_33857230的博客 372

Android开发进阶:Firebase与RecyclerView整合实战

RecyclerView作为Android开发中的核心UI组件,其性能优化与云端数据整合是当前移动开发的热点话题。通过DiffUtil实现高效差异更新、利用RecycledViewPool优化内存管理,这些机制能显著提升列表滚动性能。当结合Firebase Storage时,开发者需要特别注意云端图片的缓存策略和分页加载实现,这是构建现代社交/电商类应用的关键技术。本文以Firebase+RecyclerView为典型案例,详解如何通过Glide配置磁盘缓存、Firestore分页查询等技术手段,实现高性能

weixin_30918633的博客 486

转载RecyclerVier 开源效果

序号 项目名称 项目描述 预览 1 cymcsg/UltimateRecyclerView RecyclerView支持各种功能的库,star3000+,Ultimate 这个名字就取得屌 2 CymChad/BaseRecyclerViewAdapterHelper 一个强大并且灵活的Rec

刘淏卿的专栏 1101

那些酷炫的RecyclerView开源库整理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33681778的博客 135

推荐开源项目:RecycleHeaderAdapter - 为你的RecyclerView添加灵动的头部视图

推荐开源项目:RecycleHeaderAdapter - 为你的RecyclerView添加灵动的头部视图 在Android应用开发中,RecyclerView是一个非常重要的组件,它用于展示大量数据并支持滚动操作。然而,为了提升用户体验和界面美感,开发者常常需要在RecyclerView顶部添加一些特殊的视图,如滑动标签、广告轮播等。今天,我想要向大家推荐一个开源项目——,这是一个专为Recy...

gitblog_00092的博客 435

MAS 激活脚本上手指南:Windows 与 Office 免费激活一次跑通

给一台新电脑做激活,通常要过三道坎:花钱买密钥、背一串命令行操作、Windows 和 Office 还得各折腾一遍。MAS(Microsoft Activation Scripts)激活脚本把这一步合并成了"运行一个文件"。它完全开源、免费,覆盖 Windows 8.1 / 10 / 11 与 Office 2013 至 2024 的激活,当前版本 3.12。 ## 先选对激活方式:4 条内置路

gitblog_00418的博客 761

Android的RecyclerView.ItemDecoration使用

文章目录前言一、RecyclerView.ItemDecoration是什么?二、使用步骤1.引入库2.设置装饰器2.1 在Activity或者Fragment中设置装饰器2.2 实现MaintenanceItemDecoration,继承于RecyclerView.ItemDecoration()1、实现getItemOffsets方法,代码如下2、给底部留白部分加上节点,实现onDraw方法3、MaintenanceItemDecoration完整代码3.完成最终版带进度更新的装饰器3.1 设置装饰器3

Silicon_Valley 3559

android_基础_recyclerview之ItemDecoration详解

转载自:https://www.jishudog.com/9055/html 一、简述 说到RecyclerView大家都很熟悉了,相比于ListView,它具有高度解耦、性能优化等优势,而且现在大多数安卓开发者都已经将RecyclerView用来完全替代ListView和GridView,因为它功能十分强大,但往往功能强大的东西,反而不太好控制,例如今天要说的这个ItemDecoration,ItemDecoration是条目装饰,下面来看看它的强大吧。 二、使用ItemDecoration绘制分割线.

写bug的蚊子的博客 2326

RecyclerView 之 ItemDecoration 讲解及高级特性实践

RecyclerView 之 ItemDecoration

QG 2120

RecyclerView ItemDecoration 完全解析

RecyclerView ItemDecoration 解析 我们都知道,使用 RecyclerView 时 ,我们不能像 ListView 那样通过 setDivider() 的方式来设置分割线,好在 Android 为我们提供了定制性更强的 ItemDecoration 来为 RecyclerView 设置分割线。 什么是 ItemDecoration ? 顾名思义 ItemDecoratio...

Star的博客 6744

RecyclerView系列之二ItemDecoration

recyclerview itemDecoration

QG 1144
上一篇: 两年多的 Android SDK 开发经验,分享给大家
下一篇: 阿里ARouter全面全面全面解析(使用介绍+源码分析+设计思路)
CallmeZhe
博客等级 码龄11年 45粉丝 91原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值