AndroidUI之绘图机制和原理 最完整的文章
转载请标明出处: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之绘图机制和原理 最完整的文章的更多相关文章
- Android群英传笔记——第六章:Android绘图机制与处理技巧
Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...
- Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧
第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...
- Java序列化的机制和原理
Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法. 有关Java对象的序列化和反序列化也算是Java基础 ...
- Java序列化机制和原理及自己的理解
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...
- Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美
Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...
- Android绘图机制(一)——自定义View的基础属性和方法
Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...
- Qt核心机制与原理
转: https://blog.csdn.net/light_in_dark/article/details/64125085 ★了解Qt和C++的关系 ★掌握Qt的信号/槽机制的原理和使用方法 ★ ...
- Java序列化机制和原理
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...
- Java序列化的机制和原理 转
转 http://developer.51cto.com/art/200908/147650.htm Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对 ...
随机推荐
- Java并发框架——什么是AQS框架
什么是AQS框架 1995年sun公司发布了第一个java语言版本,可以说从jdk1.1到jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型并发场景,当然也 ...
- zookeeper分布式部署方案
版本:http://apache.fayea.com/zookeeper/zookeeper-3.4.8/环境:debian 7/8说明:最低配置3台步骤:1.下载zookeeper-3.4.8并解压 ...
- 在Linux环境下实现一个非常好的bash脚本框架
为了方便我日常工作中的编译环境,免去我敲命令行所浪费的时间,我个人写了一个非常有用而又简单的脚本框架,该框架即可以完成的工程源码编译,也可以清除,拷贝等等操作,具体需要开发者自己来实现细节,我的框架思 ...
- 【并发编程】ThreadPoolExecutor参数详解
ThreadPoolExecutor executor = new ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long ke ...
- Intent和PendingIntent的区别
intent英文意思是意图,pending表示即将发生或来临的事情. PendingIntent这个类用于处理即将发生的事情.比如在通知Notification中用于跳转页面,但不是马上跳转. I ...
- (九十六)借助APNS实现远程通知、后台任务
APNS全称为Apple Push Notification Service,可以实现在app不启动时也能通过服务器推送到iOS端特定设备的功能. APNS的实现原理为先发送设备的UDID和应用的Bu ...
- Java进阶(三十七)java 自动装箱与拆箱
Java进阶(三十七)java 自动装箱与拆箱 前言 这个是jdk1.5以后才引入的新的内容.java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装称为装箱,解包装称为 ...
- UNIX环境高级编程——线程限制
- SharePoint 2013: The "New Web Application" button is disabled is the central administration
安装完sharepoint foundation2013后,直接通过url访问管理中心,想进application management去新建的话会发现新建按钮是灰色的,即使你用的是系统管理员账号并且 ...
- Android使用SimpleAdapter
SimpleAdapter的使用步骤如下: 声明ListView,并进行初始化操作 准备数据集,一般用list来实现,当然也可以使用数组 为listview适配simpleadapter 如下代码: ...