Java标准教程:Java 2D绘图--第2章 从绘图开始

Java 2D图形库实战:从基础绘图到交互式图形应用 Java 2D图形库是Java平台中用于实现高质量二维图形绘制的核心API,它构建在AWT(Abstract Window Toolkit)基础之上,提供了丰富的绘图功能,包括形状绘制、颜色填充、文本渲染以及图像处理等。该库不仅广泛应用于Swing图形界面开发中,还被用于游戏开发、数据可视化、图表绘制等需要图形支持的场景。Java 2D API的核心优势在于其面向对象的设计理念与高度可扩展性。通过Graphics2D类、Shape接口、Paint与Stroke。 阅读详情

Java 2D API 是强大并且复杂的。然而,大多数Java 2D API 只用到了封装在java.awt.Graphic 类中的功能的自己。本节描述了应用程序开发者最普遍的需要。其他在后续的高级主题中描述。

大多数Graphics 类可以分成以下的基本部分:

l         绘制和填充方法,可以让您渲染基本的形状,文本,图像

l         属性设置方法,影响如何绘制和填充。

setFont 和setColor 这种方法定义了如何填充方法渲染。

下图展示了这些方法如何与graphic 对象关联:

 

 

 

绘图方法包括:

l         drawString :绘制文本
g.drawString("Hello", 10, 10);

l         drawImage :绘制图像

 

g.drawImage(img,

                    0, 0, width, height,

                    0, 0, imageWidth, imageHeight,

                    null);     

 

l         drawLine, drawArc, drawRect, drawOval, drawPolygon :绘制几何图形:

 

g2.draw(new Line2D.Double(0, 0, 30, 40));

 

根据您的需求,您可以选择Graphics 类中的一些方法,基于下列条件:

l         您是否想在指定的位置使用图像原来的大小或规模填充给定的矩形。

l         您是否想填充图像的透明区域或保持他们透明。

Fill 方法作用于集合形状,包括fillArc, fillRect, fillOval, fillPolygon 。

当绘制文本或图像的线时,记住2D 图形的每个点通过它的x 和y 坐标决定。所有的draw 和fill 方法需要文本或图像是否被渲染的信息。

例如,要画一条线,应用程序调用下列方法:

 

java.awt.Graphics.drawLine(int x1, int y1, int x2, int y2)

 

在代码中(x1, y1) 时线的开始点,(x2, y2) 时线的终点。

所以画水平线的代码如下:

 

Graphics.drawLine(20, 100, 120, 100);

 

下面的例子组合了所有提到的技术。移动滑块展示不同的天气类型。

 

 

 

WeatherWizard demo 使用JSlider 组件以及很多图像功能生成和展示特定的天气类型。关于JSlider 类的更多用法,请参考Swing 教程中的如何使用Sliders 一节。

WeatherPainter 类的paint 方法实现了图像特性。以下代码使用setupWeatherReport() 绘制图像。

 

        ...

        origComposite = g2.getComposite();

        if (alpha0 != null) g2.setComposite(alpha0);

        g2.drawImage(img0,

                0, 0, size.width, size.height,

                 0, 0, img0.getWidth(null), img0.getHeight(null),

                null);

        if (img1 != null) {

            if (alpha1 != null) g2.setComposite(alpha1);

            g2.drawImage(img1,

                    0, 0, size.width, size.height,

                     0, 0, img1.getWidth(null), img1.getHeight(null),

                    null);

        }

        ...

 

setFont 和drawString 方法渲染了温度和天气条件。

 

        ...

        // Freezing, Cold, Cool, Warm, Hot,

        // Blue, Green, Yellow, Orange, Red

        Font font = new Font("Serif", Font.PLAIN, 36);

        g.setFont(font);

       

        String tempString = feels + " " + temperature+"F";

        FontRenderContext frc = ((Graphics2D)g).getFontRenderContext();

        ...

        g.setColor(textColor);

         int xTextTemp = rX-(int)boundsTemp.getX();

        int yTextTemp = rY-(int)boundsTemp.getY();

        g.drawString(tempString, xTextTemp, yTextTemp);

       

        int xTextCond = rX-(int)boundsCond.getX();

        int yTextCond = rY-(int)boundsCond.getY() + (int)boundsTemp.getHeight();

        g.drawString(condStr, xTextCond, yTextCond);

 

fillRect 方法允许您使用指定颜色绘制矩形。

 

        ...

        Rectangle2D boundsTemp = font.getStringBounds(tempString, frc);

        Rectangle2D boundsCond = font.getStringBounds(condStr, frc);

        int wText = Math.max((int)boundsTemp.getWidth(), (int)boundsCond.getWidth());

        int hText = (int)boundsTemp.getHeight() + (int)boundsCond.getHeight();

        int rX = (size.width-wText)/2;

        int rY = (size.height-hText)/2;

       

        g.setColor(Color.LIGHT_GRAY);

        g2.fillRect(rX, rY, wText, hText);

    ...

 

您可以通过修改WeatherWizard demo 的方法改变图像内容。例如,使用fillRoundRect 取代fillRect ,或者使用其他字体。

java2d(中文教程) java2d(中文教程)真不好找啊。 希望能给大家带来帮助 . 立即下载

相关推荐

JAVA标准教程新手学习讲义

好好好好好好好好好好 书书书书书书书书书书

html5的canvas知识总结(7)clip、globalCompositeOperation、drawImage、toDataURL、getImageData、putImageData

复习知识: beginPath() :开启一个新的路径,在画直线的时候,需要开启一个新的路径,在上一个路径下,移动画笔位置 closePath():闭合路径,在画图的时候,直接将未连接的图形,闭合连接 1. clip() 方法:从原始画布中剪切任意形状和尺寸 注意:clip()方法会将他上面代码所绘制的图形的区域裁剪,在裁剪区内的内容会显示,裁剪区之外的内容不会显示。 用begi...

zyz00000000的博客 2180

java绘制印章图片(圆形)

使用jdk的绘图工具来绘制印章,该代码中只绘制了圆形印章,印章中的内容包括公司名称、中间的五角星以及印章的类型

java绘图

java绘图坐标体系 1.在java坐标系中,第一个是x坐标,表示当前位置为水平方向。距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 2.像素点越多描述的图像信息也越多,更多的去展示图像 3.计算机的屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如400×300;表示计算机屏幕上的每一行由400个点组成,共有300行。整个计算机屏幕共有320000个像素,像素是一个密度单位。 绘图入门和机制 java绘图技术绘图原理 √Component类提供了两个和绘

weixin_46065214的博客 2875

Java编程标准教程

新生学习Java不错的教程,图文并茂,讲解既通俗易懂,又有详细深刻的部分

深入解析SAP MM模块OBYC自动科目分配机制:从T030表到实战配置

本文深入解析SAP MM模块中OBYC自动科目分配机制,阐明其作为连接物流与财务核心桥梁的作用。文章以T030表为核心,详细拆解其字段结构与检索逻辑,并通过采购收货、生产发料等实战场景,手把手演示配置步骤与关键要点,帮助读者掌握从原理到实践的完整知识体系,实现业财无缝对接。

nft7creator的博客 358

Java绘图

java绘图

qq_53573029的博客 8514

保姆级教程:用ROS2 Humble + Gazebo Classic 从零搭建一个能键盘控制的差分AGV模型

本文提供了一份详细的ROS2 Humble与Gazebo Classic教程,指导用户从零开始搭建一个键盘控制的差分AGV模型。内容涵盖环境配置、Xacro文件设计、Gazebo仿真集成以及键盘控制实现,特别针对常见问题提供解决方案,帮助开发者快速掌握ROS2机器人仿真技术。

weixin_30387423的博客 169

Java标准教程:Java 2D绘图--第5章 使用图像

在概述一节中,图像使用宽度和高度描述,以像素为单位,有自己独立于绘图平面的坐标系。使用图像时有很多普通的任务。l         将图像外部的GIF, PNG JPEG 图像文件中加载到Java 2D 内部表示中。l         直接创建Java 2D 图像听且绘制它。l         在绘制平面中绘制Java 2D 图像的内容。l         将Java 2D 图像保存在外部的GIF, PNG, 或 JPEG 图像文件中。本课教您基本的加载,展示和保存图像的方法。使用图像

Uoooo的专栏 5238

AT32串口打印全攻略:从零搭建到printf重定向(GCC版)

本文详细介绍了在GCC编译环境下为AT32系列MCU实现串口打印与printf重定向的完整方案。针对从Keil MDK迁移到GCC工具链时常见的串口无输出问题,文章从环境搭建、USART配置入手,重点剖析了GCC下printf重定向的核心原理——通过重写_write()函数,并提供了经过验证的代码实现、常见问题排查及性能优化建议。

weixin_29163797的博客 265

Kafka延迟队列实现方案全解析

$ \text{时间轮} = \text{环形数组} + \text{分层设计} $$需要补充代码实例或特定场景的优化方案可进一步细化,此大纲已覆盖核心技术路径。

lz989796的博客 817

java 2d 绘图教程_Java标准教程:Java 2D绘图--第2章 从绘图开始

Java标准教程:Java 2D绘图--第2章从绘图开始Java 2D API是强大并且复杂的。然而,大多数Java 2D API只用到了封装在java.awt.Graphic类中的功能的自己。本节描述了应用程序开发者最普遍的需要。其他在后续的高级主题中描述。大多数Graphics类可以分成以下的基本部分:●绘制和填充方法,可以让您渲染基本的形状,文本,图像●属性设置方法,影响如何绘制和填充。se...

weixin_32389853的博客 378

QEMU pcie config空间访问机制

而pci_host_conf/data_le_ops的定义是在hw/pci/pci-host.c里,对于0xCF8端口的处理,因为是地址选通,所以只需要在write的时候记录、read的时候返回记录的值即可。而pci_host_config_write/read_common接口,在前256Bconfig空间的模拟中,也同样是会调用这个接口,所以后续的处理都是一样的。这是真实的硬件设计,而对于QEMU+KVM的虚机场景,显然是要基于硬件实现和虚拟化的需求设计虚机访问config空间的完整流程。

leiyanjie8995的博客 1953

Java标准教程:Java 2D绘图--第1章 Java 2d API概念概述

Java 2D API 通过扩展抽象窗口工具箱(AWT ),为Java 程序提供了二维图像,文本和图形的功能。这个复杂的渲染包支持线形图像,文本和图形,为富用户界面,复杂绘图程序和图像处理器开发者提供灵活的,功能强大的框架。Java 2D 对象出现在一个平面中,称为用户坐标系空间

caixiexin的专栏 3325

最全教程cadence建立个人CIS数据库

此时如果你删除office365,再装Access数据库,可以安装上,然后你再装office365,系统又会把Access软件给你删除掉,因为冲突了。可以在自己的电脑上新建CIS库,主要包含下面几个内容:数据库文件,原理图封装,PCB封装,数据手册,另外建议做一个器件命名的说明。allegro在调用封装的时候,是看的.psm文件,而不是.dra文件,因此只要是c0402.psm,那么所有的内容都要保持一致。(1)文件夹不要有中文,不要有空格,否则无法识别,可以参考博主的方式,全部使用英文输入法下划线。

D_Katter的博客 253

化工设计软件:PDMS二次开发_(7).数据导入与导出技术

在某些复杂场景下,PDMS提供的标准API接口可能无法满足需求。此时,可以通过自定义API接口来实现特定的数据导入与导出功能。自定义设备导入API接口可以处理更复杂的设备数据格式。# 导入必要的库import pdms_api # 假设有一个PDMS API库# 定义自定义设备数据# 自定义设备导入API接口# 调用自定义设备导入API接口# 输出导入成功的消息print("自定义设备数据导入成功")在PDMS二次开发中,数据的导入与导出是关键的技术环节。

kkchenjj的博客 1486

Java标准教程:Java 2D绘图--第3章 基本几何图形

在之前的课程中,您已经学习了绘图的基本概念,包括坐标系和graphic 对象创建的基本信息。现在,您将了解2D 绘图类的更详细的信息。本科展示如何使用Graphics2D 类绘制基本的几何图形和任意的形状,以及如何使用花哨的轮廓和填充风格展示图形。这些主题分为以下几个章节。l

caixiexin的专栏 1621

LDRA Testbed软件静态分析_操作指南

从本文起,将开始LDRA Testbed(TBrun)教程的系列文章,包括软件静态分析、单元测试、集成测试,以及基于Testbed的自动化工具开发、持续集成、常见问题解答等。LDRA公司是专业的软件测试工具与测试技术、咨询服务提供者,其总部位于英国利物浦。其旗舰产品Testbed/TBrun功能全面、易于使用,不仅适合于主机平台软件测试,同时适合于嵌入式软件测试。不仅能进行软件静态测试,还能进行软件单元测试、软件集成测试,在白盒测试领域运用比较广泛。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1万+

在Java中使用Draw2D和SWT绘图

用 Java绘图一直都吸引着开发人员的注意。传统上,Java 开发人员使用 java.awt.Graphics 或 Java 2D API 进行绘图。一些开发人员甚至使用现成的开源工具箱(如 JSci)来绘图。但很多时候,您的选择被限定在了 AWT 或 Swing 上。为了最大限度地减少对第三方工具箱的依赖,或者为了简化绘图基础,可以考虑使用 Draw2D,并编写自己的代码来制图或绘图。 Dr

风斗士 1853

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java 2d绘图 stroke_Java标准教程:Java 2D绘图--第4章使用Text

Java标准教程:Java 2D绘图--第4章使用Text本节介绍文本API的用法,以及他们的渲染能力。至今为止,您已经有了基本的Java 2D文本API,同时知道如何设置字体和位置,以及绘制文本。本节扩展了这些知识,同时更深入的介绍了Java 2D文本展示的知识。这些主题在以下几个部分中讨论。●选择字体本节介绍如何使用Font类中的方法决定系统中存在哪些字体,创建一个Font对象,同时从字体家族...

weixin_28738165的博客 279

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[转载]在Java中使用Draw2D和SWT绘图

在Java中使用Draw2D和SWT绘图用 Java绘图一直都吸引着开发人员的注意。传统上,Java 开发人员使用 java.awt.Graphics 或 Java 2D API 进行绘图。一些开发人员甚至使用现成的开源工具箱(...

congji3817的博客 508

深度学习工具包 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")

上一篇: Java标准教程:Java 2D绘图--第1章 Java 2d API概念概述
下一篇: Java标准教程:Java 2D绘图--第3章 基本几何图形
kavoe
博客等级 码龄24年 17粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值