AndroidUI之绘图机制和原理 最完整的文章

时间:2023-03-09 19:31:34
AndroidUI之绘图机制和原理 最完整的文章

转载请标明出处:http://blog.****.net/sk719887916/article/details/39961171,作者:skay

 导读:

熟悉javaGUI的朋友对java绘图必定很熟悉,安卓也沿用了java的绘图原理,但是又新增了XML技术,java绘图所有的图形控件必须代码布出来,安卓可以方便的在xml配置,其api通过pull解析将xml解析到iava代码上,再利用view的父类的Ondraw()进行深层绘制。身边认识的做开发的朋友一般都是从javaEE 转型的,或者直接从事安卓的,不管从哪个方向而来,良好的java基础,必定使我们的安卓打下基础,开发中难免遇到原生控件无法实现的UI,所以我们就需要自定义控件来实现,一个好的自定义控件开发者不仅需要掌握安卓的view生命周期,事件机制,动画,还需要有好的绘图技术,今天给大家介绍安卓下的绘图有关知识。

一 画笔 paint

1 ,Paint

安卓提供了丰富的画笔工具,paint犹如现实的一只笔,可以设置颜色,大小等属性,供我们来使用,在纸上写字,画形状和画图。

主要API:



   void  setARGB(int a, int r, int g, int b)  设置Paint对象颜色,参数一为alpha透明通道



   void  setAlpha(int a)  设置alpha不透明度,范围为0~255 float为0-1.0



  void  setAntiAlias(boolean aa)  //是否抗锯齿



   void  setColor(int color)  //设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义



   void  setFakeBoldText(boolean fakeBoldText)  //设置伪粗体文本



   void  setLinearText(boolean linearText)  //设置线性文本



   PathEffect  setPathEffect(PathEffect effect)  //设置路径效果 ,用于canver绘制不规则图形



    Rasterizer  setRasterizer(Rasterizer rasterizer) //设置光栅化



    Shader  setShader(Shader shader)  //设置阴影 



   void  setTextAlign(Paint.Align align)  //设置文本对齐



    void  setTextScaleX(float scaleX)  //设置文本缩放倍数,1.0f为原始    



    void  setTextSize(float textSize)  //设置字体大小



     Typeface  setTypeface(Typeface typeface)  //设置字体,Typeface包含了字体的类型,粗细,还有倾斜、颜色等。



      void  setUnderlineText(boolean underlineText)  //设置下划线



       void  setARGB(int a, int r, int g, int b)  设置Paint对象颜色,参数一为alpha透明通道



    void  setAlpha(int a)  设置alpha不透明度,范围为 int  0~255 或者 flaot0-1.0

void  setTextAlign(Align.LEFT);// 文本左对齐



      void  setAntiAlias(boolean aa)  //是否抗锯齿



    void  setColor(int color)  //设置颜色



   void  setFakeBoldText(boolean fakeBoldText)  //设置伪粗体文本



    void  setLinearText(boolean linearText)  //设置线性文本

PathEffect  setPathEffect(PathEffect effect)  //设置路径效果

2  PaintDrawable 油漆刷

PaintDrawable是Drawable的子类,是带有宽度的画笔,其不仅具有Drawable的方法,而且具有ShapeDrawable的属性。其API如下:

voidsetCornerRadii(float[] radii) //空心圆圈

      

   void setCornerRadius(float radius)  //实心圆

主要继承父类的的方法:

从类 android.graphics.drawable.ShapeDrawable 继承的方法:

draw, getChangingConfigurations, getConstantState, getIntrinsicHeight, getIntrinsicWidth, getOpacity, getPadding, getPaint, getShaderFactory, getShape, inflate, mutate, setAlpha, setColorFilter, setDither, setIntrinsicHeight, setIntrinsicWidth, setPadding,
setPadding, setShaderFactory, setShape

 

  从类 android.graphics.drawable.Drawable 继承的方法:

clearColorFilter, copyBounds, copyBounds, createFromPath, createFromResourceStream, createFromStream, createFromXml, createFromXmlInner, getBounds, getCurrent, getLevel, getMinimumHeight, getMinimumWidth, getState, getTransparentRegion, invalidateSelf,
isStateful, isVisible, resolveOpacity, scheduleSelf, setBounds, setBounds, setCallback, setChangingConfigurations, setColorFilter, setFilterBitmap, setLevel, setState, setVisible, unscheduleSelf

二, 画布(canvas)

安卓的画布通过笔来绘制可见的形状,图片,文字等,犹如现实中的白纸,通过paint绘制需要的UI图。其主要api如下:

//canvas.clipPath(path);  绘路径效果,一般画三角形,不规则的形状。

//canvas.drawARGB(a, r, g, b); 绘制基于三原色的颜色(红、绿、蓝)

//canvas.drawBitmap(bitmap, matrix, paint);绘制位图

//canvas.drawLines(pts, paint); 绘制直线

//canvas.drawText(text, x, y, paint);绘制文字

//canvas.drawCircle(cx, cy, radius, paint);绘制圆形

//canvas.drawPicture(picture);绘制图片

//canvas.drawRect(r, paint);绘制矩形

//canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint);绘制圆弧

ps:

oval :指定圆弧的外轮廓矩形区域。

                 startAngle: 圆弧起始角度,单位为度。

                sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。

                useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。

                paint: 绘制圆弧的画板属性,如颜色,是否填充等

//canvas.drawPaint(paint);绘制圆点

三 , BItmap 位图

Bitmap称作位图,又称点阵图,是使用像素阵列来表示的图像,每个像素的颜色信息由RGB组合或者灰度值表示。根据颜色信息所需的数据位分为1、4、8、16、24及32位等,位数越高颜色越丰富,相应的数据量越大。其中使用1位表示一个像素颜色的位图因为一个数据位只能表示两种颜色,所以又称为二值位图。通常使用24位RGB组合数据位表示的的位图称为真彩色位图。一般来说,位图是没有经过压缩的,位图文件体积比较大。(位图常用的压缩算法是通过“索引颜色表”实现的),位图大多支持alpha通道(透明通道),安卓中通常用来显示图片。

具api:

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)  //指定资源,绘制起点坐标,宽高和缩放比例

createBitmap(int width, int height, Bitmap.Config config)   .指定宽高和配置色彩

createBitmap(Bitmap source, int x, int y, int width, int height)  转换大小

createBitmap(int[] colors, int offset, int stride, int width, int height, Bitmap.Config config)  指定颜色,绘制起点坐标,宽高和宽高和配置色彩


createBitmap(Bitmap src)   转换

createBitmap(int[] colors, int width, int height, Bitmap.Config config)   指定颜色,,绘制宽高和宽高和配置色彩

createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)   ,指定资源,宽高和宽高和配置色彩

2 通过BitmapFactory解码

主要是通过以下四大形式的多太加载生成bitmap

decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)  //解析byte[]

decodeByteArray(byte[] data, int offset, int length)  //加载字节数组



   decodeFile(String pathName)   加载图片文件



   decodeFile(String pathName, BitmapFactory.Options opts)  



   decodeResource(Resources res, int id, BitmapFactory.Options opts)  加载资源文件

  

   decodeResource(Resources res, int id)   通过资源id

四 ,矩阵 Matrix

Matrix为,一般用来与Bitmap和canvas配合,实现图像的缩放、变形、扭曲等操作。有时我们安卓事件操作中也会利用坐标是否在矩阵内进行点击有效区域判断。

boolean  postScale(float sx, float sy)//缩放

boolean     postSkew(float kx, float ky)//扭曲

boolean     postTranslate(float dx, float dy)//转换

boolean     preConcat(Matrix other)//合并

boolean     preRotate(float degrees)//旋转

一般使用Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);    和canvas.drawBitmap(bitmap, matrix, paint);来进行缩放。

五 Drawable 

Drawable
一般安卓用来加载res文件资源文件。可以和bitmap相互转换,当然也可以用给imagview设置资源展现到界面上,也可以canvas.drawBitmap形式绘制到界面上

Drawable
- 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。

作为效率和性能考虑,他完胜Bitmap,

后者转前者

BbitmapDrawable
bitmapDrawable= new BitmapDrawable(bitmap)

前者转后者具体方法参考上面的api

六  安卓绘图矢量

安卓中所有绘制api所传入的宽高都是从屏幕左上角计算的。默认(0,0),如果只有一个view 我们又未指定其开始坐标,left就是x,top就是Y,

其view的 onMeasure(),onlayout().中的距离都是按此规则计算的。如果存在多个view嵌套, 那么lefr。top以父布局的左上角开始计算,具体细节请有兴趣的朋友可以阅读

下下篇view生命周期文章。

AndroidUI之绘图机制和原理 最完整的文章

七 安卓使用基础绘图类。

一般自定义view时候我们复写onDraw()方法。此api自带Canvas回来,此时可以根据自己的需要来绘制不同颜色,大小的形状,和图片。

当然我们在activty中也可以new一个画笔和画布,绘制完之后的最后add到view中,

普通绘制用法的画法。

@Override

	protected void onDraw(Canvas canvas) {
	 canvas.drawColor(Color.BLACK);
	 paint  = new Paint();
	 //画文字
	 canvas.drawText("wennzi", textOffsetX, textOffsetY,paint);
	 //画图片
	 canvas.drawBitmap(bitmap, left, top, paint);
	 //画直线
	 canvas.drawLines(pts, paint);

	 super.onDraw(canvas);
	 }

因此可以看出,目前市场开源的的图表引擎和绘图引擎也是此原理,只不过封装了好了常用的表格,动画,曲线等效果,其具体大小和数字参数由开发者来自我设

置,通过本篇文章,回顾一下大致了解了安卓的绘图基础类和图形绘制机制。更多文章请点击:http://blog.****.net/sk719887916,欢迎阅读