Android动画学习Demo(2) 关于Property Animation的用法及总结

Android 动画↑ 1.Android动画 Android系统的动画主要分为三大类: ①View Animation 视图动画:在古老的Android版本系统中就已经提供了,只能被用来设置View的动画。 ②Drawable Animation (也叫Frame动画、帧动画):专门用来一个一个的显示Drawable的resources,就像放幻灯片一样。 ③Property Animation属性动画:只对Android 3.0(API 11)以上版本的Android系统才有效,这种动画可以设置给任何Object,包. 阅读详情

在上一篇文章中,我们知道了关于View Animation的用法及其一些局限性,而在3.0之后,Android 引入了Property Animation 的框架,弥补了View Animation的一些短板,使得我们在Android中能够更好地借助框架去实现更复杂更好的动画效果,从而创造出漂亮的用户体验。

这一篇文章我们先来了解 一下Property Animation的一些用法,在知其然的基础上,下一篇文章我们再来讨论Property Animation的机制原理。

上一篇文章讲到 View Animation 只能作用在View 上,而对那些不是View的对象是不起作用的,而Property Animation则不然,它是对一切对象的一切属性都起作用,只要这个属性有对应的get/set方法。不过话虽然如此说,我个人觉得,动画效果如果我们看不到的话,那有啥意思,而能够让我们看得到的对象,基本上都是View对象,或者间接转化为View对象的。所以,我们还是来关注怎么利用Property Animation来实现View的动画效果吧。

新的属性

首先我们要先了解关于View在3.0之后引入的几个新的属性,并设置了其getter和setter方法:

1)translationX 和 translationY:这两个属性控制了View所处的位置,它们的值是由layout容器设置的,是相对于坐标原点(0,0左上角)的一个偏移量。

2)rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。

3)scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。

4)pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。

5)x 和 y:描述了view在其父容器中的最终位置,是左上角左标和偏移量(translationX,translationY)的和。

6)aplha:透明度,1是完全不透明,0是完全透明。

照例,先上效果Gif,然后再来讲解一下各种效果的实现。


同样的,在Property Animation机制中,同样可以通过XML 或者直接在Java中来定义我们的动画效果。

XML中定义动画效果

比如上面展示中ScaleX 按钮,其效果是在 res/animator/scalex.xml 中定义的,在这里也要说明一下,定义在 animator中不是必须的,但是是android推荐的,因为在eclipse开发中,ADT插件(ADT 11.0.0+)只会去搜寻 res/animator 这个路径,如果不是定义在这个文件夹里面,我们在开发的时候,就没法利用ADT的布局工具了。

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:propertyName="scaleX"
    android:duration="2000"
    android:valueFrom="1.0"
    android:valueTo="2.0"
    android:repeatCount="1"
    android:repeatMode="reverse">
</objectAnimator>
在XML中要利用objectAnimator来定义我们的某个属性的效果,所以:

1)propertyName 当然是一定要的啦,理论上这个属性的值可以是对象中的任何有get/set方法的属性,不过我们这里是对View来说,所以一般而言,就是上面新加的那几种新属性了。

2)duration 持续时间

3)valueFrom 和 valueTo:这就是动画开始和结束时,这个属性相对应的值了,如果我们是缩放的话,当然就是倍数了,如果是平移(Translation)的话,那么就是距离了。

4)repeatCount 和 repeatMode:这两个和View Animation 中是一样的,就不多说了。

在xml中定义好了之后,接下来就要在Java中调用了,如下:

Button btnScaleX = (Button)findViewById(R.id.buttonScaleX);
btnScaleX.setOnClickListener(this);
scaleXAnimator = (ObjectAnimator)AnimatorInflater.loadAnimator(this, R.animator.scalex);
scaleXAnimator.setTarget(btnScaleX);
...
public void onClick(View v) {        
	switch(v.getId()){           	    
	    case R.id.buttonScaleX:
			scaleXAnimator.start();
			break;              
	...    

1)当然,首先要找到我们动画的对象了,在demo中就是那个scaleX的button了。

2)利用AnimationInflater类的loadAnimator方法来获取我们的ObjectAnimator对象

3)利用setTarget(View)方法来设置这个动画应用的对象,在这里就是我们的按钮了。

4)触发动画效果,就是调用其start方法了。

当动画效果开始后,我们发现它就只是在x方向上变大,肿了,那我们要在Y方向上怎么办,在XML中一个ObjectAnimator只能对应于一个属性,所以下面就是Set的展现了,跟View Animation一样,set也是将几个效果给弄在一起,一次性执行也行,顺序执行也行,只要设置其ordering属性就好。

第二个按钮scale,就是在X方向上和Y方向上同时进行的,其定义如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:ordering="together">
    <objectAnimator
        android:duration="2000"
        android:propertyName="scaleX"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:valueFrom="1.0"
        android:valueTo="2.0" >
    </objectAnimator>
    <objectAnimator
        android:duration="2000"
        android:propertyName="scaleY"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:valueFrom="1.0"
        android:valueTo="2.0" >
    </objectAnimator>
</set>
而在Java中呢,这个xml对应的对象已经不是ObjectAnimator了,而是AnimatorSet了,其代码如下:

		Button btnScale = (Button)findViewById(R.id.buttonScale);
		btnScale.setOnClickListener(this);
		animatorScaleSet = (AnimatorSet)AnimatorInflater.loadAnimator(this, R.animator.scale);
		animatorScaleSet.setTarget(btnScale);

Java中定义动画效果

我们也可以直接在java中创建OjbectAnimator和AnimatorSet对象,并设置对应的参数和属性,如:

Set

Button buttonSet = (Button) findViewById(R.id.buttonSet);
buttonSet.setOnClickListener(this);
animationSet = new AnimatorSet();
animationSet.playTogether(
		ObjectAnimator.ofFloat(buttonSet, "alpha", 1,0,1),
		ObjectAnimator.ofFloat(buttonSet, "translationX", 0f,400f,0f),
		ObjectAnimator.ofFloat(buttonSet, "rotation", 0,180,360)
		);
animationSet.setDuration(1000);
animationSet.addListener(new AnimatorListener() {			
	@Override
	public void onAnimationStart(Animator arg0) {}
	@Override
	public void onAnimationRepeat(Animator arg0) {}			
	@Override
	public void onAnimationEnd(Animator arg0) {}			
	@Override
	public void onAnimationCancel(Animator arg0) {}			
});
1)我们先通过ObjectAnimator的工厂方法创建几个ObjectAnimator:

1.1)target:动画效果的实施对象,也就是demo中的set按钮。

1.2)propertyName:对应的属性,如alpha,translationX等等。

1.3)values:这是一组值,就是由什么值变动到另外一个什么值,再到什么什么值。。。之类的。

     * @param target The object whose property is to be animated. This object should
     * have a public method on it called <code>setName()</code>, where <code>name</code> is
     * the value of the <code>propertyName</code> parameter.
     * @param propertyName The name of the property being animated.
     * @param values A set of values that the animation will animate between over time.
     * @return An ObjectAnimator object that is set up to animate between the given values.
     */
    public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
        ObjectAnimator anim = new ObjectAnimator(target, propertyName);
        anim.setFloatValues(values);
        return anim;
    }

2)然后通过 AnimatorSet的playTogether方法或者playAfter, playBefore等方法将其加入到set中,如果不加入到set的话,就是对

3)给set设置相对应的如duration之类的属性

4)我们还能够给Animator添加一个Listener,让它能够对Animator的几个关键点进行响应,分别是开始,结束,重复,取消时的响应函数,在这里有一点要注意的就是:

4.1)如果添加的是 AnimatorListener,则其四个函数都要实现

4.2)我们也可以添加 AnimatorListenerAdapter,它是以AnimatorListener的封装,实现了上面的几个空方法,我们只需要实现我们想要的方法就好了,比如:

new AnimatorListenerAdapter() {
	@Override
	public void onAnimationEnd(Animator animator){
		final Button button = (Button) findViewById(R.id.buttonViewPropAnimator);
		button.animate().alpha(1).translationX(0f).start();
	}
})

5)最后在onClick事件中调用其start方法。

不过在Java中,如果要实现一个对象不同属性的动画效果,除了Set,我们还可以利用PropertyValuesHolder和ViewPropertyAnimator对象来实现,具体做法如下:

PropertyValuesHolder

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("translationX",0f,300f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("translationY",0f,300f);		
translateAnimator = ObjectAnimator.ofPropertyValuesHolder(buttonProValHolder, pvhX,pvhY);
translateAnimator.setDuration(2000);

1)我们可以通过 PropertyValuesHolder类的工厂方法ofInt, ofFloat等方法,让它能够Hold住对应property的value。
2)在利用ObjectAnimator的ofPropertyValuesHolder方法时,再将我们上面定义的propertyValuesHolder给传进去,定义出一个objectAnimator。
3)设置objectAnimator对应的属性,调用其Start方法就行。

ViewPropertyAnimator

也可以通过ViewPropertyAnimator类来实现,如下:
case R.id.buttonViewPropAnimator:
	v.animate().translationX(100f).alpha(0).setListener(new AnimatorListenerAdapter() {
		@Override
		public void onAnimationEnd(Animator animator){
			final Button button = (Button) findViewById(R.id.buttonViewPropAnimator);
			button.animate().alpha(1).translationX(0f).start();
		}
	}).start();
1)先利用view的animate() 方法返回一个ViewPropertyAnimator对象,然后调用其translationX,alpha等方法,也可以给其添加listener。
2)最后调用其start方法即可。

关于ValueAnimator

从上面的代码中,我们可以发现,我们好像都是在用ObjectAnimator对象,那么ValueAnimator类呢?其实ObjectAnimator是ValueAnimator的一个子类,是比较常用的一个类。
但是有时候如果ObjectAnimator不能满足我们的需求了,那么我们就要用ValueAnimator类了。但是我们留到下一篇文章讲Property Animation的工作原理的时候再讲吧。
(Tips. 其实demo中已经有一个ValueAnimator的实现了,各位可以先看一下)。

源代码请点击(请记住,上述属性是3.0后才支持的!!!)


P.S. 大家有没有发现,在View Animation中,当我们移动一个按钮到另外一个地方的时候,要响应按钮的点击事件的时候,我们必须在原来的位置点击,那么在Property Animation中呢,当然是不用啦,大家可以在demo中试试。

P.S. 大家有没有发现,PropertyAnimation基本上都是用animator,而不是用animation了呢?

P.S. 大家如果有兴趣,还可以了解一下View Animation 是怎么样的呢,传送门:

Android动画学习Demo(1) 关于ViewAnimation的用法及总结

Python 逆向解析知乎盐选反爬字体,实现内容精准还原 本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。 阅读详情

相关推荐

医疗AI Agent实战:从零搭建一个能看病的智能助手(附完整代码)

本文详细介绍了如何从零搭建一个医疗AI Agent智能助手,涵盖核心架构设计、症状推理引擎开发、安全与合规实现以及系统集成等关键环节。通过完整的代码示例和实战案例,帮助开发者快速构建具备医疗咨询能力的智能Agent,提升医疗服务的效率和质量。

ss78901的博客 468

帧动画

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_pa

xdd_lmd的博客 756

Dify 1.0+内网部署全攻略:模型插件离线安装与信创环境适配

本文详细介绍了Dify 1.0+版本在内网环境中的部署全攻略,重点解析了模型工具插件的离线安装方法与信创环境适配技巧。通过实战经验分享,帮助企业在严格的内网隔离条件下高效部署AI平台,解决插件依赖和安装难题,提升大语言模型的应用效率。

weixin_29224529的博客 274

做动画步骤,对于使用adt-bundle-windows-x86-20131030的用户

当初搭建Android开发平台,由于用自带ADT下载

u010102493的专栏 2003

Python + DeepSeek 完美结合:本地部署提效指南

随着生成式 AI 和深度学习技术的快速发展,如何将智能搜索工具与本地部署结合以提升效率成为了许多企业和开发者关注的重点。DeepSeek 是一款开源的智能搜索框架,结合 Python 的灵活性,能够实现高效、可靠的本地部署方案。本文将介绍如何通过 Python 和 DeepSeek 的完美结合,实现本地化部署并提升工作效率。通过将 Python 与 DeepSeek 结合,可以快速实现语义搜索的本地化部署,确保数据安全的同时提升工作效率。文件可直接作为 DeepSeek 的输入数据。

weixin_44872675的博客 1万+

给jetson nano 安装AX200网卡驱动

几经波折,因为在网上看到的基本都是amd版本而非arm版,然后最终选定V5.5是因为更新的几个版本的arm版本是false的(在https://kernel.ubuntu.com/~kernel-ppa/mainline/处选择版本时,得看在arm64上是false还是build succeeded,之前没经验呀刚刚才顿悟的) 1,参考文章https://blog.youkuaiyun.com/MIRANA0/article/details/106696334 学到了得下载如下四个: wget https://k

发嘎嘎的博客 2346

android动画基础

一 传统 View 动画(Tween/Frame) 转自:http://www.codekk.com/open-source-project-analysis/detail/Android/lightSky/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8B%20Android%20%E5%8A%A8%E7%94%BB%E5%9F%BA%

u014134488的专栏 568

工业级C#+YOLOv8缺陷检测系统:准确率98.5%、延迟<50ms的完整实现

本文分享了基于C#和YOLOv8的工业级表面缺陷检测系统实现方案。针对汽车零部件冲压件检测需求(60件/分钟,准确率>98%,延迟<100ms),作者对比了多种技术方案后选择了C#+YOLOv8+ONNX Runtime的组合,最终实现98.5%准确率和42ms延迟。 系统采用分层模块化架构,包含硬件层、采集层、推理层、业务层和控制层。核心优势包括:1)C#在工业环境下的稳定性和集成便利性;2)YOLOv8对复杂缺陷的泛化能力;3)ONNX Runtime GPU加速提升性能。文章详细介绍了硬件

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1141

Android动画之视图动画和属性动画

Android 动画分为两大类,分别是视图动画(View Animation)和属性动画(Property Animation)。对于这两种动画,都能够使用xml和代码的形式定义动画。View Animation视图动画是Android最基础的动画,在API 1中就已经加入,不需考虑兼容性,但由于其动画只是作用于视图上,而不会由该控件的属性,所以有很多的局限性。视图动画的基类是Animation其下

茅屋 1万+

【报错】(pycharm运行程序)OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败。 Error loading

1 报错 OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败。 Error loading 2 分析原因 通过 activate Distance 进行自己创建的 Distance 虚拟环境中,输入python会显示环境中python的版本信息,再依次import,显然不会报错。 这是因为在Anaconda的环境下有支持 import torch 的 dll,而在PyCharm中使用的是自己创建的新环境,还缺少相应支持的dll,仅需在PyCharm中配置环境变量。.

静谧、淡雅 8623

开源工具对比:5款主流大数据脱敏框架评测

数据脱敏(Data Masking/Anonymization),也称为数据漂白、数据去标识化,是指在不影响数据可用性的前提下,通过一定的技术手段对敏感信息进行处理,使其无法被识别或关联到具体个人或实体的过程。当应用程序向数据库写入数据(INSERT/UPDATE)时,ShardingSphere 会拦截 SQL,对配置了脱敏规则的字段,使用指定的算法进行加密/脱敏处理,然后将处理后的数据写入到。如果你的答案是“是”,那么数据脱敏,尤其是针对海量数据的。好的,各位技术同仁,数据安全领域的探索者们,大家好。

小程序开发 1185

Android动画学习Demo(1) 关于ViewAnimation的用法及总结

在Android系统中,提供了两种动画框架: 1)View Animation(视图动画),而View Animation 里面又包含了下面两种模式 1.1)Tween Animation (也称之为View Animation) 1.2)Frame Animation (也称之为Drawable Animation) 2)Property Animation(属性动画),这是在Android 3.0(API Level 11)之后才支持的框架。 所以,不考虑层次,只考虑实现,Android中就存在以下

持剑 6489

从4A架构的角度出来 帮我分析一下:数字化转型深水区:企业架构如何成为价值重构的核心引擎?

4A 架构的本质是构建企业的数字神经系统,通过业务感知、数据传输、决策执行、技术支撑的闭环,实现从效率提升到生态重构的质变。正如华为通过该架构实现全球研发资源统一调度,某零售集团借此打造线上线下融合的新零售体系,当业务、数据、应用、技术四个维度形成共振时,企业将获得持续进化的数字免疫力,在不确定的市场环境中保持韧性生长。这一过程不仅需要技术工具的升级,更依赖组织文化的变革 —— 从 “部门墙” 到 “能力网” 的转型,才是数字化转型深水区的终极挑战。

金牌架构师 1046

Android动画学习Demo(3) 关于Property Animation的TimeInpolator和TypeEvaluator

Property Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当前这个时间点的值。 ... 总的来说,就是三步: 1)将时间的消逝 t 和时长 duration 的比例fraction,传给interpolator 算出一个新的fractionNew。 2)将这个fractionNew传给TypeEvaluator,算出对应属性的当前值animatedValue。 3)根据

持剑 9176

NTscan扫描工具

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android动画了解—属性动画(Property Animation)

在Android中,动画分为两类:视图动画

Android TV 开发 1572

数学建模模型总结

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

Android动画

Android动画主要分为帧动画(逐帧播放图片序列)、补间动画(仅改变视觉位置)和属性动画(实际修改对象属性)。属性动画通过改变视图真实属性值实现交互同步,而补间动画只影响绘制效果。修改Activity转场动画可通过主题定义或代码调用overridePendingTransition实现,支持平移/缩放等效果。属性动画Demo展示了按钮移动后仍能响应点击的原理:ObjectAnimator直接操作translationX属性,触发视图和触摸区域同步更新。相比补间动画的视觉假象,属性动画实现了真正的物理位移和

xingfuyisheng的专栏 983

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android动画之属性动画(Property Animation)(一)

由于Android3.0之前已经有的视图动画(View Animation)存在一些局限性------动画改编的只是显示,并不能响应事件。View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。View Animation的动画框架所产生的动画,并不能改变事件响应的位置,它只是单纯地修改了显示。如果使用旧的视图动画产生上面的效果,那么按钮的实际点击有效区依然。。。

Picasso_L的专栏 1662

Android 属性动画(Property Animation) ValueAnimator 的介绍

先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到。视图动画系统也存在一些限制,因为它仅公开 对象的部分方面来供您添加动画效果;例如,您可以对视图的缩放和旋转添加动画效果,但无法对背景颜色这样做。 视图动画系统的另一个缺点是它只会在绘制视图的位置进行修改,而不会修改实际的视图本身。例如,如果您为某个按钮添加了动画效果,使其可以在屏幕上移动,该按钮会正确绘制,但能够点击按钮的实际位置并不会更改,因此您.

小牧在一直在学习,在前进的道路上大家一起学习,进步。 690

Android动画之属性动画(Property Animation)(三)

所谓布局动画是指作用在ViewGroup上,给ViewGroup增加view时添加一个动画过渡效果。

Picasso_L的专栏 792

Android 属性动画(Property Animation) ObjectAnimator的介绍

先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到。视图动画系统也存在一些限制,因为它仅公开 对象的部分方面来供您添加动画效果;例如,您可以对视图的缩放和旋转添加动画效果,但无法对背景颜色这样做。 视图动画系统的另一个缺点是它只会在绘制视图的位置进行修改,而不会修改实际的视图本身。例如,如果您为某个按钮添加了动画效果,使其可以在屏幕上移动,该按钮会正确绘制,但能够点击按钮的实际位置并不会更改,因此您.

小牧在一直在学习,在前进的道路上大家一起学习,进步。 1090

Android animation学习笔记之propery animation

以前写博客都是用百度空间,总感觉不专业,访问量少,好友少,里边可运用的资源也少,所以昨天网上查了一下,觉得iteye社区还不错,就申请了一个iteye帐号,今天开始写博,希望大家多关注多交流,共同进步.       最近一直在做中国最强音app的开发,好不容易闲了下来,觉得在做中国最强音app的时候动画方面的知识还不够扎实,所以这周腾出手来主要学习了animation和graphics

让我们一起摇摆 1633

android 属性动画集合,Android动画合集之属性动画Property Animation

1.属性动画概念2.ValueAnimator简单使用ValueAnimator的用法却一点都不复杂,我们先从最简单的功能看起吧,比如说想要将一个值从0平滑过渡到1,时长300毫秒,就可以这样写:ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);anim.setDuration(300);anim.start();怎么样?很简单吧,调用Value...

weixin_40005454的博客 301

android曲线位移动画,Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation...

Property Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当前这个时间点的值。android而在ValueAnimator中,又封装了两个类:ide1)TimeInterpolator,也称插值器,是来计算当前动画运动的一个跟时间有关系的比例因子。函数2)Ty...

weixin_36289211的博客 455

android 属性动画入门

android 属性动画入门

zhouguizhi 1852

帅气的属性动画赏析(Property Animation)

权利声明:转载请注明出处http://blog.youkuaiyun.com/hello_chillax今天我们来学习Android中的一个比较好玩的动画效果:Property Animation、でわ、はじめましょう。一,初めに:动画的分类 Android动画分类:View Animation,Drawable Animation,Property Animation。各自能实现的效果:View Anima

企鹅肖 1282
上一篇: Android动画学习Demo(1) 关于ViewAnimation的用法及总结
下一篇: Android动画学习Demo(3) 关于Property Animation的TimeInpolator和TypeEvaluator
linmiansheng
博客等级 码龄20年 507粉丝 111原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值