热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android游戏开发之Canvas画布的介绍及方法

Android游戏开发之Canvas画布的介绍及方法,需要的朋友可以参考一下

Canvas,在英语中,这个单词的意思是帆布。在Android中,则把Canvas当做画布,只要我们借助设置好的画笔(Paint类)就可以在画布上绘制我们想要的任何东西;另外它也是显示位图(Bitmap类)的核心类。随用户的喜好,Canvas还可设置一些关于画布的属性,比如,画布的颜色、尺寸等。Canvas提供了如下一些方法:
    Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。
    Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为null。
    Canvas(GL gl): 在绘制3D效果时使用,与OpenGL相关。
    drawColor: 设置Canvas的背景颜色。
    setBitmap:  设置具体画布。
    clipRect: 设置显示区域,即设置裁剪区。
    isOpaque:检测是否支持透明。
    rotate:  旋转画布
    translate:移动画布

    scale:缩放画布
    setViewport:  设置画布中显示窗口。
    skew:  设置偏移量。

    restore: 用来恢复上一次save之前的状态

    save:用来保存Canvas的当前状态

    注意: save方法、restore方法一般是成对出现的,save方法可多于restore方法,但restore方法不能多于save方法

    上面列举了几个常用的方法。在游戏开发中,我们可能需要对某个精灵执行旋转、缩放和一些其它操作。我们可以通过旋转画布来实现,但是旋转画布时会旋转画布上的所有对象,而我们只是需要旋转其中的一个,这时就需要用到save 方法来锁定需要操作的对象,在操作之后通过 restore 方法来解除锁定。


得到canvas画布对象

代码如下:

Canvas canvas = getHolder().lockCanvas();

画布的一些属性和方法以及一些应用
代码如下:

if (canvas != null) {
    //----设置画布绘图无锯齿
    canvas.setDrawFilter(pfd);
    //----利用填充画布,刷屏
    canvas.drawColor(Color.BLACK);
    //----绘制文本
    canvas.drawText("drawText", 10, 10, paint);
    //----绘制像素点
    canvas.drawPoint(10, 20, paint);
    //----绘制多个像素点
    canvas.drawPoints(new float[] { 10, 30, 30, 30 }, paint);
    //----绘制直线
    canvas.drawLine(10, 40, 50, 40, paint);
    //----绘制多条直线
    canvas.drawLines(new float[] { 10, 50, 50, 50, 70, 50, 110, 50 }, paint);
    //----绘制矩形
    canvas.drawRect(10, 60, 40, 100, paint);
    //----绘制矩形2
    Rect rect = new Rect(10, 110, 60, 130);
    canvas.drawRect(rect, paint);
    canvas.drawRect(rect, paint);
    //----绘制圆角矩形
    RectF rectF = new RectF(10, 140, 60, 170);
    canvas.drawRoundRect(rectF, 20, 20, paint);
    //----绘制圆形
    canvas.drawCircle(20, 200, 20, paint);
    //----绘制弧形
    canvas.drawArc(new RectF(150, 20, 200, 70), 0, 230, true, paint);
    //----绘制椭圆
    canvas.drawOval(new RectF(150, 80, 180, 100), paint);
    //----绘制指定路径图形
    Path path = new Path();
    //设置路径起点
    path.moveTo(160, 150);
    //路线1
    path.lineTo(200, 150);
    //路线2
    path.lineTo(180, 200);
    //路径结束
    path.close();
    canvas.drawPath(path, paint);
    //----绘制指定路径图形
    Path pathCircle = new Path();
    //添加一个圆形的路径
    pathCircle.addCircle(130, 260, 20, Path.Direction.CCW);
    //----绘制带圆形的路径文本
    canvas.drawTextOnPath("PathText", pathCircle, 10, 20, paint);
}
 

注:以上代码参考自《Android游戏编程之从零开始》

得到自定义图片宽高的bitmap(参数一:上下文对象,参数二:资源ID,参数三:自定义宽度,参数四:自定义高度)

代码如下:

public static Bitmap loadBallView(Context context,int resId,int width,int height) {

    Resources resources = context.getResources();

    Drawable image = resources.getDrawable(resId);

    Bitmap bitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);

         Canvas canvas = new Canvas(bitmap);
         image.setBounds(0, 0, width,height);
         image.draw(canvas);

         return bitmap;
    }

利用canvas绘制bitmap
代码如下:

Bitmap bitmap = loadBallView(context,R.drawable.image,100,100);

Paint paint = new Paint();

canvas.drawBitmap(bitmap, startX, startY, paint); //参数一:bitmap资源,参数二:起始X坐标,参数三:起始Y坐标,参数四:画笔paint对象


推荐阅读
  • Java 动态代理详解与示例
    本文详细介绍了Java中的动态代理机制,包括如何定义接口、实现类和代理处理器,并通过具体示例演示了动态代理的创建和使用过程。 ... [详细]
  • CSGO
    CSGOTimeLimit:40002000MS(JavaOthers)MemoryLimit:524288524288K(JavaOthers)ProblemDescriptio ... [详细]
  • 深入解析Java中的锁类型及其应用场景
    本文详细介绍了Java中常见的锁类型,包括乐观锁与悲观锁、独占锁与共享锁、互斥锁与读写锁、可重入锁、公平锁与非公平锁、分段锁、偏向锁、轻量级锁、重量级锁以及自旋锁。每种锁的特性、作用及适用场景均有所涉及。 ... [详细]
  • 本文探讨了HDU 4035的问题,涉及一个由n个房间组成的迷宫,这些房间通过n-1条隧道相互连接,形成一棵树结构。任务是从起点1号房间出发,计算到达出口所需经过的平均隧道数量,考虑了在每个房间中可能发生的三种情况及其相应概率。 ... [详细]
  • 本文介绍如何通过自定义控件LoadLayout实现ListView的上拉加载更多和下拉刷新功能。LoadLayout支持上拉加载,而下拉刷新则利用了android.support.v4.widget.SwipeRefreshLayout组件。 ... [详细]
  • 本文详细介绍了如何在Windows系统中安装并使用JEB逆向工具,包括必要的环境配置和基本操作指南。 ... [详细]
  • Android 手机安全应用首屏布局设计
    本文详细介绍了如何构建一个功能丰富的手机安全应用的首个导航界面布局。通过实例代码和效果展示,帮助开发者快速理解和实现相关功能。 ... [详细]
  • 本文介绍如何利用Python中的Epoll机制构建一个高效的Web服务器,该服务器能够处理多个并发连接,并向每个连接的客户端返回预定义的响应文本。通过使用Epoll,服务器可以实现高性能的I/O多路复用。 ... [详细]
  • 本文介绍了Android中常见的动画类型及其应用场景,通过具体的代码示例展示了如何在Activity跳转时添加平滑过渡效果,提升用户体验。 ... [详细]
  • 一、数据更新操作DML语法中主要包括两个内容:查询与更新,更新主要包括:增加数据、修改数据、删除数据。其中这些操作是离不开查询的。1、增加数据语法:INSERTINTO表名称[(字 ... [详细]
  • 本文探讨了在iOS应用中实现类似Android Snack Bar功能的方法,并特别关注如何确保Snack Bar正确显示在键盘下方。 ... [详细]
  • 本文介绍了一种解决方案,当笔记本电脑不具备作为无线接入点的能力时,如何通过开启Android手机的便携WLAN热点功能,使笔记本能够连接到手机并共享其网络资源,从而实现上网。文中详细描述了在Linux系统下配置的具体步骤。 ... [详细]
  • 本文介绍了如何通过安装 VirtualBox 和 Vagrant 来快速搭建和管理虚拟机环境。我们将详细探讨如何选择合适的 Box 镜像,以及如何高效地下载、添加和管理这些镜像。 ... [详细]
  • SQL注入实验:SqliLabs第38至45关解析
    本文深入探讨了SqliLabs项目中的第38至45关,重点讲解了堆叠注入(Stacked Queries)的应用技巧及防御策略。通过实际案例分析,帮助读者理解如何利用和防范此类SQL注入攻击。 ... [详细]
  • 解决fetch上传图片至微信公众号H5页面的问题
    在近期的一个项目需求中,需要在微信公众号内嵌入H5页面,并实现用户通过该页面上传图片的功能,包括拍摄新照片或从已有相册中选择。前端开发中采用了fetch API进行接口调用,但遇到了上传图片时数据无法正确传递的问题。 ... [详细]
author-avatar
吖鸟集团总公司
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有