Android常见的几种图片加载框架

Android---PhotoViewer实现图片预览 PhotoViewer 图片查看器模仿微信朋友圈查看图片的效果。 阅读详情

废话不多说,美女镇楼

真好看~

本章内容主要简单介绍一下Android的常见图片加载框架。

你知道Android有几种图片加载框架吗?

  1. Universal ImageLoader(UIL) 这是一种早期的图片开源框架,早期的应用都在使用,我们的很多优化方向就是去替换它,换成Glide,Fresco等。这个加载框架可支持多线程,支持下载监听;支持bitmap裁剪;支持ListView暂停加载等基础功能。

  2. Picasso 这是Square公司出品的一个强大的图片下载和缓存图片库。picasso会缓存图片的原图到本地,比如我们下载一张1080P的图片,下次我们还需要这样的图片,它还会返回这张图片,不会再次下载;Picasso的bitmap是使用ARGB_8888的,它占用内存比较大,一个像素占4个字节。

  3. Glide 它最重要的特点就是它与Activity/Fragment生命周期一致,这也是因为出自Google公司 。Glide可以改变图片的大小再加载到内存中,同Picasso直接缓存原图不同,Glide是先下载图片,然后改变图片的大小以适应ImageView的要求,然后缓存到本地,所以如果下载同一张图片加载到两个不同的ImageView中,实际上Glide会缓存两份的图片。换一种说法就是,Glide会对不同的ImageView缓存不同大小的同一张图片。对于Glide为什么这么做呢?因为缓存改变大小的图片对内存的要求低,这样就降低了OOM的可能性。

  4. Fresco 这是Facebook出品的一款非常出色的图片加载框架。 首先它的性能好,首次加载图片速度非常快,用户体验好;其次内存表现出色,有效地内存块的图片进行了管理;Fresco支持渐进式预览,对于资讯类的应用,点开详情页,会先大致展示图片轮廓,然后慢慢下载图片展示出来;Fresco支持多图请求,对于列表页加载很多图片的时候,会先加载低分辨率的图片,因为图片小,会请求很快,给用户的感觉就是这款应用的性能很好,然后再预请求高分辨率的图片,用户在停留了一会后,会看到清晰的图片;Fresco支持图片的显现效果,自定义占位符,圆角图;Fresco还支持Gif,WebP等格式。

这就是一些主流的图片加载框架,其他的框架,欢迎大家交流~。

Android设计一个图片加载框架 本文不是具体编码去实现一个图片加载的框架,而是从理论上来讲解设计一个图片加载框架的注意事项和涉及的知识点,提供一个思路,或者帮助童鞋们应付面试。目前Android 发展至今优秀的图片加载框架太多,例如:Imageloader、Picasso、Glide等等。但是作为程序猿,懂得其中的实现原理还是相当重要的,只有懂得才能更好地使用。于是乎,今天我就简单设计一个网络加载图片框架。主要就是熟悉图片的网络加 阅读详情

相关推荐

Android图片加载框架Glide 解析

本文是阅读郭大神的八篇Android图片加载框架最全解析后,根据自己的理解做的笔记,本篇基于 Glide3.7.0讲解。 一、Glide简介 Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片。 二、Glide的基本用法 Glide.with(this) .load(url) .asBitmap() //加载静态图 .placeholder(R.drawable.loading)//加载过程中的占位图 .er

shipingxue的专栏 2366

Android图片预览框架PhotoViewer

官网 添加依赖 //类似微信图片预览框架 //https://github.com/wanglu1209/PhotoViewer implementation 'com.github.wanglu1209:PhotoViewer:0.50' PhotoViewer流程比较多,简单介绍下在单层RecyclerView中使用 自定义监听 /** * 动态监听器 */ public interface ImageListener { /** * 点击了动态图片回调 *

weixin_44575660的博客 7259

安卓图片加载框架技术详解与实例应用

htmltable {th, td {th {pre {简介:本文深入探讨了安卓图片加载框架的重要性以及其在移动应用开发中如何优化用户体验。特别分析了Picasso库,讲解其如何异步加载图片,处理内存和磁盘缓存,适配不同屏幕尺寸的图片,并提供图片裁剪、滤镜效果等操作。同时,简要介绍了其他流行的图片加载库如Glide和Fresco,并强调了根据项目需求选择合适框架的重要性。

weixin_35815766的博客 921

Android图片加载框架比较

做android的同学肯定都使用过imageloader这款图片加载框架。 图片加载对于中低级的安卓开发人员来说是相当不容易的,因为图片加载时做容易造成安卓内存溢出的原因,而要解决这些问题还需要很多相关知识: 1、多线程下载,线程管理。 2、多级缓存架构设计和策略,内存缓存,磁盘缓存,缓存有效性处理。 3、图片压缩,特效处理,动画处理。 4、复杂网络情况下下载图片策略,例如弱网络等。

一航jason 764

基于Flink的风控系统

可以使用Flink-Stream进行实时数据流的检测和处理,或者使用Flink-Kafka集群进行数据转发和存储,然后使用Flink-Table进行数据表的查询和分析。在Flink中,可以使用Flink-Stream进行数据流的处理,或者使用Flink-Kafka进行Kafka数据流的消费和处理。Flink的运行时本身也支持迭代算法的执行。可以使用Flink-Stream进行实时数据流的检测和处理,或者使用Flink-Kafka集群进行数据转发和存储,然后使用Flink-Table进行数据表的查询和分析。

m0_68231587的博客 1874

OpenVox 8FXO板卡驱动安装记录

OpenVox A800P和A1200P的板卡驱动安装及问题解决方法

clliu的专栏 2463

android点击全屏预览照片第三方库使用

自定义预览图片,可以扩展加一下自己的按钮功能等。/**** 重写该方法* 使用你的自定义布局**/@Override自定义预览的布局// 这是第三方库提供的,也就是默认的布局文件。

轻描时光 1169

利用 RSAU_LOG_API 把 SAP 安全审核日志接入企业 SIEM 的完整指南

在 SAP 世界里,安全审核日志(Security Audit Log,简称 SAL)是审计和合规的核心基础设施之一。系统会在后台把安全相关的关键事件记录下来,比如:(用户登录与登录失败用户锁定、解锁权限对象或角色变更远程调用(RFC)相关活动关键事务码的启动程序直接执行、批处理作业相关的敏感操作传统 ABAP 系统里,这些日志会写到本地应用服务器上的审计文件中(背后对应类似表RSAUENTR2的结构),包含事件标识、客户端、用户、终端、事务码、时间戳等信息。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 161

一款Android图片预览的开源库,几乎百分百还原微信的图片预览。

图片预览组件PreviewPictureView gihub地址:https://github.com/OneZeroYang/PreviewPictureView 几乎还原微信的图片预览,核心使用共享元素加自定义view实现 架构 PagerAdapter viewPager2的适配器,当然也可是使用其他组件来实现 PreviewImage 整个图片预览的核心 PreviewPictureView 对图片预览进行的简单封装 PreviewTools 启动一个简单的图片预览页面工具(对图片预览简单封装的一个

qq_41560693的博客 3975

C#每日面试题-属性和字段的区别

在C#面试中,“属性(Property)和字段(Field)的区别”是基础且高频的考点。很多初学者会把两者混为一谈,甚至觉得“属性就是加了get/set的字段”,但这种理解只停留在表面。面试考察的核心,是对“封装思想”的理解,以及两者在语法特性、底层实现、实际应用中的本质差异。今天我们从“基础认知→核心差异→底层原理→实际应用→面试避坑”五个层面,把这个知识点讲透,既保证新手能看懂,又能满足面试的深度要求。

Amon的专栏 777

15、虚拟环境中的数据保护与恢复方案解析

本文深入解析了虚拟环境中两种重要的数据保护与恢复解决方案:RecoverPoint for Virtual Machines(RP4VM)在VxRail上的设计,以及Veeam Backup & Replication(VBR)与VxRail的集成方案。文章详细介绍了RP4VM的网络布局、故障转移场景及其相关问题,以及VBR的架构设计、备份与复制流程、许可证选项及其多平台支持特性。此外,还探讨了RP4VM与VBR结合使用的综合解决方案,以及未来数据保护领域的发展趋势,如智能化管理、云原生集成和零信任架构,为

t4y5u6i7o的博客 93

Android 图片缓存与加载方式

开场白 从开始开发Android到现在使用的好多加载图片的框架,刚开始什么都不懂就看第三方封装的框架是如何加载的,然后照搬过来使用,只要能加载出图片就算工作完成,我才不考虑什么好不好?对不对?因为我自己也不知道什么是好,到后来逐渐在各种遇到的大神的指导下知道,正确的加载方法。但现在我又发现正确的方法里面更优的,给大家做个推荐,希望能够帮助大家。加载框架介绍 之前项目开发中最常用的图片缓存和加载就

方东的博客 1505

PCIe-Orders set Blocks之symbol对齐

有序集的使用场合很多,如在链路link阶段,进入polling后,便开始有序集的发送。一个 Ordered Set Block 包含一个同步头,后跟一个有序集。多通道链路的所有 Lane 必须同时传输相同的有序集,而且有序集的第一个符号定义了有序集的类型。但在PCIE中,8GT/s及以上的速率,采用的是128b/130b编码。128-bit是想要传输的payload,实际会传输130-bit,多出来的2-bit就是sync header。Block有两种,通过Sync header区分:10b:表示data

weixin_44700185的博客 813

开源框架——图片加载和缓存方案总结

提到图片加载和缓存方案,我们可能会立刻想到Flide,Fresco等框架,但除了这些还有没有别的?Android开发历史上都有哪些有名的图片加载和缓存方案呢?它们各方面的性能对比情况怎么样?谁更有优势?谁占统治地位呢?今天我们就来简单总结一下之前都有哪些框架曾经辉煌过,现在又是那个框架的天下。 1、BitmapFun 们先来看下BitmapFun,BitmapFun函数库是Android官方教...

weixin_33698043的博客 204

TVS 管击穿电压与钳位电压的工程解析

TVS二极管的核心参数击穿电压(VBR)和钳位电压(VC)常被混淆,但二者具有本质区别。VBR是

硬核科技 476

Origin教程004:Origin图形导出

需要编辑的话,双击图形,会自动用origin软件打开图形,这种方式是最开始导出图形的功能,方式一和二都是后面增加的。如果导出的图片边距较大的时候,会影响图片的美观,可以通过。也可以设置在PPT中直接编辑,找到。解决方法是,选择一条线,

WwLK123的博客 6327

Android的图片加载框架

在Android开发中,有许多图像加载框架可供选择。图片加载框架是有一个总体套路的,我们自己也可以通过这个流程实现一个图片框架。图片加载:封装、解析、下载、解码、变换、缓存、显示等。大型工程需考虑图片种类、图片使用率、加载性能、缓存机制、高效、简便的完成图片渲染任务。图片资源类型:jpeg、jpg、png、Webp、AWebp、Lottie、SVGA、NinePatch(点9)、AVD、File(透明视频)存放位置选择:当资源大小超过10Kb时,存放在NOS上;

Yimi-依米 的博客 1965

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android 框架练成 教你打造高效的图片加载框架

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/41874561,本文出自:【张鸿洋的博客】1、概述优秀的图片加载框架不要太多,什么UIL , Volley ,Picasso,Imageloader等等。但是作为一名合格的程序猿,必须懂其中的实现原理,于是乎,今天我就带大家一起来设计一个加载网络、本地的图片框架。有人可能会说,自己

Hongyang 10万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android入门到实战(六):Android主流图片加载框架

本文介绍了Android开发中常用的图片加载框架及其适用场景。主流框架包括功能全面的Glide、轻量级的Picasso、适合大图的Fresco和Kotlin原生的Coil,开发者可根据项目需求选择。文章重点讲解了最常用的Glide框架,提供了一份实用速查表,涵盖网络图片加载、占位图设置、GIF播放、本地资源加载、图片裁剪、缓存管理等常见场景,并给出了具体代码示例。最后指出Glide适合传统XML项目,Coil适合Jetpack Compose,Fresco擅长处理大图,而Picasso则适用于简单场景。

weixin_39339407的博客 1503

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android项目框架之图片加载框架的选择

本文来自http://blog.youkuaiyun.com/liuxian13183/,引用必须注明出处! 从Android爆发以后,自定义的控件如EditTextWithDelete、ActionBar、PullToRresh逐步进入开发者的视野,想起11年的时候,基本项目中使用的UI还全都是Android提供的基础控件,少一点的动画+布局,下载和网络请求都是用HttpClient,图片加载当然也是下载

劝学 2845

安卓多媒体开发:图片加载框架 Glide 与 Picasso 全面解析

在移动应用开发中,图片加载是核心功能之一。无论是社交应用的头像展示、电商应用的商品图片,还是新闻应用的配图,都需要高效、稳定的图片加载方案。Android 系统原生的图片加载方式存在诸多痛点(如 OOM、缓存管理复杂等),因此开发者通常会选择成熟的第三方框架。本文将详细对比当前主流的两个图片加载框架 ——Glide 和 Picasso,分析它们的核心特性、使用方法、性能差异及适用场景。Android 原生通过或加载图片时,存在以下问题:Glide 和 Picasso 作为主流图片加载框架,解决了上述问题:G

2501_93564530的博客 1297

Android 图片加载框架

Android 中有几个比较有名的图片加载框架,Universal ImageLoader、Picasso、Glide和Fresco。 Picasso 处理Adapter 中ImageView的回收和取消下载。(在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。) 使用最小的内存来做复杂的图片变换,比如高斯模糊,圆角、圆形等处理。(使用复杂的图片压缩转换来尽可能的减少内存消耗) 自动帮我们缓存图片,内存和磁盘缓存.

zenmela2011的专栏 531

安卓加载图片的路径,Dialog中加载网页(Webview中加载安卓中的图片)

欢迎安卓开发的小伙伴,当你看到此篇文章,如果对你有帮助,请留下你的爱心的小赞,支持一下呦!!! 安卓加载图片的路径 String imageUri = "http://site.com/image.png"; // from Web String imageUri = "file:///mnt/sdcard/image.png"; // from SD card St...

JoeyLee的博客 1067

Android Compose 框架图片加载深入剖析(六)

Android Compose 是 Google 推出的用于构建 Android UI 的声明式编程模型。它摒弃了传统的基于 XML 的布局方式,采用 Kotlin 代码来描述 UI 的外观和行为。这种方式使得代码更加简洁、易于维护,并且能够自动处理状态变化和布局更新。在 Android Compose 中,Image组件是用于显示图片的核心组件。它可以加载本地资源图片、网络图片等。以下是一个简单的使用示例:kotlin// 从资源文件中加载图片// 使用 Image 组件显示图片Image(

Android开发领域创作者 1369

安卓加载图片四大框架

加载网络图片的框架

RzhenDwo的博客 2279
上一篇: 最实用的Android图片内存优化的方法
下一篇: FTP解决跳转浏览器的三种方法(总有一种适合你)
盛国强
博客等级 码龄11年 105粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值