iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android中常见的图形绘制方式有哪些
  • 370
分享到

Android中常见的图形绘制方式有哪些

2023-06-20 13:06:30 370人浏览 安东尼
摘要

这篇文章主要讲解了“Android中常见的图形绘制方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android中常见的图形绘制方式有哪些”吧!目录图形绘制概述View + canv

这篇文章主要讲解了“Android中常见的图形绘制方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android中常见的图形绘制方式有哪些”吧!

目录
  • 图形绘制概述

  • View + canvas

  • SurfaceView + Canvas

  • TextureView + Canvas

  • SurfaceView + OpenGL ES

  • GLSurfaceView + OpenGL ES

  • TextureView + OpenGL ES

  • 总结

图形绘制概述

Android平台提供丰富的官方控件给开发者实现界面UI开发,但在实际业务中经常会遇到各种各样的定制化需求,这必须由开发者通过自绘控件的方式来实现。通常Android提供了Canvas和OpenGL ES两种方式来实现,其中Canvas借助于Android底层的Skia 2D向量图形处理函数库来实现的。具体如何通过Canvas和OpenGL来绘制图形呢?这必须依赖于Android提供的View类来具体实现,下面组合几种常见的应用方式,如下所示:

Canvas

  • View + Canvas

  • SurfaceView + Canvas

  • TextureView + Canvas

OpenGL ES

  • SurfaceView + OpenGL ES

  • GLSurfaceView + OpenGL ES

  • TextureView + OpenGL ES

View + Canvas

这是一种通常使用的自绘控件方式,通过重写View类的onDraw(Canvas canvas)方法实现。当需要刷新绘制图形时,调用invalidate()方法让View对象自身进行刷新。该方案比较简单,涉及自定义逻辑较少,缺点是绘制逻辑在UI线程中进行,刷新效率不高,且不支持3D渲染。

public class CustomView extends View {    public CustomView(Context context) {        super(context);    }     public CustomView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);    }     public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }     @Override    protected void onDraw(Canvas canvas) {        // draw whatever.    }}

SurfaceView + Canvas

这种方式相对于View + Canvas方式在于使用SurfaceView,因此会在Android的WMS系统上创建一块自己的Surface进行渲染绘制,其绘制逻辑可以在独立的线程中进行,因此性能相对于View + Canvas方式更高效。但通常情况下需要创建一个绘制线程,以及实现SurfaceHolder.Callback接口来管理SurfaceView的生命周期,其实现逻辑相比View + Canvas略复杂。另外它依然不支持3D渲染,且Surface因不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,SurfaceView 不能嵌套使用。

public class CustomSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {     private boolean mRunning = false;    private SurfaceHolder mSurfaceHolder;     public CustomSurfaceView(Context context) {        super(context);        initView();    }     public CustomSurfaceView(Context context, AttributeSet attrs) {        super(context, attrs);        initView();    }     public CustomSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView();    }     private void initView() {        getHolder().addCallback(this);    }     @Override    public void surfaceCreated(SurfaceHolder holder) {        mSurfaceHolder = holder;        new Thread(this).start();    }     @Override    public void surfaceChanged(SurfaceHolder holder, int fORMat, int width, int height) {        mSurfaceHolder = holder;    }     @Override    public void surfaceDestroyed(SurfaceHolder holder) {        mRunning = false;    }     @Override    public void run() {        mRunning = true;        while (mRunning) {            SystemClock.sleep(333);            Canvas canvas = mSurfaceHolder.lockCanvas();            if (canvas != null) {                try {                    synchronized (mSurfaceHolder) {                        onRender(canvas);                    }                } finally {                    mSurfaceHolder.unlockCanvasAndPost(canvas);                }            }        }    }     private void onRender(Canvas canvas) {        // draw whatever.    }}

TextureView + Canvas

该方式同SurfaceView + Canvas方式有些类似,但由于它是通过TextureView来实现的,所以可以摒弃Surface不在View hierachy中缺陷,TextureView不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。这种方式也有自身缺点,它必须在硬件加速的窗口中才能使用,占用内存比SurfaceView要高,在5.0以前在主UI线程渲染,5.0以后有单独的渲染线程。

public class CustomTextureView extends TextureView implements TextureView.SurfaceTextureListener, Runnable {     private boolean mRunning = false;    private SurfaceTexture mSurfaceTexture;    private Surface mSurface;    private Rect mRect;     public CustomTextureView(Context context) {        super(context);        initView();    }     public CustomTextureView(Context context, AttributeSet attrs) {        super(context, attrs);        initView();    }     public CustomTextureView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView();    }     private void initView() {        setSurfaceTextureListener(this);    }     @Override    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {        mSurfaceTexture = surface;        mRect = new Rect(0, 0, width, height);        mSurface = new Surface(mSurfaceTexture);        new Thread(this).start();    }     @Override    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {        mSurfaceTexture = surface;        mRect = new Rect(0, 0, width, height);        mSurface = new Surface(mSurfaceTexture);    }     @Override    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {        mRunning = false;        return false;    }     @Override    public void onSurfaceTextureUpdated(SurfaceTexture surface) {     }     @Override    public void run() {        mRunning = true;        while (mRunning) {            SystemClock.sleep(333);            Canvas canvas = mSurface.lockCanvas(mRect);            if (canvas != null) {                try {                    synchronized (mSurface) {                        onRender(canvas);                    }                } finally {                    mSurface.unlockCanvasAndPost(canvas);                }            }        }    }     private void onRender(Canvas canvas) {        canvas.drawColor(Color.RED);        // draw whatever.    }}

以上都是2D图形渲染常见的方式,如果想要进行3D图形渲染或者是高级图像处理(比如滤镜、AR等效果),就必须得引入OpenGL ES来实现了。OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 api 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,是一种图形渲染API的设计标准,不同的软硬件开发商在OpenGL API内部可能会有不同的实现方式。

下面介绍一下在Android平台上,如何进行OpenGL ES渲染绘制,通常有以下三种方式:

SurfaceView + OpenGL ES

EGL是OpenGL API和原生窗口系统之间的接口,OpenGL ES 的平台无关性正是借助 EGL 实现的,EGL 屏蔽了不同平台的差异。如果使用OpenGL API来绘制图形就必须先构建EGL环境。

通常使用 EGL 渲染的一般步骤:

- 获取 EGLDisplay对象,建立与本地窗口系统的连接调用eglGetDisplay方法得到EGLDisplay。

- 初始化EGL方法,打开连接之后,调用eglInitialize方法初始化。

- 获取EGLConfig对象,确定渲染表面的配置信息调用eglChooseConfig方法得到 EGLConfig。

- 创建渲染表面EGLSurface通过EGLDisplay和EGLConfig,调用eglCreatewindowsurface或eglCreatePbufferSurface方法创建渲染表面得到EGLSurface。

- 创建渲染上下文EGLContext通过EGLDisplay和EGLConfig,调用eglCreateContext方法创建渲染上下文,得到EGLContext。

- 绑定上下文通过eglMakeCurrent 方法将 EGLSurface、EGLContext、EGLDisplay 三者绑定,绑定成功之后OpenGLES环境就创建好了,接下来便可以进行渲染。

- 交换缓冲OpenGLES 绘制结束后,使用eglSwapBuffers方法交换前后缓冲,将绘制内容显示到屏幕上,而屏幕外的渲染不需要调用此方法。

- 释放EGL环境绘制结束后,不再需要使用EGL时,需要取消eglMakeCurrent的绑定,销毁 EGLDisplay、EGLSurface、EGLContext三个对象。

以上EGL环境构建比较复杂,这里先不做过多解释,下面可以通过代码参考其具体实现:

public class OpenGLSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {    private boolean mRunning = false;    private SurfaceHolder mSurfaceHolder;     public OpenGLSurfaceView(Context context) {        super(context);        initView();    }     public OpenGLSurfaceView(Context context, AttributeSet attrs) {        super(context, attrs);        initView();    }     public OpenGLSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView();    }     private void initView() {        getHolder().addCallback(this);    }     @Override    public void surfaceCreated(SurfaceHolder holder) {        mSurfaceHolder = holder;        new Thread(this).start();    }     @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        mSurfaceHolder = holder;    }     @Override    public void surfaceDestroyed(SurfaceHolder holder) {        mRunning = false;    }     @Override    public void run() {        //创建一个EGL实例        EGL10 egl = (EGL10) EGLContext.getEGL();        //        EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);        //初始化EGLDisplay        int[] version = new int[2];        egl.eglInitialize(dpy, version);         int[] configSpec = {                EGL10.EGL_RED_SIZE,      5,                EGL10.EGL_GREEN_SIZE,    6,                EGL10.EGL_BLUE_SIZE,     5,                EGL10.EGL_DEPTH_SIZE,   16,                EGL10.EGL_NONE        };         EGLConfig[] configs = new EGLConfig[1];        int[] num_config = new int[1];        //选择config创建opengl运行环境        egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config);        EGLConfig config = configs[0];         EGLContext context = egl.eglCreateContext(dpy, config,                EGL10.EGL_NO_CONTEXT, null);        //创建新的surface        EGLSurface surface = egl.eglCreateWindowSurface(dpy, config, mSurfaceHolder, null);        //将opengles环境设置为当前        egl.eglMakeCurrent(dpy, surface, surface, context);        //获取当前opengles画布        GL10 gl = (GL10)context.getGL();         mRunning = true;        while (mRunning) {            SystemClock.sleep(333);            synchronized (mSurfaceHolder) {                onRender(gl);                 //显示绘制结果到屏幕上                egl.eglSwapBuffers(dpy, surface);            }        }         egl.eglMakeCurrent(dpy, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);        egl.eglDestroySurface(dpy, surface);        egl.eglDestroyContext(dpy, context);        egl.eglTerminate(dpy);    }     private void onRender(GL10 gl) {        gl.glClearColor(1.0F, 0.0F, 0.0F, 1.0F);        // Clears the screen and depth buffer.        gl.glClear(GL10.GL_COLOR_BUFFER_BIT                | GL10.GL_DEPTH_BUFFER_BIT);    }}

从上面的代码可以看到,相对于SurfaceView + Canvas的绘制方式,主要有以下两点变化:

  • 在while(true)循环前后增加了EGL环境构造的代码

  • onRender()方法内参数用的是GL10而不是Canvas

GLSurfaceView + OpenGL ES

由于构建EGL环境比较繁琐,以及还需要健壮地维护一个线程,直接使用SurfaceView进行OpenGL绘制并不方便。幸好Android平台提供GLSurfaceView类,很好地封装了这些逻辑,使开发者能够快速地进行OpenGL的渲染开发。要使用GLSurfaceView类进行图形渲染,需要实现GLSurfaceView.Renderer接口,该接口提供一个onDrawFrame(GL10 gl)方法,在该方法内实现具体的渲染逻辑。

public class OpenGLGLSurfaceView extends GLSurfaceView implements GLSurfaceView.Renderer {    public OpenGLGLSurfaceView(Context context) {        super(context);        setRenderer(this);    }     public OpenGLGLSurfaceView(Context context, AttributeSet attrs) {        super(context, attrs);        setRenderer(this);    }     @Override    public void onSurfaceCreated(GL10 gl, EGLConfig config) {        // pass through    }     @Override    public void onSurfaceChanged(GL10 gl, int width, int height) {        gl.glViewport(0, 0, width, height);    }     @Override    public void onDrawFrame(GL10 gl) {        gl.glClearColor(1.0F, 0.0F, 0.0F, 1.0F);        // Clears the screen and depth buffer.        gl.glClear(GL10.GL_COLOR_BUFFER_BIT                | GL10.GL_DEPTH_BUFFER_BIT);    }}

TextureView + OpenGL ES

该方式跟SurfaceView + OpenGL ES使用方法比较类似,使用该方法有个好处是它是通过TextureView来实现的,所以可以摒弃Surface不在View hierachy中缺陷,TextureView不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。这里使用TextureView类在构建EGL环境时需要注意,传入eglCreateWindowSurface()的参数是SurfaceTexture实例。

public class OpenGLTextureView extends TextureView implements TextureView.SurfaceTextureListener, Runnable {    private boolean mRunning = false;    private SurfaceTexture mSurfaceTexture;     public OpenGLTextureView(Context context) {        super(context);        initView();    }     public OpenGLTextureView(Context context, AttributeSet attrs) {        super(context, attrs);        initView();    }     public OpenGLTextureView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView();    }     private void initView() {        setSurfaceTextureListener(this);    }     @Override    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {        mSurfaceTexture = surface;        new Thread(this).start();    }     @Override    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {        mSurfaceTexture = surface;    }     @Override    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {        mRunning = false;        return false;    }     @Override    public void onSurfaceTextureUpdated(SurfaceTexture surface) {     }     @Override    public void run() {        //创建一个EGL实例        EGL10 egl = (EGL10) EGLContext.getEGL();        //        EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);        //初始化EGLDisplay        int[] version = new int[2];        egl.eglInitialize(dpy, version);         int[] configSpec = {                EGL10.EGL_RED_SIZE,      5,                EGL10.EGL_GREEN_SIZE,    6,                EGL10.EGL_BLUE_SIZE,     5,                EGL10.EGL_DEPTH_SIZE,   16,                EGL10.EGL_NONE        };         EGLConfig[] configs = new EGLConfig[1];        int[] num_config = new int[1];        //选择config创建opengl运行环境        egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config);        EGLConfig config = configs[0];         EGLContext context = egl.eglCreateContext(dpy, config,                EGL10.EGL_NO_CONTEXT, null);        //创建新的surface        EGLSurface surface = egl.eglCreateWindowSurface(dpy, config, mSurfaceTexture, null);        //将opengles环境设置为当前        egl.eglMakeCurrent(dpy, surface, surface, context);        //获取当前opengles画布        GL10 gl = (GL10)context.getGL();         mRunning = true;        while (mRunning) {            SystemClock.sleep(333);            synchronized (mSurfaceTexture) {                onRender(gl);                 //显示绘制结果到屏幕上                egl.eglSwapBuffers(dpy, surface);            }        }         egl.eglMakeCurrent(dpy, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);        egl.eglDestroySurface(dpy, surface);        egl.eglDestroyContext(dpy, context);        egl.eglTerminate(dpy);    }     private void onRender(GL10 gl) {        gl.glClearColor(1.0F, 0.0F, 1.0F, 1.0F);        // Clears the screen and depth buffer.        gl.glClear(GL10.GL_COLOR_BUFFER_BIT                | GL10.GL_DEPTH_BUFFER_BIT);    }}

代码示例参考

GitHub.com/sunjinbo/hi…

感谢各位的阅读,以上就是“Android中常见的图形绘制方式有哪些”的内容了,经过本文的学习后,相信大家对Android中常见的图形绘制方式有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Android中常见的图形绘制方式有哪些

本文链接: https://www.lsjlt.com/news/296953.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中常见的图形绘制方式有哪些
    这篇文章主要讲解了“Android中常见的图形绘制方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android中常见的图形绘制方式有哪些”吧!目录图形绘制概述View + Canv...
    99+
    2023-06-20
  • Android中常见的图形绘制方式总结
    目录图形绘制概述 View + Canvas SurfaceView + Canvas TextureView + Canvas SurfaceView + OpenGL ES GL...
    99+
    2022-11-12
  • CSS图形绘制方法有哪些
    本篇内容介绍了“CSS图形绘制方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 正方形实时渲染...
    99+
    2022-10-19
  • Matplotlib绘制条形图的方法有哪些
    这篇文章主要介绍了Matplotlib绘制条形图的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Matplotlib绘制条形图的方法有哪些文章都会有所收获,下面我们一起来看看吧。import ...
    99+
    2023-06-29
  • Android常见的图片压缩方式有哪些
    小编给大家分享一下Android常见的图片压缩方式有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先给出一组数据原图:width:2976; height:2976原图实际:--->byte:2299820 Mb...
    99+
    2023-06-15
  • android绘制圆形图片的两种方式示例
    android绘制圆形图片的两种方式 看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在...
    99+
    2022-06-06
    示例 图片 Android
  • CSS绘制三角形的方法有哪些
    本篇内容主要讲解“CSS绘制三角形的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS绘制三角形的方法有哪些”吧!使用 border 绘制三角形使用 border 实现三角形应该是大...
    99+
    2023-07-05
  • JS常见的API扩展形式有哪些
    本文小编为大家详细介绍“JS常见的API扩展形式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“JS常见的API扩展形式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2022-10-19
  • 有哪些常见换ip的方式
    这篇文章主要介绍“有哪些常见换ip的方式”,在日常操作中,相信很多人在有哪些常见换ip的方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些常见换ip的方式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-20
  • appium中常见的点击方式有哪些
    小编给大家分享一下appium中常见的点击方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先从appium库里面导入webdriver,然后webdri...
    99+
    2023-06-29
  • Python中有哪些常见的加密方式
    Python中有哪些常见的加密方式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的B...
    99+
    2023-06-02
  • 常见的HashMap迭代方式有哪些
    这篇文章主要介绍了常见的HashMap迭代方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇常见的HashMap迭代方式有哪些文章都会有所收获,下面我们一起来看看吧。一、 HashMap介绍HashMap...
    99+
    2023-06-27
  • 常见的DDOS攻击方式有哪些
    常见的DDOS攻击方式有:1、SYN/ACK Flood攻击,通过向受害主机发送大量伪造源IP和源端口的SYN或ACK包,导致主机缓存资源被耗尽或忙于发送回应包而造成拒绝服务;2、TCP全连接攻击,通过许多僵尸主机不断与受害服务器建立大量的...
    99+
    2022-10-09
  • python中matplotlib指定绘图颜色的方式有哪些
    这篇文章给大家分享的是有关python中matplotlib指定绘图颜色的方式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用matplotlib的pyplot库进行绘图时,经常会发现各种开源代码指定“...
    99+
    2023-06-29
  • 负载均衡常见的方式有哪些
    负载均衡常见的方式有以下几种:1. 基于网络层的负载均衡:通过路由器或交换机等网络设备,根据目标IP地址或端口号来分发请求。常见的网...
    99+
    2023-09-01
    负载均衡
  • 有哪些常见的网络推广方式
    本篇文章给大家分享的是有关有哪些常见的网络推广方式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。网络推广(web promotion)是以企业产品或服务为核心内容,建立网站、A...
    99+
    2023-06-14
  • 美国服务器常见的远程控制方式有哪些
    美国服务器常见的远程控制方式有:1、点对点远程控制,该方式指的一个客户端在同一时间内只能远程控制一台美国服务器;2、点对多远程控制,这种方式是指可以在同一时间内远程控制多台美国服务器。具体内容如下:点对点的远程控制点对点的远程控制指的是一个...
    99+
    2022-10-17
  • Python中实现单例模式的常见方式有哪些
    Python 中实现单例模式的几种常见方式元类(Metaclass):class SingletonType(type): """ 单例元类。用于将普通类转换为单例类。 "&q...
    99+
    2023-05-14
    Python
  • 使用python中的turtle库绘制常见图形(三角形、正方形、五边形、六边形、圆、同心圆、边切圆、奥运五环)
    使用python中的turtle库绘制常见图形 前言 本文主要介绍一些python的turtle库中绘制常见图形的方法,如三角形、正方形、五边形、圆。还有奥运五环、同心圆、边切圆、蟒蛇等图形的画法。 ...
    99+
    2023-09-29
    python 开发语言 pycharm
  • 常见的字符串常量表示方式有哪些?
    字符串常量是程序中使用的固定文本值。在大多数编程语言中都有不同的方法来表示字符串常量。下面将介绍一些常见的字符串常量表示方法,并给出具体的代码示例。单引号表示法:在一些编程语言中,可以使用单引号括起来的字符来表示字符串常量。这种表示方法通常...
    99+
    2023-12-27
    字符串常量 表示方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作