转载请标明出处:http://blog.csdn.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生命周期文章。

七 安卓使用基础绘图类。

一般自定义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.csdn.net/sk719887916,欢迎阅读

AndroidUI之绘图机制和原理 最完整的文章的更多相关文章

  1. Android群英传笔记——第六章:Android绘图机制与处理技巧

    Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...

  2. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...

  3. Java序列化的机制和原理

    Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法. 有关Java对象的序列化和反序列化也算是Java基础 ...

  4. Java序列化机制和原理及自己的理解

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

  5. Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美

    Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...

  6. Android绘图机制(一)——自定义View的基础属性和方法

    Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...

  7. Qt核心机制与原理

    转:  https://blog.csdn.net/light_in_dark/article/details/64125085 ★了解Qt和C++的关系 ★掌握Qt的信号/槽机制的原理和使用方法 ★ ...

  8. Java序列化机制和原理

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

  9. Java序列化的机制和原理 转

    转 http://developer.51cto.com/art/200908/147650.htm Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对 ...

随机推荐

  1. Android必知必会-Android Studio修改包名

    如果移动端访问不佳,请尝试–> Github版 背景 公司做相似产品较多,一般都是以某个产品为基础修改,逐步替换设计图的切图.这个就会导致需要经常为Copy的项目修改包名. 这里是参考一些网上的 ...

  2. SQL基本函数

    字符型函数 函数名称 描述 LOWER 将特定的字符串转化为小写,只影响字母字符串. UPPER 将整个字符串转换成大写,只影响字母字符串. INITCAP 将字符串中每一个单词的第一个字母转换为大写 ...

  3. Oracle 大数据集成实施

    Oracle 大数据实施架构 Oracle为广大客户提供了一个预装的用于测试和学习目的的免费大数据环境.你可以在这个环境中对Oracle大数据一体机(Big Data Appliance)上的可选软件 ...

  4. 自定义控件辅助神器ViewDragHelper

    ViewDragHelper作为官方推出的手势滑动辅助工具,极大的简化了我们对手势滑动的处理逻辑,v4包中的SlidingPaneLayout和DrawerLayout内部都有ViewDragHelp ...

  5. MySQL 存储过程探秘

    关于存储过程的优点,本文不再阐述.这里只是对创建存储过程时可能遇到的问题做一下简单的分析. 必备基础 这里说的基础,是相关于如何创建一个存储过程的. DELIMITER:分隔符,定界符. 作用就是:作 ...

  6. 【移动开发】ViewPager缓存机制

    1.    实现ViewPager的页面懒加载:在某些情况下,例如使用ViewPager查看多张大图,此时多张图片不能一次性载入,只有在浏览该页面时才载入(或者预先载入下一页面)页面的具体内容.2. ...

  7. J2EE进阶(七)利用SSH框架根据数据表建立model类

    J2EE进阶(七)利用SSH框架根据数据表建立model类 前言 在利用SSH框架进行项目开发时,若将数据库已经建好,并且数据表之间的依赖关系已经确定,可以利用Hibernate的反转功能进行mode ...

  8. (七十四)iOS8之前使socket可以后台运行的方法

    对于使用socket通信的应用程序,常常希望App位于后台时仍然可以进行网络通信,这在iOS8和以后的版本是被默认允许的,socket可以直接在后台运行,而对于iOS8之前的版本就不行,需要进行两步设 ...

  9. Uva - 514 - Rails

    C是一个栈,每次先检查A的第一个元素是否满足,如果满足,直接进入B:再检查C中栈顶元素是否满足,如果满足,出栈进入B:前两步都不满足将A放入C栈中.循环到B满或者A,C中都不满足条件并且A空,第一种情 ...

  10. Ubuntu启动eclipse问题

    Ubuntu启动eclipse问题 在Ubuntu安装eclipse后 可以在终端顺利启动eclipse:进入eclipse目录,在终端输入命令 ./eclipse > /dev/null 2& ...