Android ApiDemo分析(九)--Graphics
Graphics/AlphaBitmap
这个Demo演示了对图片的一些操作以及基本的绘图方式;
相关内容:
在Android要绘制一个东西,需要四个部分:一个Bitmap用于存储像素值,一个Canvas用于定义绘图操作,一个Paint定义绘图使用的颜色,画笔,画刷等属性,最后一个是要绘制的图形本身(如矩形,线段等)。
1、Bitmap - 称作位图,一般位图的文件格式后缀为bmp,作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。程序中表示为一种存储对象。
1)createBitmap (int width, int height, Bitmap.Config config)
创建一个Bitmap,设定宽度、高度及存储方式。 Bitmap.Config用于设置位图的存储方式,主要是存储的精度不同。
2)extractAlpha() 提取Alpha通道,用于返回一个bitmap,该bitmap的alpha值为调用者的alpha值。
2、Drawable - 作为Android平台下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。
3、Canvas - 名为画布,我们可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。
4、Paint - 我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。
1)setAntiAlias()设置是否抗锯齿,即是否对图形边缘做平滑处理;
5、Shader-着色、渲染,主要用来对图像做颜色上的特殊处理,供Paint使用,mPaint.setShader();
Shader.TitleMode定义了3种平铺模式。
1)CLAMP边缘拉伸;2)MIRROR镜像平铺;3)REPEAT重复平铺。
Shader子类
1)BitmapShader渲染一张bitmap
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
tileX、tileY分别指定bitmap在X轴、Y轴上的平铺模式。
2)SweepGradient顺时针圆周扫描(雷达)式渐变,将指定的颜色围绕中心点实现扫描式渐变。
SweepGradient(float cx, float cy, int[] colors, float[] positions)
cx,cy指定中心点坐标,colors指定围绕中心点分布的颜色,至少包含两种颜色。positions与colors对应,指定颜色之间的相对分布,起始位置为0,结束位置为1,单调递增,若position为null则平均分布。
SweepGradient(float cx, float cy, int color0, int color1)只有两种颜色的平均辐射。
3)RadialGradient放射式渐变
RadialGradient(float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)
x、y指定中心,radius指定半径,colors指定分布的颜色,position指定相对位置。
RadialGradient(float x, float y, float radius, int color0, int color1, Shader.TileMode tile)
只有两种颜色的渐变。
4)LinearGradient 线性渐变,将颜色沿一条直线进行渐变
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
x0,y0起点坐标,x1、y1终点坐标,其他参数与上面的相同。
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
只有两种颜色的渐变。
5)ComposeShader混合渲染,用于将两种shader混合;
ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)
shader1最下层shader,shader2最上层shader;xfermode叠加模式,如果为null则默认SRC_OVER ;
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
指定为PorterDuff.Mode模式的混合。
6、Xfermode对图形的重叠进行处理
AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素XOR操作。
PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
Graphics/AnimateDrawables
这个Demo演示了自定义的动画Drawable效果,主要实现是在draw()方法中得到当前动画的传输矩阵,之后重新绘图;
相关内容:
Android 中定义了一个Drawable类为所有Drawable的抽象基类。表示一个“可以绘制在屏幕的对象”。通常的情况下是从资源文件中读取各种不同类型的Drawable。和View不同的是Drawable不能接受处理事件不能和用户交互。Android系统的Drawable有下列几种类型:
1)Bitmap: 代表PNG或是JPEG图像。
2)Nine Patch: PNG图像的一种扩展用法,多用来定义按钮边框,可以缩放。
3)Shape: 简单的矢量几何图形。
4)Layers: drawable 的集合组件,可以由多层Drawable叠加组合而成。
5)States: drawable 的集合组件,可以从多个Drawable选择其一(一种状态)。
6)Levels: drawable的集合组件,可以根据Drawable的Level属性选择其一。
7)Scale: drawable的集合组件,使用一个Drawable但可以根据当前Level缩放Drawable。
动画的实现
@Override public void draw(Canvas canvas) { Drawable dr = getProxy(); if (dr != null) { int sc = canvas.save(); Animation anim = mAnimation; if (anim != null) { anim.getTransformation( AnimationUtils.currentAnimationTimeMillis(), mTransformation); canvas.concat(mTransformation.getMatrix()); } dr.draw(canvas); canvas.restoreToCount(sc); } }
canvas.save()和canvas.restoreToCount(sc)分别用来保存和恢复Canvas的状态(Maxtrix等属性),因为我们需要修改Canvas的Matrix属性,canvas.concat方法都会和当前Canvas的Matrix进行矩阵运算,如果不保存之前的Matrix属性,每次都会很上次矩阵运算的结果相乘,对应本例,即每次平移的距离会越来越大。
改编的实例:
public class AnimateDrawable extends ProxyDrawable { private Animation mAnimation; private Transformation mTransformation = new Transformation(); public AnimateDrawable(Drawable target) { super(target); } public AnimateDrawable(Drawable target, Animation animation) { super(target); mAnimation = animation; } public Animation getAnimation() { return mAnimation; } public void setAnimation(Animation anim) { mAnimation = anim; } public boolean hasStarted() { return mAnimation != null && mAnimation.hasStarted(); } public boolean hasEnded() { return mAnimation == null || mAnimation.hasEnded(); } @Override public void draw(Canvas canvas) { Drawable dr = getProxy(); if (dr != null) { int sc = canvas.save(); Animation anim = mAnimation; if (anim != null) { anim.getTransformation( AnimationUtils.currentAnimationTimeMillis(), mTransformation); canvas.concat(mTransformation.getMatrix()); } dr.draw(canvas); canvas.restoreToCount(sc); } } }
Graphics/Arcs
这个Demo演示了使用Canvas画矩形、圆形及其相关属性设置;
相关内容:
Canvas绘图函数
drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
1)oval 矩形区域的边界值RectF (float left, float top, float right, float bottom);
2)startAngle 圆弧起始角度,单位为度。
3)sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
4)useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
5)paint: 绘制圆弧的画板属性,如颜色,是否填充等。
Graphics/BitmapDecode
这个Demo演示了图像解码的功能实现;
相关内容:
Android提供了一个用于图像解码的类BitmapFactory,其中提供了一系列方法解析图片对象,包括byte 数组,InputStream ,资源ID,或者指定的文件名。
BitmapFactory.Options 用于指定解码时的一些设置:
1)inBitmap如果设置,当加载内容时该方法将尝试重用这个位图;
2)inDensity使用像素密度来表示位图;
3)inDither如果存在抖动,解码器将尝试解码图像抖动;
4)inPurgeable如果设置为true,则由此产生的位图将分配其像素,以便系统需要回收内存时可以将它们清除;
5)inInputShareable与inPurgeable一起使用,如果inPurgeable为false那该设置将被忽略,如果为true,那么它可以决定位图是否能够共享一个指向数据源的引用,或者是进行一份拷贝;
6)inJustDecodeBounds如果设置,那返回的位图将为空,但会保存数据源图像的宽度和高度;
7)inMutable如果设置,解码方法将始终返回一个可变的位图;
8)inPreferQualityOverSpeed如果设置为true,解码器将尝试重建图像以获得更高质量的解码,甚至牺牲解码速度;
9)inPreferredConfig 如果为非空,解码器将尝试解码成这个内部配置;
10)inSampleSize 如果设置的值大于1,解码器将等比缩放图像以节约内存;
11)inScaled如果设置,当inDensity和inTargetDensity不为0,加载时该位图将被缩放,以匹配inTargetDensity,而不是依靠图形系统缩放每次将它绘制到画布上;
12)inScreenDensity当前正在使用的实际屏幕的像素密度;
13)inTargetDensity这个位图将被画到的目标的像素密度;
14)mCancel用于指示已经调用了这个对象的取消方法的标志;
15)outHeight、outWidth图像的高度和宽度;
16)outMimeType 如果知道,这个字符串将被设置为解码图像的MIME类型。
Graphics/BitmapMesh
这个Demo演示了图像变化的一种方法,其中包含了对图像的网格化绘制;
相关内容:
图像网格化绘制函数
drawBitmapMesh (Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)
1)bitmap: 需要绘制在网格上的图像。
2)meshWidth: 网格的宽度方向的数目(列数),为0时不绘制图像。
3)meshHeight:网格的高度方向的数目(含数),为0时不绘制图像。
4)verts: (x,y)对的数组,表示网格顶点的坐标,至少需要有(meshWidth+1) * (meshHeight+1) * 2 + meshOffset 个(x,y)坐标。
5)vertOffset: verts数组中开始跳过的(x,y)对的数目。
6)Colors: 可以为空,不为空为每个顶点定义对应的颜色值,至少需要有(meshWidth+1) * (meshHeight+1) * 2 + meshOffset 个(x,y)坐标。
7)colorOffset: colors数组中开始跳过的(x,y)对的数目。
8)paint: 可以为空。
Graphics/Clipping
1、Path该类封装了一系列方法,可以绘制线段、矩形、圆弧、椭圆、二次曲线、三次曲线等基本几何图形或是由这些基本几何图形组合;
Path.Direction绘制方向--CW是顺时针,CCW是逆时针;
2、Region.Op该枚举类型定义在graphic类中,提供了绘图过程中的剪切方式: