首页 > 其他分享 >安卓之图形绘制的应用场景以及各种技术优劣分析

安卓之图形绘制的应用场景以及各种技术优劣分析

时间:2024-01-06 13:31:45浏览次数:24  
标签:优劣 安卓 Paint 2.2 import 图形 绘制 public

一、文章摘要

安卓系统作为全球最流行的移动操作系统之一,其图形绘制功能在各种应用场景中发挥着重要作用。无论是创意绘图、教育应用、游戏开发还是虚拟现实,图形绘制都是关键的一环。本文将深入探讨安卓图形绘制的应用场景,并分析各种技术的优劣,同时附上相关代码示例。

二、正文

2.1、应用场景

2.1.1、创意绘图

安卓平台上的图形绘制应用最直观的应用场景便是创意绘图。用户可以通过简单的触摸或手势,在安卓设备上自由地绘制、涂鸦或进行其他形式的创意表达。这类应用广泛应用于儿童教育、艺术创作以及个人表达等领域。

2.1.2、教育领域

在教育领域,图形绘制应用扮演着重要的角色。例如,生物学中的细胞结构、地理学中的地形地貌等复杂概念或过程,可以通过图形绘制应用进行直观展示,帮助学生更好地理解。

2.1.3、游戏开发

游戏开发中,图形绘制技术至关重要。它用于创建丰富的游戏场景、角色和道具等,为玩家提供沉浸式的游戏体验。

2.1.4、虚拟现实和增强现实

在虚拟现实和增强现实中,图形绘制技术同样发挥了巨大作用。它用于创建逼真的虚拟环境,增强用户的沉浸感,提高虚拟现实和增强现实的真实感。

2.1.5、图像处理

在图像处理中,图形绘制用于实现各种效果,如滤镜、特效等。

2.1.6、动画制作

在动画制作中,图形绘制用于实现各种动态效果,如渐变、关键帧动画等。

2.2、技术优劣分析

2.2.1、Canvas

Canvas是安卓中最基本的图形绘制类,它提供了一组API用于在屏幕上绘制图形。常用于在天气应用中绘制温度和天气图标、绘制自定义UI控件、游戏界面的基本元素等。

2.2.1.1、优点

简单易用,提供了基础的绘图功能,如画线、画圆、绘制文本等。

性能稳定,对于简单的图形操作,基础绘图API具有较好的性能表现。

2.2.1.2、缺点

性能较低,不适合复杂的图形绘制需求。

对于高级的视觉效果,可能需要更多的自定义和优化。

2.2.1.3、代码示例
public class MyView extends View {
    private Paint mPaint;

    public MyView(Context context) {
        super(context);
        init();
    }

    private void init() {
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
    }
}

2.2.2、Bitmap

Bitmap是一种可以存储图像数据的类,它可以将图像数据加载到内存中,然后通过Canvas进行绘制。常用于绘制背景图、头像等。

2.2.2.1、优点

可以实现复杂的图形绘制和动画效果。

2.2.2.2、缺点

占用大量内存,不适合处理大尺寸图片。

2.2.2.3、代码示例
public class MyView extends View {
    private Bitmap mBitmap;
    private Canvas mCanvas;
    private Paint mPaint;

    public MyView(Context context) {
        super(context);
        init();
    }

    private void init() {
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
        mCanvas = new Canvas(mBitmap);
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mCanvas.drawRect(0, 0, mBitmap.getWidth(), mBitmap.getHeight(), mPaint);
    }
}

2.2.3、SVG

SVG(Scalable Vector Graphics)是一种基于XML的矢量图形格式,它可以实现高质量的二维图形绘制,自适应不同屏幕尺寸和分辨率的场景,如品牌推广素材或响应式设计等。

2.2.3.1、优点

可以实现无限缩放而不失真。

2.2.3.2、缺点

不支持交互式操作。

对于复杂的图形或动画,矢量图形可能不如其他技术灵活。

2.2.3.3、代码示例

将第三方库AndroidSVG库添加到项目的build.gradle文件中:

dependencies {
    implementation 'com.caverock:androidsvg-aar:1.4'
}

然后进行绘制
import android.graphics.Canvas;
import android.graphics.Paint;
import com.caverock.androidsvg.SVG;
import com.caverock.androidsvg.SVGParseException;

public class SvgToPathExample {

    public void drawSvgOnCanvas(Canvas canvas, String svgAssetPath) {
        try {
            // 加载SVG资源
            SVG svg = SVG.getFromResource(context.getResources(), R.drawable.your_svg_file);

            // 获取SVG的根元素,它包含了图形的所有路径信息
            SVGLength height = svg.getDocumentHeight();
            SVGLength width = svg.getDocumentWidth();

            // 创建一个足够大的画布区域来适应SVG大小
            canvas.save();
            canvas.translate(0, 0); // 调整坐标系以使SVG居中或放置在合适位置
            canvas.clipRect(0, 0, width.getValue(), height.getValue());

            // 将SVG中的所有路径转换并绘制到Canvas上
            for (SVGDrawable drawable : svg.getDrawableRoot().getChildren()) {
                if (drawable instanceof SVGShape) {
                    SVGShape shape = (SVGShape) drawable;
                    Path path = shape.getPath(); // 获取SVG形状的Path对象

                    // 创建Paint对象,并设置颜色、填充模式等属性
                    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
                    paint.setColor(Color.BLACK); // 设置颜色
                    paint.setStyle(Paint.Style.FILL); // 设置填充样式

                    // 在Canvas上绘制Path
                    canvas.drawPath(path, paint);
                }
            }

            canvas.restore();

        } catch (SVGParseException e) {
            e.printStackTrace();
        }
    }
}

// 使用示例:
drawSvgOnCanvas(yourCanvas, "your_svg_asset_path");

2.2.4、OpenGL ES

OpenGL ES(Open Graphics Library for Android)是一种基于OpenGL的跨平台图形API,它可以实现高性能的3D图形绘制、高性能游戏引擎开发、3D建模与可视化应用程序、实时图形渲染和数据可视化等。

2.2.4.1、优点

可以实现实时渲染。

强大的3D渲染能力:能够实现逼真的3D效果。

高效性能:适用于需要高帧率的应用,如游戏。

2.2.4.2、缺点

学习成本较高。

对于简单的2D图形操作,OpenGL ES可能会过于复杂和冗余。

2.2.4.3、代码示例
public class MyView extends View implements GLSurfaceView.Renderer {
    private Triangle mTriangle;
    private GLES20 mGLES20;

    public MyView(Context context) {
        super(context);
        init();
    }

    private void init() {
        mTriangle = new Triangle();
        mGLES20 = (GLES20) EGLContext.getEGL().getCurrentContext();
    }

    @Override
    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        mGLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

    @Override
    public void onDrawFrame(GL10 unused) {
        mGLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
        mTriangle.draw();
    }
}

2.2.5、Vector Drawable

Vector Drawable是一种基于XML描述的矢量图形资源,它可以自动适配不同分辨率的设备并保持清晰度。可以绘制应用程序图标、界面元素、简单动画等。

2.2.5.1、优点

自动缩放:在不同分辨率和屏幕密度下都能保持高质量显示。

文件小:相比于多个分辨率的PNG图片,矢量图资源文件更轻量级。

2.2.5.2、缺点

有限的特性支持:不支持所有SVG特性,尤其是一些高级功能。

在旧版本Android系统上兼容性问题:低于API 21的设备需要额外库支持才能高效渲染。

2.2.5.3、代码示例
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17v-2.28l7.07,-7.07L19,8.5l-7.07,7.07v2.28L10,17z" />
</vector>

2.2.6、Shape Drawable

Shape Drawable是Android中用于绘制形状的类,它可以用于创建各种形状,如矩形、圆形、椭圆形等。为按钮、文本框、卡片等UI控件设置定制的纯色、渐变色或者带圆角的背景。

2.2.6.1、优点

简单易用:Shape Drawable使用XML文件定义形状,可以轻松地在布局文件中引用和调整大小。

支持硬件加速:Shape Drawable可以直接利用硬件加速功能,提高性能。

可定制性:可以通过设置Shape Drawable的属性,如颜色、填充类型等,来实现个性化的效果。

2.2.6.2、缺点

功能有限:Shape Drawable仅支持基本的形状和渐变,不支持复杂的自定义效果。

内存占用:由于Shape Drawable是基于位图的,因此会占用一定的内存空间。

2.2.6.3、代码示例
在XML布局文件中定义一个View:
<View  
    android:layout_width="200dp"  
    android:layout_height="200dp"  
android:background="@drawable/shape_drawable" />

在res/drawable目录下创建一个名为shape_drawable.xml的文件,并添加以下内容:
<shape xmlns:android="http://schemas.android.com/apk/res/android">  
    <gradient  
        android:startColor="#FF0000"  
        android:endColor="#0000FF"  
        android:angle="90" />  
    <solid android:color="#FFFFFF" />  
    <corners android:radius="10dp" />  
</shape>

2.2.7、OpenCV

现代图形绘制应用经常涉及到图像处理和计算机视觉技术,如滤镜、特效、图像识别等。这些技术可以使用Android的Camera2 API、OpenCV等库来实现。

2.2.7.1、优点

功能丰富,效果多样;

2.2.7.2、缺点

需要处理图像数据,可能会增加内存和计算负担。

2.2.7.3、代码示例

可以从OpenCV下载相关的包下来,然后导入项目或者直接在build.gradle中配置依赖也可以。

// 导入所需的OpenCV库
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

// 在你的Activity或者自定义类中操作
public class OpenCVDrawExample extends AppCompatActivity {

    private Mat mRgba; // 声明一个Mat对象用于存储图像

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建一个空白图像
        mRgba = new Mat(480, 640, CvType.CV_8UC4); // 4通道图像,也可以用CV_8UC3创建3通道图像

        // 绘制一个矩形
        Point rectStartPoint = new Point(100, 100);
        Point rectEndPoint = new Point(300, 300);
        Rect rectangle = new Rect(rectStartPoint, rectEndPoint);

        Scalar color = new Scalar(0, 255, 0, 255); // 绿色填充(对于4通道)
        int thickness = 2; // 边框粗细
        int lineType = Imgproc.LINE_AA; // 抗锯齿线型

        Imgproc.rectangle(mRgba, rectangle.tl(), rectangle.br(), color, thickness, lineType);

        // 将结果显示到ImageView中(假设你有一个名为imageView的ImageView控件)
        ImageView imageView = findViewById(R.id.imageView);
        Bitmap bitmap = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(mRgba, bitmap);
        imageView.setImageBitmap(bitmap);
    }
}

这段代码首先创建了一个空白的4通道RGBA图像,并在其上绘制了一个绿色填充边框的矩形。最后将处理后的图像转换为Bitmap格式,以便显示在Android的ImageView组件上。

2.2.8、React Native

一些跨平台的图形绘制框架如React Native、Flutter等也可以在安卓上使用。这些框架通常提供了一套统一的API来编写跨平台应用。

2.2.8.1、优点

开发效率高,易于维护;

2.2.8.2、缺点

可能牺牲一些原生性能和定制性。

三、总结

安卓图形绘制技术在各个领域都有广泛的应用,从创意绘图到游戏开发,再到虚拟现实和增强现实。

在选择技术方案时,开发者需根据具体需求权衡各种因素的优劣,如性能、兼容性、开发难度和成本等。通过深入了解和应用这些技术,开发者能够创造出更多富有创意和价值的安卓图形绘制应用。如对于简单的图形绘制需求,可以使用Canvas;对于复杂的图形绘制和动画效果,可以使用Bitmap或SVG;对于高性能的3D图形绘制,可以使用OpenGL ES。在实际使用场景中,可以根据应用的需求选择合适的图形绘制技术。

展望未来,随着技术的进步,我们期待更加高效和灵活的图形绘制解决方案的出现,以满足不断变化的用户需求和设备性能。

标签:优劣,安卓,Paint,2.2,import,图形,绘制,public
From: https://blog.51cto.com/u_16423321/9127184

相关文章

  • Python 通过 akshare 绘制中国平安均线并显示买卖点
    继续上篇,通过akshare绘制中国平台的均线,并在5日线上穿10日线的时候,显示买入信号,在5日线下穿10日均线的时候,显示卖出信号环境:python3.9(miniconda3)、Pycharm、Win10需要用的模块或者工具库:akshare(1.11.91)、pandas(2.1.1)、numpy(1.26.2)、matplotlib(3.8.2)、mplfinanc......
  • 教学/直播/会议触摸一体机定制_基于紫光展锐T820安卓核心板方案
    触控一体机是一种集先进的触摸屏、工控、计算机等技术于一体的智能设备。传统的键盘鼠标输入功能被触摸屏所取代,触摸一体机过去主要应用于工业领域,而如今则广泛运用于课堂教学、培训、工业、会议、直播、高新科技展示等场合。它的应用使得教学、大会和展示活动可以更加互动和信......
  • notepad 记事本 - 大三下安卓课程设计+源代码+文档说明
    项目介绍基本功能:1.添加时间戳2.搜索功能附加功能:1.UI美化:设置背景颜色、设置字体颜色及大小2.导出笔记3.设置闹钟提醒4.分享笔记以下是实现功能的核心代码及解释:界面预览项目备注1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!2、本项目适合计算机相......
  • android大作业-安卓音乐播放器+源代码+文档说明+演示视频
    项目介绍android大作业-安卓音乐播放器+源代码+文档说明+演示视频项目里包含了登陆注册的实现、音乐的识别播放暂停等功能、数据库的创建及使用(SQLite)、自定义适配器、activity、service、intent、broadcastreceiver四大组件以tabhost等一系列控件。界面预览项目备注1、该资源内项......
  • 安卓期末小项目TrackTable收支表+源码
    一、需求分析这是一款账目记录、分析App,本系统主要功能有:用户登录注册、首页账单分析、上传账单、搜索账单信息、个人信息、重置密码、数据效验。系统功能图系统总用例图二、系统开发平台环境IDE:AndroidStudio 2021.1.x插件:simpleUMLCE工具:Visustinv8DemoJava版本:Java11OS:win11......
  • WPF中使用OxyPlot动态绘制曲线图
    安装Nuget包:Install-PackageOxyPlot.WpfXAML代码:<Windowx:Class="OxyPlotDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"......
  • 人机交互主板定制_基于联MT8735安卓核心板的自助查询机/触摸一体机方案
    人机交互主板是一种商用智能终端主板,主要用于各种场景下的人机交互应用。它广泛适用于广告机、工控一体机、教学一体机、智能自助终端、考勤机、智能零售终端、O2O智能设备、取号机、计算机视觉、医疗健康设备以及机器人设备等。这款人机交互主板采用了联发科MTK8735芯片平......
  • 无涯教程-Seaborn - 绘制宽数据表
    始终最好使用"long-from"或"tidy"的数据集,但有时无涯教程别无选择,只能使用"wide-form"数据集,同样的功能也可以应用于多种格式的"wide-form"数据,包括Pandas数据框或二维NumPy数组。这些对象应直接传​​递给data参数,x和y变量必须指定为字符串importpandasaspdimportseaborn......
  • iOS苹果和Android安卓测试APP应用程序的差异
    Hello大家好呀,我是咕噜铁蛋!我们经常需要关注移动应用程序的测试和优化,以提供更好的用户体验。在移动应用开发领域,iOS和Android是两个主要的操作系统平台。本文铁蛋讲给各位小伙伴们详细介绍在App测试中iOS和Android的差异,帮助你更好地理解并应对这些差异,以提高你的应用程序的质量和......
  • 安卓之数据存储管理的使用场景以及技术优劣分析
    一、文章摘要在安卓应用开发中,数据存储管理是关键环节之一,涉及到用户数据的持久化、应用程序状态的保存以及离线内容的缓存等场景。本文将探讨安卓数据存储管理的使用场景、应用前景,以及各种技术的优劣分析,同时附上相关代码示例。二、正文2.1、使用场景2.1.1、用户设置应用程序中的......