一、概念
Android应用中的图片不仅包括.png、.jpg、*.gif等各种格式的位图,还包括使用XML资源文件定义的各种Drawable对象。
二、Drawable
给Android应用添加Drawable资源之后,Android SDK会在R清单文件中创建一个索引项:R.drawable.file_name。之后既可以在XML资源文件中通过@drawable/file_name访问这个Drawable对象,还可以在Java代码中通过R.drawable.file_name访问该Drawable对象。
R.drawable.file_name只是一个int类型的常量,代表的是Drawable对象的ID,如果Java程序中需要获取实际的Drawable对象,则需要调用Resources的getDrawable(int id)方法来实现。
三、Bitmap
Bitmap代表一个位图,BitmapDrawable中所封装的图片就是一个Bitmap。
把一个Bitmap对象包装成一个BitmapDrawable对象,可以调用BitmapDrawable的构造器:
//把一个Bitmap对象包装成BitmapDrawable对象
BitmapDrawable drawable = new BitmapDrawable(bitmap);
获取BitmapDrawable所包含的的Bitmap对象,可以调用BitmapDrawable的getBitmap()方法:
//获取BitmapDrawable所包装的Bitmap对象
Bitmap bitmap = drawable.getBitmap();
Bitmap常用方法:
createBitmap(Bitmap source , int x , int y , int width , int height):从源位图source的指定坐标点(给定x、y)开始,从中“挖取”宽、高的一块出来,创建新的Bitmap对象。
createScaledBitmap(Bitmap src , int dstWidth , int dstHeight , boolean filter):对源位图src进行缩放,缩放成宽为dstWidth、高为dstHeight的新位图。
createBitmap(int width , int height , Bitmap.Config config):创建一个宽width、高height的新位图。
createBitmap(Bitmap source , int x , int y , int width , int height , Matrix m , boolean filter):从源位图source的指定坐标点开始,从中“挖取”宽width、高height的一块出来,创建新的Bitmap对象,并按Matrix指定的规则进行交换。
BitmapFactory是一个工具类,它提供了很多方法用于从不同的数据源来解析、创建Bitmap对象。常用方法如下:
decodeByteArray(byte[] data , int offset , int length):从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象。
decodeFile(String pathName):从pathName指定的文件中解析、创建Bitmap对象。
decodeFileDescriptor(FileDescriptor fd):用于从FileDescriptor对应的文件中解析、创建Bitmap对象。
decodeResource(Resources res , int id):用于根据给定的资源ID从指定资源中解析、创建Bitmap对象。
decodeStream(InputStream is):用于从指定输入流中解析、创建Bitmap对象。
Android为Bitmap提供了两个方法来判断它是否已回收,以及强制Bitmap回收自己:
boolean isRecycled():返回该Bitmap对象是否已被回收。
void recycle():强制一个Bitmap对象立即回收自己。
四、绘图
Android的绘图应该继承View组件,并重写它的onDraw(Canvas canvas)方法即可。
1.Canvas
Canvas代表依附于指定View的画布,它提供了如下方法来绘制各种图形:
drawArc(RectF oval,float startAngle,float sweepAngle,boolean useCenter,Paint paint) 绘制弧
drawBitmap(Bitmap bitmap,Rect src, Rect dst,Paint paint) 在指定点绘制从源位图中“挖取”的一块
drawBitmap(Bitmap bitmap,float left,float top,Paint paint) 在指定点绘制位图
drawCircle(float cx,float cy,float radius,Paint paint) 在指定点绘制一个圆
drawLine(float startX,float startY,float stopX,float stopY,Paint paint) 绘制一条直线
drawLines(float[] pts,int offset,int count,Paint paint) 绘制多条直线
drawOval(RectF oval,Paint paint) 绘制椭圆
drawPath(Path path,Paint paint) 沿着指定Path绘制任意形状
drawPoint(float x,float y,Paint paint) 绘制一个点
drawPoints(float[] pts,int offset,int count,Paint paint) 绘制多个点
drawRect(float left,float top,float right,float bottom,Paint paint) 绘制矩形
drawRoundRect(RectF rect,float rx,float ry,Paint paint) 绘制圆角矩形
drawText(String text,int start,int end,Paint paint) 绘制字符串
drawTextOnPath(String text,Path path,float hOffset,float vOffset,Paint paint) 沿着路径绘制字符串
clipRect(float left,float top,float right,float bottom) 剪切一个矩形区域
clipRegion(Region region) 剪切指定区域
rotate(float degrees,float px,float py) 对Canvas执行旋转变换
scale(float sx,float sy,float px,float py) 对Canvas执行缩放变换
skew(float sx,float sy) 对Canvas执行倾斜变换
translate(float dx,float dy) 移动Canvas。向右移动dx距离(负数即向左移动);向下移动dy距离(负数即向上移动)
2.Paint
Paint代表Canvas上的画笔,Paint类主要用于设置绘制风格,包括画笔颜色、画笔笔触粗细、填充风格等。提供如下方法:
setARGB(int a,int r,int g,int b) 设置颜色
setColor(int color) 设置颜色
setAlpha(int a) 设置透明度
setAntiAlias(boolean a) 设置是否抗锯齿
setPathEffect(PathEffect effect) 设置绘制路径时的路径效果
setShader(Shader shader) 设置画笔的填充效果
setShadowLayer(float radius,float dx,float dy,int color) 设置阴影
setStrokeWidth(float width) 设置画笔的笔触宽度
setStrokeJoin(Paint.Join join) 设置画笔转弯处的连接风格
setStyle(Paint.Style style) 设置Paint的填充风格
setTextAlign(Paint.Align align) 设置绘制文本时的文字对齐方式
setTextSize(float textSize) 设置绘制文本时的文字大小
3.Path
Path是一个非常有用的类,它可以预先在View上将N个点连成一条“路径”,然后调用Canvas的drawPath(path,paint)方法即可沿着路径绘制图形。
五、图形特效处理
1.使用Matrix控制变换
Matrix是Android提供的一个矩阵工具类,它本身并不能对图形或组件进行变换,但它可以与其他API结合起来控制图形、组件的变换。
使用Matrix控制图形或组件变换的步骤:
1.获取Matrix对象,该Matrix对象既可新创建,也可直接获取其他对象内封装的Matrix;
2.调用Matrix的方法进行平移、旋转、缩放、倾斜等;
3.将程序对Matrix所做的变换应用到指定图形或组件。
Matrix提供了如下方法来控制平移、旋转和缩放:
setTranslate(float dx, float dy):控制Matrix进行平移。
setSkew(float kx, float ky, float px, float py):控制Matrix以px、py为轴心进行倾斜。
setSkew(float kx, float ky):控制Matrix进行倾斜。
setRotate(float degress):控制Matrix进行旋转,degrees控制旋转的角度。
setRotate(float degrees, float px, float py):设置以px、py为轴心进行旋转,degrees为控制旋转的角度。
setScale(float sx, float sy):设置Matrix进行缩放。
setScale(float sx, float sy, float px, float py):设置Matrix以px、py为轴心进行缩放。
Canvas提供了drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)方法,可以在绘制bitmap时应用Matrix上的变换。
2.drawBitmapMesh方法
Canvas提供了一个drawBitmapMesh(Bitmap bitmap, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)方法,这个方法可以对bitmap进行扭曲。
方法参数说明:
bitmap:指定需要扭曲的源位图。
meshWidth:该参数控制在横向上把该源位图划分成多少格。
meshHeight:该参数控制在纵向上把该源位图划分成多少格。
verts:该参数是一个长度为(meshWidth+1)(meshHeight+1)2的数组,它记录了扭曲后的位图各“顶点”位置。
vertOffset:控制verts数组中从第几个数组元素开始才对bitmap进行扭曲。
3.Shader填充图形
Android不仅可以使用颜色来填充图形,也可以使用Shader对象指定的渲染效果来填充图形。
Shader本身是一个抽象类,它提供了如下实现类:
BitmapShader:使用位图平铺的渲染效果。
LinearGradient:使用线性渐变来填充图形。
RadialGradient:使用圆形渐变来填充图形。
SweepGradient:使用角度渐变来填充图形。
ComposeShader:使用组合渲染效果来填充图形。
六、相关链接
Android Drawable完全解析(二):Drawable子类用法总结(一)