这一节总结一下关于图形处理相关的知识。Android中2D图形处理引擎主要有以下几个重要部分组成:
- Canvas:hold the”draw”calls. 画布,执行画图的操作函数(实际Canvas是画家的角色,Bitmap才是真正的画布)
- Bitmap:hold the pixels. 存放位图数据
- Paint:describe the colors and styles for the drawing 画笔的样式(颜色,粗细)
- drawing primtive: 绘图的原始内容
Canvas
在应用中当需要绘制特殊的图像或者动画时,Android系统提供了一个Canvas类,他包含很多的draw函数,可以把图象直接绘制到与界面绑定的Bitmap中。
Canvas(画布)必须和Bitmap绑定才可以进行操作,画布所有的绘制操作都会绘制到绑定的bitmap上面。
有三种形式可以获得Canvas类
new Canvas
我们可以直接创建一个Canvas对象。同时我们需要创建一个Bitmap绑定到Canvas类中。
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
通过Canvas类绘制的内容会保存的Bitmap里面,然后我们可以使用Canvas.draw(Bitmap, …)函数将Bitmap中的内容绘制到与系统界面绑定的Canvas中。
View.onDraw
通过自定义View,在onDraw()函数中系统会提供一个初始化完成的Canvas,我们可以直接调用draw函数绘制。
class CustomView1 extends View{
...
//在这里我们将测试canvas提供的绘制图形方法
@Override
protected void onDraw(Canvas canvas) {
RectF rect = new RectF(0, 0, 100, 100);
canvas.drawArc(rect, //弧线所使用的矩形区域大小
0, //开始角度
90, //扫过的角度
false, //是否使用中心
paint);
}
}
使用onDraw提供的Canvas参数,我们直接调用canvas.draw()或者其他draw函数时使用canvas作为参数。onDraw函数完成后,系统会自动将Canvas绘制的内容加载到view上。
on a SurfaceView
public class OpenCvonAndroidGTDforHOGActivity extends Activity
implements SurfaceHolder.Callback{
private SurfaceHolder _surfaceHolder;
private SurfaceView _surfaceView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_surfaceView = (SurfaceView)findViewById(R.id.imagesurface);
_surfaceHolder = _surfaceView.getHolder();
_surfaceHolder.addCallback(this);
_surfaceView.setWillNotDraw(false);
}
protected void onDraw(Canvas canvas) {
canvas.drawRGB(255, 0, 255);
}
public void surfaceCreated(SurfaceHolder holder) {
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
synchronized(holder) {
onDraw(canvas);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}
}
函数
save() resotre()
save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。save和restore之间,往往夹杂的是对Canvas的特殊操作。
clipXXX()
在当前的画图区域裁剪(clip)出一个新的画图区域,这个画图区域就是canvas对象的当前画图区域了。
drawXXX()
以一定的坐标值在当前画图区域画图。
translate(float dx, float dy)
rotate(float degrees)
Drawable
something that can be drawn.
Drawable就是一个可画对象的抽象。不同的资源类型代表着不同的Drawable类型。Android内置以下几种Drawable类型:ColorDrawable、GradientDrawable、BitmapDrawable、 NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、RotateDrawable、AnimationDrawable、LayerDrawable、LevelListDrawable、StateListDrawable、TransitionDrawable。
XML Bitmap
BitmapDrawable 是对bitmap的一种包装,可以设置它包装的bitmap在BitmapDrawable区域内的绘制方式,如平铺填充、拉伸填充或者保持图片原始大小,也可以在BitmapDrawable区域内部使用gravity指定的对齐方式。
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
android:antialias=["true" | "false"]
android:dither=["true" | "false"]
android:filter=["true" | "false"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:mipMap=["true" | "false"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
- android:antialias 锯齿效果
- android:dither 当图片像素和屏幕像素不匹配时,是否启用抖动效果
- android:filter 过滤效果
- android:gravity 位置
- android:tileMode
XML Nine-Patch
Android 平台特殊的图片格式 “点九图“,当图片需要伸缩时,可以按照我们的需求放大图片的某个部分。
<?xml version="1.0" encoding="utf-8"?>
<