Android Canvas方法总结最全面详解API(小结)

本篇文章主要介绍了Android Canvas方法总结最全面详解API,分享给大家,具体如下:

常用方法

  1. drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层。
  2. clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图区域,这个 画图区域就是canvas对象的当前画图区域了。比如:clipRect(new Rect()), 那么该矩形区域就是canvas的当前画图区域
  3. getXxx方法族:获得与Canvas相关一些值,比如宽高,屏幕密度等。
  4. save(),restore(),saveLayer(),restoreToCount()等保存恢复图层的方法
  5. translate(平移),scale(缩放),rotate(旋转),skew(倾斜)

Canvas平移translate

canvas.translate(100, 50);

Canvas缩放scale

/**
 * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍
 * 参数1: X轴的放大倍数
 * 参数2: Y轴的放大倍数
 */
canvas.scale(2, 4);

/**
 * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍
 * 参数1: X轴的放大倍数
 * 参数2: Y轴的放大倍数
 * 参数3: 原点X坐标
 * 参数4: 原点Y坐标
 */
canvas.scale(2, 4,100,100);

Canvas旋转rotate

/**
 * 原点为中心,旋转30度(顺时针方向为正方向 )
 * 参数: 旋转角度
 */
canvas.rotate(30);

/**
 * 以(100,100)为中心,旋转30度,顺时针方向为正方向
 * 参数: 旋转角度
 */
canvas.rotate(30,100,100);

Canvas倾斜skew

//sx为x轴方向上倾斜的对应角度,sy为y轴方向上倾斜的对应角度,两个值都是tan值哦!
// 都是tan值!都是tan值!比如要在x轴方向上倾斜60度,那么小数值对应:tan 60 = 根号3 = 1.732!
canvas.skew(0.2f,-0.8f);
Canvas保存和还原

Canvas提供了几个方法,让我们可以方便的对Canvas的状态进行更改和还原。
这些方法是:save()、restore()、restoreToCount(int saveCount)。

我们在对Canvas进行平移、旋转、放大等操作时候,可以调用save()方法,将当前修改过的Canvas状态进行保存,调用restore() 方法后,会将Canvas还原成最近的一个save() 的状态。

save()方法还会有一个返回值,我们也可以调用restoreToCount(int saveCount)方法,将这个返回值作为参数传递进去,就可以将Canvas还原成某一个特定的save()状态。

canvas.translate(100,100); // 平移(100,100)
 int save1 = canvas.save(); // 保存Canvas状态(状态1)
 canvas.scale(2, 2); // 放大2倍
 int save2 = canvas.save(); // 保存Canvas状态(状态2)
 canvas.restore(); // 返回最新的save状态,即状态2
 canvas.restoreToCount(save1);// 手动指定的返回到 状态1

注:Canvas的平移、旋转等相当于一个图层,如果你先贴图drawBitmap,在平移就会没有效果,平移了一个空白的图层肯定是没有效果的

saveLayer()与restoreToCount()讲解

其实这两个方法和save以及restore大同小异,只是在后者的基础上多了一些东东而已, 比如saveLayer(),有下面多个重载方法:

你可以理解为save()方法保存的是整个Canvas,而saveLayer()则可以选择性的保存某个区域的状态, 另外,我们看到餐宿和中有个:int saveFlags,这个是设置改保存那个对象的!可选值有:

标记 说明
ALL_SAVE_FLAG 保存全部的状态
CLIP_SAVE_FLAG 保存裁剪的某个区域的状态
CLIP_TO_LAYER_SAVE_FLAG 保存预先设置的范围里的状态
FULL_COLOR_LAYER_SAVE_FLAG 保存彩色涂层
HAS_ALPHA_LAYER_SAVE_FLAG 不透明图层保存
MATRIX_SAVE_FLAG Matrix信息(translate,rotate,scale,skew)的状态保存
RectF bounds = new RectF(0, 0, 400, 400);
canvas.saveLayer(bounds, mPaint, Canvas.CLIP_TO_LAYER_SAVE_FLAG);
canvas.drawColor(getResources().getColor(R.color.moss_tide));
canvas.drawBitmap(bmp, 200, 200, mPaint);
canvas.restoreToCount(1);
canvas.drawBitmap(bmp, 300, 200, mPaint);

运行结果:

画文字

/**
 * 参数2:文本的x轴的开始位置
 * 参数2:文本Y轴的结束位置
 * 参数3:画笔对象
 */
canvas.drawText("开始写字了!",50, 50, p);// 画文本 

/**
 * 参数2:要从第几个字开始绘制
 * 参数3:要绘制到第几个文字
 * 参数4:文本的x轴的开始位置
 * 参数5:文本Y轴的结束位置
 * 参数6:画笔对象
 */
canvas.drawText("开始写字了!",2,5, 50, 50, p);// 画文本,结果为:“写字了”
/**
 * 参数2:路径
 * 参数3:距离路径开始位置的偏移量
 * 参数4:距离路径上下的偏移量(可以为负数)
 * 参数5:画笔对象
 */
canvas.drawTextOnPath("1234567890101123123", path, 0, -50, p);

画圆

/**
 * 参数1:圆心X
 * 参数2:圆心Y
 * 参数3:半径R
 * 参数4:画笔对象
 */
canvas.drawCircle(200, 200, 100, p);

画线

/*
 * 参数1:startX
 * 参数2:startY
 * 参数3:stopX
 * 参数4:stopY
 * 参数5:画笔对象
 */
canvas.drawLine(100, 100, 300, 300, p);// 画线
/*
 * 同时绘制多条线。
 * 参数1:float数组:每四个一组为一条线。最后不足四个,就忽略那些值。
 * 参数2:画笔对象
 */
canvas.drawLines(new float[]{100,100,200,200,200,100,300,100}, p);

画椭圆

/*
 * 参数1:float left
 * 参数2:float top
 * 参数3:float right
 * 参数4:float bottom
 */
RectF oval = new RectF(150, 200, 500, 400);// 画一个椭圆
canvas.drawOval(oval, p);

画弧度

/**
 * 画圆弧
 * 参数1:RectF对象。
 * 参数2:开始的角度。(水平向右为0度顺时针反向为正方向)
 * 参数3:扫过的角度
 * 参数4:是否和中心连线
 * 参数5:画笔对象
 */
canvas.drawArc(oval, 20, 180, false, p);

矩形

/**
 * 矩形
 * 参数1:float left
 * 参数2:float top
 * 参数3:float right
 * 参数4:float bottom
 */
canvas.drawRect(100,100, 200, 200, p); 

//画圆角矩形
RectF oval3 = new RectF(80, 260, 200, 300);// 设置个新的长方形
canvas.drawRoundRect(oval3, 20, 5, p);//第二个参数是x半径,第三个参数是y半径

多边形

/**
 * Path类封装复合(多轮廓几何图形的路径
 * 由直线段*、二次曲线,和三次方曲线,也可画以油画。drawPath(路径、油漆),要么已填充的或抚摸
 * (基于油漆的风格),或者可以用于剪断或画画的文本在路径。
 */
Path path = new Path(); // 路径对象
path.moveTo(80, 200);// 此点为多边形的起点
path.lineTo(120, 250);
path.lineTo(80, 250);
//.... 可以添加多个点。构成多边形
path.close(); // 使终点和起点链接,构成封闭图形
  canvas.drawPath(path, p);

画贝塞尔曲线

p.setStyle(Style.STROKE);
Path path2=new Path();
path2.moveTo(100, 100);//设置Path的起点
/**
 * 参数1、2:x1,y1为控制点的坐标值
 * 参数3、4:x2,y2为终点的坐标值
 */
path2.quadTo(300, 100, 400, 400); //设置贝塞尔曲线的控制点坐标和终点坐标
path2.quadTo(500, 700, 800, 800);
canvas.drawPath(path2, p);//画出贝塞尔曲线

画点

/**
 * 参数1、2:点的x、y坐标
 */
canvas.drawPoint(60, 390, p);//画一个点
/**
 * 参数1:多个点,每两个值为一个点。最后个数不够两个的值,忽略。
 */
canvas.drawPoints(new float[]{60,400,65,400,70,400}, p);//画多个点

画图片

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
/**
 * 参数1:bitmap对象
 * 参数2:图像左边坐标点
 * 参数3:图像上边坐标点
 */
canvas.drawBitmap(bitmap, 200,300, p);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android 游戏开发之Canvas画布的介绍及方法
  • Android开发之图形图像与动画(一)Paint和Canvas类学习
  • Android canvas drawBitmap方法详解及实例
  • Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭圆,三角形等)
  • Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)
  • Android中使用Canvas绘制南丁格尔玫瑰图(Nightingale rose diagram)
  • Android使用Canvas绘制圆形进度条效果
  • Android中Canvas的常用方法总结
  • Android画图之抗锯齿paint和Canvas两种方式实例
(0)

相关推荐

  • Android中使用Canvas绘制南丁格尔玫瑰图(Nightingale rose diagram)

    南丁格尔玫瑰图 在常规图表中实在很惊艳,但我初看没看懂,一查原来南丁格尔这么伟大,确实值得尊敬. 再仔细研究了下这种图的构成,发现原来就是把柱形图的柱形换成了扇形图的半径来表示,当然,变种有好多,我这只是说我理解的这种. 知道了其构成方式后就好实现了,依传入参数个数决定其扇形角度,依百分比决定其扇形的半径长度,然后就一切都水到渠成了. 漂亮的美图献上: 附上实现代码: package com.xcl.chart; /** * Canvas练习 * 自已画南丁格尔玫瑰图(Nightingale r

  • Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭圆,三角形等)

    本文实例讲述了Android编程开发之在Canvas中利用Path绘制基本图形的方法.分享给大家供大家参考,具体如下: 在Android中绘制基本的集合图形,本程序就是自定义一个View组件,程序重写该View组件的onDraw(Canvase)方法,然后在该Canvas上绘制大量的基本的集合图形. 直接上代码: 1.自定义的View组件代码: package com.infy.configuration; import android.content.Context; import andro

  • Android中Canvas的常用方法总结

    一.对Canvas进行操作 对Canvas的一系列操作,是指对Canvas进行旋转.平移.缩放等操作. 这些操作可以让Canvas对象使用起来更加便捷. 二.Canvas平移 /** * 画布向(100,50)方向平移 * * 参数1: 向X轴方向移动100距离 * 参数2: 向Y轴方向移动50距离 */ canvas.translate(100, 50); 三.Canvas缩放 /** * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍 * 参数1: X轴的放大倍数 * 参数2: Y轴的放

  • Android使用Canvas绘制圆形进度条效果

    前言 Android自定义控件经常会用到Canvas绘制2D图形,在优化自己自定义控件技能之前,必须熟练掌握Canvas绘图机制.本文从以下三个方面对Canvas绘图机制进行讲解: 画布Canvas 画笔Paint 示例圆形进度条 画布Canvas 首先,来看一下Android官网对Canvas类的定义: The Canvas class holds the "draw" calls.To draw something, you need 4 basic components: A B

  • Android 游戏开发之Canvas画布的介绍及方法

    Canvas,在英语中,这个单词的意思是帆布.在Android中,则把Canvas当做画布,只要我们借助设置好的画笔(Paint类)就可以在画布上绘制我们想要的任何东西:另外它也是显示位图(Bitmap类)的核心类.随用户的喜好,Canvas还可设置一些关于画布的属性,比如,画布的颜色.尺寸等.Canvas提供了如下一些方法:    Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布.    Canvas(Bitmap bitmap): 以bitmap对

  • Android开发之图形图像与动画(一)Paint和Canvas类学习

    Paint类 *Paint类代表画笔,用来描述图形的颜色和风格,如线宽,颜色,透明度和填充效果等信息. *使用Paint类时,需要先创建该类的对象,可以通过该类的构造函数实现.通常情况的实现代码是: *Paintpaint=newPaint(); *创建完Paint对象后,可以通过该对象提供的方法对画笔的默认设置进行改变 Canvas *Canvas类代表画布,通过该类提供的构造方法,可以绘制各种图形. *通常情况下,要在Android中绘图,需要先创建一个继承自View类的视图,并且在该类中重

  • Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)

    本文实例讲述了Android编程之canvas绘制各种图形的方法.分享给大家供大家参考,具体如下: 1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into

  • Android画图之抗锯齿paint和Canvas两种方式实例

    在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿.其实Android自带了解决方式. 方法一:给Paint加上抗锯齿标志.然后将Paint对象作为参数传给canvas的绘制方法. paint.setAntiAlias(true); 方法二:给Canvas加上抗锯齿标志. 有些地方不能用paint的,就直接给canvas加抗锯齿,更方便. 复制代码 代码如下: canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_AL

  • Android canvas drawBitmap方法详解及实例

     Android canvas drawBitmap方法详解及实例 之前自己在自定义view,用到canvas.drawBitmap(Bitmap, SrcRect, DesRect, Paint)的时候,对其中的第2和3个参数的含义含糊不清.看源码函数也没理解,然后看了一些其他的博客加上自己的理解,整理如下.首先,我们看一张图片,今天就要绘制这张图片. 然后将图片用红色的线条分成4个部分,如下: 我们自定义一个View,代码如下: public class PoterDuffLoadingVi

  • Android Canvas方法总结最全面详解API(小结)

    本篇文章主要介绍了Android Canvas方法总结最全面详解API,分享给大家,具体如下: 常用方法 drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层. clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图区域,这个 画图区域就是canvas对象的当前画图区域了.比如:clipRect(new Rect()), 那么该矩形区域就是canvas的当前画图区域 getXxx方法族:获得与Canvas相关一些值,比如宽高

  • Android Canvas和Bitmap结合绘图详解流程

    目录 Rect/RectF Matrix Canvas Bitmap Rect/RectF 存储四个值的矩形类:左侧.顶部.右侧和底部.可用于直接在画布上绘制或仅用于存储要绘制的对象的大小.Rect和RectF类之间的区别在于 RectF 存储浮点值,而Rect类存储整数. private static Bitmap createDrawableBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth(); int he

  • Android 开发订单流程view实例详解

     Android 开发订单流程view实例详解 先看看最终效果图: 怎么样,效果还是很不错的吧?群里有人说切四张图的.recycleview的.各种的都有啊,但是最简单的就是通过自定义view来实现了-接下来让我们来实现下这个(订单流程view). 首先我们定义好我们的自定义属性: attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleabl

  • Android性能优化大图治理示例详解

    目录 引言 1 自定义大图View 1.1 准备工作 1.2 图片宽高适配 1.3 BitmapRegionDecoder 2 大图View的手势事件处理 2.1 GestureDetector 2.2 双击放大效果处理 2.3 手指放大效果处理 引言 在实际的Android项目开发中,图片是必不可少的元素,几乎所有的界面都是由图片构成的:像列表页.查看大图页等,都是需要展示图片,而且这两者是有共同点的,列表展示的Item数量多,如果全部加载进来势必会造成OOM,因此列表页通常采用分页加载,加上

  • Android自定义view实现侧滑栏详解

    目录 前言 需求 效果图 编写代码 主要问题 前言 上一篇文章学了下自定义View的onDraw函数及自定义属性,做出来的滚动选择控件还算不错,就是逻辑复杂了一些.这篇文章打算利用自定义view的知识,直接手撕一个安卓侧滑栏,涉及到自定义LayoutParams.带padding和margin的measure和layout.利用requestLayout实现动画效果等,有一定难度,但能重新学到很多知识! 需求 这里类似旧版QQ(我特别喜欢之前的侧滑栏),有两层页面,滑动不是最左侧才触发的,而是从

  • Android事件处理的两种方式详解

    安卓提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理. 基于监听的事件处理 基于监听的事件处理一般包含三个要素,分别是: Event Source(事件源):事件发生的场所,通常是各个组件 Event(事件):事件封装了界面组件上发生的特定事件(通常就是用户的一次操作) Event Listener(事件监听器):负责监听事件源发生的事件,并对各种事件作出相应的响应 下面使用一个简单的案例介绍按钮事件监听器 布局文件就是简单的线性布局器,上面是一个EditText,下面是一个Bu

  • Android 广播大全 Intent Action 事件详解

    具体内容如下所示: Intent.ACTION_AIRPLANE_MODE_CHANGED; //关闭或打开飞行模式时的广播 Intent.ACTION_BATTERY_CHANGED; //充电状态,或者电池的电量发生变化 //电池的充电状态.电荷级别改变,不能通过组建声明接收这个广播,只有通过Context.registerReceiver()注册 Intent.ACTION_BATTERY_LOW; //表示电池电量低 Intent.ACTION_BATTERY_OKAY; //表示电池电

  • Android TextView Marquee的应用实例详解

    Android TextView Marquee的应用实例详解 亲测可能.直接上代码. Xml代码 <TextView android:id="@+id/toolbar_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" androi

  • Android 中读取Excel文件实例详解

    Android 中读取Excel文件实例详解 最近有个需求需要在app内置数据,新来的产品扔给了我两个Excel表格就不管了(两个表格格式还不统一...),于是通过度娘等方法找到了Android中读取Excel表格文件的一种方法,记录一下. 闲话一下Excel中工作簿和工作表的区别: 工作簿中包含有工作表.工作簿可以由一张或多张工作表组成,一个工作簿就是一个EXCEL表格文件. 好了,开始读取表格文件吧. 前提 首先,我们假设需要读取的表格文件名字为test.xls, 位于assets根目录下.

  • Android USB转串口通信开发实例详解

     Android USB转串口通信开发实例详解 好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程. 我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信.整个开发流程可以总结为以下几点: 1.发现设备 UsbManager usbManager = (UsbManager) context.getSystem

随机推荐