




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 Android 图形图像,4.1Drawable和ShapDrawable 4.2 NinePatchDrawable 4.3 Bitmap和BitmapFactory 4.4 绘图-Canvas、Paint、Path 4.5 特效-Matrix、Shader 4.6 Tween动画和Frame动画 4.7 SurfaceView 4.8 OpenGL,4.1 Drawable和ShapDrawable,Drawable Drawable是一个通用的抽象类,它的目的是告诉你什么东西是可以画的。你会发现基于Drawable类扩展出各种绘图的类包括:BitmapDrawable、Shape
2、Drawable、PictureDrawable、LayerDrawable,当然你可以继承它来创建你自己的绘图类。 定义和实例化一个Drawable 从资源图像文件中创建 从XML文件中创建,从资源图像文件中创建 一个比较简单的方法是添加一个图片到你的程序中,然后通过资源文件引用这个文件,支持的文件类型有PNG(首选的) JPG(可接受的)GIF(不建议)。 图片资源添加到res/drawable/目录中 引用它到你的代码或你的XML布局中 引用它也可以用资源编号,从XML文件中创建 图片资源添加到res/drawable/目录中 在XML中定义Drawable 引用它也可以用资源编号,Sh
3、apeDrawable 画一些动态的2D图片,ShapeDrawable继承了Drawable,所以你可以调用Drawable里有的函数,4.2 NinePatchDrawable,NinePatchDrawable 绘画的是一个可以伸缩的位图图像,Android会自动调整大小来容纳显示的内容。NinePatchDrawable是一个标准的PNG图像,它包括额外的1个像素的边界,你必须保存它后缀为.9.png,并且保持到工程的res/drawable目录中。 Android提供绘制工具,4.3 Bitmap和BitmapFactory,Bitmap 方式1: 建立空的BitmapBitmapv
4、Bitmap=Bitmap.createBitmap(vWidth,vHeight,); 方式2: 取得Resource 的Bitmap BitmapvBitmap=BitmapFactory.decodeResource(vContext.getResources(),R.drawable.); 方式3: 取得图档的BitmapBitmapvBitmap=BitmapFactory.decodeStream(vContentResolver.openInputStream(uri);,要获取位图信息,比如位图大小、像素、density、透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这
5、里只是辅助说明以下2点: 在Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要注意这个小问题; Bitmap还提供了compress()接口来压缩图片,不过AndroidSAK只支持PNG、JPG格式的压缩;其他格式的需要Android开发人员自己补充了。,4.4 绘图-Canvas、Paint、Path,Canvas,在Android中,把Canvas当做画布,可以在画布上绘制我们想要的任何东西。 方法: clipXXX 裁剪,通过Path,
6、Rect ,Region 的不同组合,几乎可以支持任意现状的裁剪区域。如: ClipPath, ClipRect, ClipRegion drawXXX 绘制,可绘制图片,图形等。如:drawBtimap、drawLine save() 方法作用:用来保存canvas状态的。save()时可以得到一个返回值,是用来确定保存时间的。使用restoreToCount()方法时可以把此值当参数传递,可以还原到指定的保存时间。 restore() 方法作用:用来恢复canvas状态的,还原到上一次savie()时的状态。,translate() translate(floatdx,floatdy);
7、方法作用:移动canvas和它的原点到不同的位置上。默认原点坐标为(0,0) 参数:dx,左右偏移量(正数是向右移动) dy,上下偏移量(正数是向下移动) rotate() rotate(floatdegrees); 方法作用:以原点为中心对canvas旋转。默认原点坐标为(0,0) 参数:degrees 旋转弧度 Scale() scale(floatsx,floatsy); 方法作用:增减图形在canvas中的像素数目,对形状,位图进行缩小或者放大。 参数:sx,横轴缩放大小 sy,数轴缩放大小 scale(floatsx,floatsy,floatpx,floatpy); px,设置原点
8、的位置(与rotate中的px正好相反,正数是向左移动) py,设置原点的位置(与rotate中的py正好相反,正数是向上移动),什么是Paint? Paint类包含样式和颜色有关如何绘制几何形状,文本和位图的信息。Canvas是一块画布,具体的文本和位图如何显示,这就是在Paint类中定义了。 Paint有哪些功能? 字体、大小(TextSize)、颜色 (TextColor)、对齐方式(TextAlign)、粗体(Bold)、斜体(Italic)、下划线(Underline)等 字体类型:Typeface类(BOLD,BOLD_ITALIC,ITALIC,NORMAL) 使用Paint显示
9、String Paint p = new Paint();String familyName = “宋体”;Typeface font = Typeface.create(familyName,Typeface.BOLD);p.setColor(Color.RED);p.setTypeface(font);p.setTextSize(22);canvas.drawText(mstrTitle,0,100,p);,Path,对于Android游戏开发或者说2D绘图中来讲Path 路径可以用强大这个词来形容。在Photoshop中我们可能还记得使用钢笔工具绘制路径的方法。Path路径类在位于 an
10、droid .graphics.Path中,Path的构造方法比较简单,如下 Path cwj=new Path(); /构造方法 下面我们画一个封闭的原型路径,我们使用Path类的addCircle方法 cwj.addCircle(10,10,50,Direction.CW); /参数一为x轴水平位置,参数二为y轴垂直位置,第三个参数为圆形的半径,最后是绘制的方向,CW为顺时针方向,而CCW是逆时针方向cwj.addCircle(10,10,50,Direction.CW); /参数一为x轴水平位置,参数二为y轴垂直位置,第三个参数为圆形的半径,最后是绘制的方向,CW为顺时针方向,而CCW是
11、逆时针方向,结合Android上次提到的Canvas类中的绘制方法drawPath和drawTextOnPath,我们继续可以在onDraw中加入。 canvas.drawPath(cwj,paintPath); /大家这里paintPath为路径的画刷颜色,可以见下文完整的源代码。 canvas.drawTextOnPath(“The9- CWJ,cwj,0,15,paintText); /将文字绘制到路径中去 canvas.drawPath(cwj,paintPath); /大家这里paintPath为路径的画刷颜色。 canvas.drawTextOnPath(“The9- CWJ,cw
12、j, 0, 15,paintText); /将文字绘制到路径中去,4.5 特效-Matrix、Shader,Matrix,Matrix类拥有一个3x3矩阵转换坐标。它必须被显式初始化的使用复位()或者-构造一个矩阵函数(如setTranslate,setRotate等)。 Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种 Matrix 提供set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。 set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。 post
13、是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋转30度,然后平移到(100,100)的地方,那么可以这样做:,Matrixm=newMatrix(); m.postRotate(30); m.postTranslate(100,100); pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话,就要这样: Matrixm=newMatrix(); m.setTranslate(100,100); m.preRotate(30); 旋转、缩放和倾斜都可以围绕一个中心点来进行,如果
14、不指定,默认情况下,是围绕(0,0)点来进行。,Shader Android中提供了Shader类专门用来渲染图像以及一些几何图形 Shader shader = new BitmapShader(.) Shader shader = new LinearGradient(.) Paint paint = new Paint(); Paint.setShader(shader);,4.6 Tween动画和Frame动画,Android平台提供了两类动画,分别是Tween动画和Frame动画。 Tween通过场景里的对象不断的进行图片的变换,比如平移、渐变、缩放、旋转等来产生动画效果; Fram
15、e动画叫做顺序播放实现做好的图像和电影类似。另外加上gif动画,因为如果直接使用Bitmap或其他方法直接调用gif图片资源的话,显示的是静态的,如果要做成动态的,就需要一些其他的方法来实现。 Tween动画 Alpha:渐变透明度动画 Scale:渐变尺寸伸缩动画 Translate:画面转换位置移动动画 Rotate:画面转移旋转动画,AlphaAnimation(float fromAlpha, float toAlpha) 功能:创建一个透明度渐变的动画 参数说明:fromAlpha是动画起始时透明度;toAlpha是动画结束时透明度 注:0.0表示完全透明,1.0表示完全不透明 1、
16、直接在程序中创建动画 /创建Alpha动画 Animation alpha = new AlphaAnimation(0.1f, 1.0f); alpha.setDuration(5000);/设置动画时间为5秒 img.startAnimation(alpha); /开始播放 2、通过XML来创建动画 alpha_anim.xml。在res/anim目录下 ,java调用 Animation scale = AnimationUtils.loadAnimation(TweenActivity.this, R.anim.scale_anim); img.startAnimation(scale
17、); /开始动画 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, floatXValue, int pivotYType, float pivotYValue) 功能:创建一个渐变尺寸伸缩动画参数:fromX,toX分别是起始和结束时x坐标上的伸缩尺寸。fromY,toY分别是起始和结束时ye坐标上的伸缩尺寸。pivotXValue,pivotYValue分别为伸缩动画相对于x,y坐标开始的位置,pivotXType,pivotYType分别为x,y的伸缩模式。 1、直接在程序中实现的
18、方式java代码:Animation scale = new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scale.setDuration(5000);/设置动画持续时间 img.startAnimation(scale); /开始动画,2、在XML中是创建动画scale_anim.xml,在res/anim目录下 Java调用 Animation scale = AnimationUtils.loadAnimation(TweenAct
19、ivity.this, R.anim.scale_anim); img.startAnimation(scale);,TranslateAnimation(float fromXDelta, float toXDelta, float YDelta, float toYDelta) 功能:创建一个移动画面位置的动画 参数:fromXDelta,fromYDelta分别是其实坐标;toXDelta,toYDelta分别是结束坐标 1、直接在程序中实现java代码: Animation translate = new TranslateAnimation(10, 100, 10, 100); tr
20、anslate.setDuration(3000);/设置动画持续时间 img.startAnimation(translate); /开始动画 2、在XML中创建动画 ,java调用 Animation translate = AnimationUtils.loadAnimation(TweenActivity.this, R.anim.translate_anim); img.startAnimation(translate); /开始动画 Rotate(float fromDegrees, float toDegrees, int pivotXType, float pivotXValu
21、e, int pivotYType,float pivotYValue) 功能:创建一个旋转画面的动画 参数:fromDegrees为开始的角度;toDegrees为结束的角度。pivotXValue、pivotYType分别为x,y的伸缩模式。pivotXValue,pivotYValue分别为伸缩动画相对于x,y的坐标开始位置 1、直接在程序中创建动画java代码: Animation rotate = new RotateAnimation(0f,+360f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f
22、); rotate.setDuration(3000); img.startAnimation(rotate);,2、在XML中创建动画 rotate_anim.xml 在res/anim目录下 Java调用 Animation rotate = AnimationUtils.loadAnimation(TweenActivity.this, R.anim.rotate_anim); img.startAnimation(rotate);,Frame动画,Interpolator 类及其子类Interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等;Inter
23、polator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,LinearInerpolator、AccelerateInterpolator, DecelerateInterpolator,AccelerateDecelerateInterpolator,CycleInterpolator 是 Interpolator的子类,分别实现了匀速、加速、减速、变速、循环等效果。,第一种 AnimationDrawable frameAnimation = new AnimationDrawable(); for(int i=0;iimgList.length;i+) b
24、itmapDraw =getResources().getDrawable(imgListi); frameAnimation.addFrame(drawab le, 80);/drawab le为单帧图片,此句需循环 imgView.setBackgroundDrawable(frameAnimation); frameAnimation.setOneShot(isLoop); /设置是否循环 frameAnimation.start(); 第二种 添加帧图片方式发生变化 for(int i=0;i7;i+) int id = getResources().getIdentifier(img
25、+i, drawable, getPackageName(); bitmapDraw = getResources().getDrawable(id); frameAnimation.addFrame(bitmapDraw, 80); ,第三种 在res文件下面创建一个文件夹anim,在anim文件下面创建frame_animation.xml文件。 调用方法1 imgView.setBackgroundResource(R.anim.picture_animation); frameAnimation = (AnimationDrawable) imgView.getBackground(,
26、调用方法2 frameAnimation = (AnimationDrawable) imgView.getDrawable();,4.7 SurfaceView,从事复杂的图像绘制或者对程序的执行效率要求比较高的产物 当需要快速地更新View的UI,或者当渲染代码阻塞GUI线程的时间过长的时候,SurfaceView就是解决上述问题的最佳选择。 使用时需要对其进行创建、销毁、情况改变时进行监 视,这个需要实现SurfaceHolder.Callback接口。如果要对被绘制的画布进行裁剪,控制其大小时都需要用SurfaceHolder来 完成处理。,基本方法: surfaceChanged :
27、在surfaceview的大小发生改变的时候调用。 surfaceCreated : 在创建Surface时激发。 surfacedestroyed:在销毁Surface时激发。 addCallback:给SurfaceView添加一个回调函数。 lockCanvas :锁定画布。绘图之前必须锁定画布才能够得到画布对象。 unlockCanvasAndPost:开始绘制时锁定了画布,绘制完成之后解锁画布。 removeCallback:从SurfaceView中移除回调函数。 创建SurfaceView 要创建一个新的SurfaceView,需要创建一个新的扩展了SurfaceView的类,并实现SurfaceHolder.Callback。 一个典型的Surface View设计模型包括一个由Thread所派生的类,它可以接收对当前的SurfaceHolder的引用,并独立地更新它。,4.8 OpenGL,OpenGL定义了一个跨编程语言、跨平台的编程接口的性能卓越的三维图形标准。 1992年7月, SGI公司发布OpenGL1.0 1995年,OpenGL 1.1 版本面试。 1997年,Windows95下的3D大量涌现。 2003年7月, SGI和ARB公布OpenGL 1.5。 2004年8月,Op
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度城市公园绿化设施采购安装合同
- 二零二五年白酒企业知识产权保护合同
- 二零二五年度汽车维修保养服务车辆使用协议范本
- 二零二五年度车辆烤漆房租赁与车身修复服务合同
- 二零二五年度环保型建筑安全施工生产合同
- 2025版老旧城区改造项目场地平整与房屋征收合同
- 2025版教育科研园区场地租赁及设施租赁协议
- 2025版白酒产区原浆酒团购销售合同
- 2025年网络安全评估与防护技术服务合同模块
- 2025版标准夫妻离婚后子女生活费及教育金支付协议书
- 酒店服务员工培训
- 美食节摊位租赁合同范本
- 《水利工程水文化建设导则》(编制说明编写要求)
- 人教版PEP三年级英语上册同步练习
- 江苏省行政执法人员近年考试真题(含解析)
- 拆迁补偿协议书样本
- DL∕T 2591-2023 垃圾发电厂垃圾储运系统运行规程
- 医护人员手卫生知识培训课件
- Location:商圈洞察-上海南京东路评估报告 2024
- FZT 63005-2019 机织腰带行业标准
- 医院培训课件:《分级护理制度》
评论
0/150
提交评论