收藏 分销(赏)

佛山科学技术学院android安卓二维图像的处置专题培训课件.ppt

上传人:快乐****生活 文档编号:2720887 上传时间:2024-06-04 格式:PPT 页数:30 大小:2.62MB 下载积分:12 金币
下载 相关 举报
佛山科学技术学院android安卓二维图像的处置专题培训课件.ppt_第1页
第1页 / 共30页
佛山科学技术学院android安卓二维图像的处置专题培训课件.ppt_第2页
第2页 / 共30页


点击查看更多>>
资源描述
佛山科学佛山科学技术学院技术学院androidandroid安安卓二维图卓二维图像的处置像的处置-2-本章目标掌握Bitmap/BitmapFactory认识位图缩放与图像变换理解Canvas/Paint了解View/SurfaceView了解线程控制下的图像处理与动画6.1Android二维游戏开发视图Android游戏开发中常用的三种视图:view视图、SurfaceView视图和GLSurfaceView视图。View视图:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。SurfaceView视图:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓冲机制,在新的线程中更新画面所以刷新界面速度比view快。在一个新启动的线程中重新绘制画面,主动更新画面。GLSurfaceView视图:基于SurfaceView视图再次进行拓展的视图类,是专用于3D游戏开发的视图;是SurfaceView的子类(openGL专用)。6.1Android二维游戏开发视图(2)主动更新需要一个单独的thread不停的重绘人的状态,例如一个人在一直跑动。避免阻塞mainUIthread。所以显然view不合适,需要surfaceView来控制。根据游戏特点,更新画面的类型一般分为以下两类:(1)被动更新画面的画面的更新依赖于onTouch来更新,例如棋类游戏,可以直接使用invalidate。因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。6.1.1View视图框架举例:调用自定义举例:调用自定义ViewView视图视图对于常规的游戏,在View中需要处理以下3种问题:控制事件、刷新View、绘制View。6.1Android二维游戏开发视图(1)处理按键事件onKeyDown,屏幕触控onTouchEvent以及Sensor重力感应等方法。(2)刷新view的方法这里主要有invalidate(intl,intt,intr,intb)刷新局部,四个参数分别为左、上、右、下。(3)绘制View主要是onDraw()中通过形参canvas来处理,相关的绘制主要有drawRect、drawLine、drawPath等。6.1.2SurfaceView视图框架6.1Android二维游戏开发视图SurfaceView视图和View视图最本质的区别是View视图要在UI的主线程中更新画面,surfaceView视图是在一个新起的单独线程中可以重新绘制画面而,所以不会阻塞UI主线程。但这也带来事件同步的问题,也涉及到线程同步。SurfaceView视图原理在游戏中,一般不会等用户每次触发了按键事触屏事件才重绘画布,而是会定义一个时间去刷新画布;例如倒计时、动态的花草、流水等,这些游戏元素并不会跟玩家交互,但却都是动态的。所以游戏开发中,会有一个线程不停的去重绘画布,实时的更新游戏元素的状态。6.1.2SurfaceView视图框架6.1Android二维游戏开发视图游戏中除用画布给玩家最直接的动态展示外,还有很多逻辑需要不间断地去更新,例如游戏中钱币的更新和AI(人工智能)行为等等。Android中的SurfaceView类就是双缓冲机制,开发采用自动刷新屏幕的游戏时尽量使用SurfaceView类,这样效率较高,而且SurfaceView类的功能也更加完善。举例:获取视图宽度和高度举例:获取视图宽度和高度6.2常用绘图类在Android下进行2D绘图最常用的就是Paint类、Canvas类、Bitmap类和BitmapFactory类。其中Paint类代表画笔,Canvas类代表画布。6.2.1画笔PaintPaint画笔是绘图的辅助类,一般它是作为画布的参数来实现相应的效果,Paint类中包含文字与位图的样式、颜色等属性信息。6.2.2画布CanvasCanvas类提供了两个构造函数:Canvas():创建一个空的Canvas对象。Canvas(Bitmapbitmap):创建一个以bitmap位图为背景的Canvas。Canvas类提供了很多相应的drawXxx()方法,具有多种类型,可以画出点、线、矩形、圆形、椭圆、文字、位图等。6.2常用绘图类6.2.3Bitmap类Bitmap类代表位图,不仅可以获取图像文件信息,对图像进行剪切、旋转、缩放等操作,而且还可以指定保存图像文件格式。6.2.4BitmapFactory类该类为一个工具类,用于从不同的数据源解析和创建Bitmap对象。6.2.5基础实例:游戏角色行走控制6.2常用绘图类本例实现对RGP类型的游戏人物行走进行控制。人物行走图片素材人物行走实例运行界面6.3绘制2D图像Android提供了强大的二维图形库用于绘制2D图像,常用的是绘制几何图形、文本、路径和图片等。6.3.1绘制文本在开发游戏的过程中,特别是RPG(角色)类游戏时,显示文字信息多用绘制文本的方式。举例:游戏中的对话界面举例:游戏中的对话界面6.3绘制2D图像6.3.2绘制几何图形Canvas类提供了丰富的绘制几何图形的方法,包括点、线、弧、圆形、矩形等。举例:绘制奥运五环举例:绘制奥运五环6.3绘制2D图像6.3.3绘制路径Android中绘制路径有创建路径和绘制定义好的路径两种方式。创建路径可以使用android.graphics.Path类实现。6.3.4绘制图片举例:绘制举例:绘制SDSD卡指定图像卡指定图像6.4图像特效在Android中可以为图像添加旋转、缩放、倾斜、平移和渲染等特效。postXXX()方法采用前乘的方式设置Matrix的值,设置的操作最先发生。在AndroidAPI中提供setXXX()、postXXX()、preXXX()三种方式:setXXX()方法用于直接设置Matrix的值,每使用一次,整个Matrix都会改变;postXXX()方法采用后乘的方式设置Matrix的值,可以连续多次使用post以完成多个变换6.4.1旋转图像6.4图像特效使用android.graphics.Matrix类提供的setRotate()、postRotate()和preRotate()三个方法。举例:应用举例:应用MatrixMatrix旋转图像旋转图像使用android.graphics.Matrix类提供的setScale()、postScale()和preScale()三个方法。6.4.2缩放图像举例:应用举例:应用MatrixMatrix缩放图像缩放图像使用android.graphics.Matrix类提供的setSkew()、postSkew()和preSkew()三个方法。6.4.3倾斜图像举例:应用举例:应用MatrixMatrix倾斜图像倾斜图像6.4图像特效使用android.graphics.Matrix类提供的setTranslate()、postTranslate()和preTranslate()三个方法。Android中渲染图像主要应用BitmapShader类,创建该类对象可通过以下的构造方法:BitmapShader(Bitmapbitmap,Shader.TileModetileX,Shader.TileModetileY)其中bitmap参数用于指定一个位图对象;tileX参数用于指定水平方向图像的重复方式;tileY参数用于指定垂直方向图像的重复方式。注意:Shader.TileMode类型的参数包括CLAMP(用边界颜色填充剩余空间)、MIRROR(镜像方式)和REPEAT(重复方式)3个可选值。6.4.4平移图像举例:应用举例:应用MatrixMatrix平移图像平移图像6.4.5渲染图像举例:应用举例:应用BitmapShaderBitmapShader渲染图像渲染图像6.5剪切区域6.5.1剪切区域原理剪切区域也称可视区域,是由画布进行设置的,指的是在画布上设置一块区域,设置了可视区域以后,将看不见区域以外绘制的任何内容。6.5.2基础实例1:RPG游戏地图生成本例实现二维RGP类型游戏中地图的编辑与生成。RPG游戏地图素材MapWin软件界面游戏地图生成实例运行界面6.5剪切区域6.5.3基础实例2:游戏中的自动滚屏本例实现射击类游戏或过关类游戏中背景的自动滚动。自动滚屏背景素材自动滚屏实例运行界面6.6游戏动画在Android中提供了逐帧动画和补间动画两种动画类型,均可以在XML文件中定义动画资源文件。另外,也可以通过重写Animation的applyTransformation()函数实现自定义动画效果。6.6.1逐帧动画逐帧动画就是按顺序播放静态图像,先要在定义一组生成动画的图片资源。!此处省略部分 标记-举例:奔跑的小动物举例:奔跑的小动物6.6游戏动画6.6.2补间动画补间动画是通过对场景里的对象不断做图像变换(平移、缩放、旋转)来产生动画效果。在实现补间动画时,只需要定义动画开始和结束的关键帧。举例:补间动画实例举例:补间动画实例在Android中,提供了透明度渐变动画、旋转动画、缩放动画和平移动画四种补间动画。重写Animation的applyTransformation()函数,然后通常要实现initialize()函数,这是一个回调函数,告诉Animation目标View的大小,可以初始化一些相关的参数。在绘制动画的过程中会反复的调用applyTransformation()函数,参数interpolatedTime值(值为从0到1)在每次调用中都会变化。6.6.3自定义动画举例:自定义动画实例举例:自定义动画实例6.7综合实例一:小小弹球功能描述关键技术本例实现一款简单弹球游戏,利用触屏控制底部弹板弹起小球;游戏失败后,再次触屏可以重启游戏。本例实现的关键是Timer类的使用和小球与边界、弹板是否接触的计算。代码如下所示:final Timer timer=new Timer();timer.schedule(new TimerTask()Overridepublic void run()if(ballX=(screen_width-ball_size)xSpeed=-xSpeed;if(ballY=(rectY-ball_size)&ballX=rectX&ballX=(rectY-ball_size)&(ballX (rectX+rect_width)isGameOver=true;timer.cancel();ballX+=xSpeed;ballY+=ySpeed;Message msg=new Message();msg.what=1;handler.sendMessage(msg);,0,300);new Thread(this).start();6.7综合实例一:小小弹球实例拓展为游戏添加背景图,用图片资源替换游戏中采用绘图函数实现的小球和弹板;用重力传感器控制弹板移动。弹球图片素材弹球实例运行界面6.7综合实例二:动态游戏导航界面功能描述关键技术本例实现一个图形化的动态游戏菜单界面。本例实现的关键是根据游戏不同的状态标识绘制不同的界面。代码如下所示:private void drawMenu(Canvas canvas)canvas.drawBitmap(menu0,0,0,paint);/绘制菜单界面背景canvas.clipRect(240,260,240+menu1.getWidth()/6,260+menu1.getHeight();/剪切菜单项区域canvas.drawBitmap(menu1,240-menuIndex*menu1.getWidth()/6,260,paint);/绘制当前菜单项canvas.clipRect(205,350,234,370,Op.UNION);/剪切左切换按钮区域canvas.drawBitmap(menu2,205,350,paint);/绘制左切换按钮canvas.clipRect(290,350,319,370,Op.UNION);/剪切右切换按钮区域canvas.drawBitmap(menu2,290,330,paint);/绘制右切换按钮/剪切花瓣区域 canvas.clipRect(flowerX,flowerY,flowerX+15,flowerY+15,Op.UNION);canvas.drawBitmap(flowerframeIndex,flowerX,flowerY,paint);/绘制花瓣 实例拓展6.7综合实例二:动态游戏导航界面实现游戏处于菜单状态下多数花瓣不断飘落的效果。游戏动态导航花瓣效果6.7综合实例三:打地鼠功能描述关键技术本例实现一个打地鼠游戏。在一个有多个“洞穴”的场景中,每个“洞穴”随机显示地鼠,用户可以用手触摸出现的地鼠。如果触摸到则该地鼠不再显示,同时在屏幕上通过消息提示框显示打到了几只地鼠。本例实现的关键是如何在指定的位置随机显示地鼠,这里主要是通过线程与消息处理进行控制。首先使用Thread线程对象记录地鼠出现的位置,然后通过Handler消息控制地鼠的出现。通过Handler消息控制地鼠出现的关键代码如下所示:handler=new Handler()Overridepublic void handleMessage(Message msg)int index=0;if(msg.what=0 x101)index=msg.arg1;/获取位置索引值mouse.setX(positionindex0);/设置X轴位置mouse.setY(positionindex1);/设置Y轴位置mouse.setVisibility(View.VISIBLE);/设置地鼠显示 super.handleMessage(msg);使用Thread线程对象记录地鼠出现位置的关键代码如下所示:6.7综合实例三:打地鼠Thread t=new Thread(new Runnable()Overridepublic void run()int index=0;/创建一个记录地鼠位置的索引值while(!Thread.currentThread().isInterrupted()index=new Random().nextInt(position.length);/产生一个随机数Message m=handler.obtainMessage();/获取一个Messagem.what=0 x101;/设置消息标识m.arg1=index;/保存地鼠标位置的索引值handler.sendMessage(m);/发送消息try Thread.sleep(new Random().nextInt(500)+500);/休眠一段时间 catch(InterruptedException e)e.printStackTrace(););t.start();/开启线程打地鼠游戏图片素材打地鼠游戏运行界面6.7综合实例四:游戏中的瞄准镜功能描述关键技术本例实现射击类游戏中瞄准镜随触屏手指移动的效果。实现本例的关键是对放大图像的局部抠取及平移放大图像时矩阵位置的计算。创建圆形图像的关键代码如下所示:shader=new BitmapShader(bitmap_bg_big,TileMode.CLAMP,TileMode.CLAMP);shapeDrawable=new ShapeDrawable(new OvalShape();/创建圆形的ShapeshapeDrawable.setBounds(0,0,RADIUS*2,RADIUS*2);/设置圆的外切矩形shapeDrawable.getPaint().setShader(shader);/设置画笔形状平移矩阵新位置计算的代码如下所示:matrix.setTranslate(RADIUS-x*FACTOR,RADIUS-y*FACTOR);/平移矩阵shapeDrawable.getPaint().getShader().setLocalMatrix(matrix);shapeDrawable.setBounds(x-RADIUS,y-RADIUS,x+RADIUS,y+RADIUS);/圆外切矩形 瞄准镜实例图片素材瞄准镜实例运行界面6.7综合实例五:发疯的小猪功能描述关键技术本例实现一只小猪在围栏内左右两个方向来回奔跑,折返条件是碰到围栏的边缘。在实现本例过程中,最关键的技术就是通过动画形式显示小猪的奔跑状态,这里主要用到Animation对象获取动画资源,通过重写该对象的onAnimationEnd()方法并调用startAnimation()方法实现小猪奔跑状态的切换及动画的播放。发疯小猪系列图片素材发疯小猪实例运行界面6.7综合实例六:开心涂鸦功能描述关键技术本例实现一个代表白板的空白区域,用户可以通过菜单选择画笔在白板上随意绘制(文字和各种图案等),并能够将绘制的内容保存到SD卡中。在实现过程中,主要用到的是保存画板内容时,调用Bitmap类的compress()方法将绘图内容压缩为PNG格式输出到文件输出流对象中。关键代码如下所示:public void saveBitmap(String fileName)throws IOException File file=new File(/sdcard/pictures/+fileName+.png);/创建文件对象file.createNewFile();/创建一个新文件FileOutputStream fileOS=new FileOutputStream(file);/创建一个文件输出流对象/将绘图内容压缩为PNG格式输出到输出流对象中cacheBpress(Bitmap.CompressFormat.PNG,100,fileOS);fileOS.flush();/将缓冲区中的数据全部写出到输出流中fileOS.close();/关闭文件输出流对象作业:P198-2(2)、(4)要求写出关键程序代码
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服