绘图

android的绘图应该继承View组件,并重写onDraw(Canvas canvas)方法即可。

重写onDraw(Canvas canvas)方法时涉及一个绘图API:Canvas,Canvas代表了“依附”于指定View的画布,其提供了如下图所示的方法——用于绘制各种图像:

注意:在Canvas提供的绘制方法中还用到了一个API:Path,Path代表任意多条直线连接而成的任意图形,当Canvas根据Path绘制时,可以绘制出任意的形状。

实例如下:

布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <com.example.mycanvas.MyView
android:id="@+id/myView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> </LinearLayout> 代码实现==》
package com.example.mycanvas; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View; public class MyView extends View
{
public MyView(Context context, AttributeSet set)
{
super(context, set);
} @Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
// 把整张布绘制成白色
canvas.drawColor(Color.WHITE);
Paint p = new Paint();
// 去除锯齿
p.setAntiAlias(true);
p.setColor(Color.BLUE);
p.setStyle(Paint.Style.STROKE);
p.setStrokeWidth(3);
// 绘制圆形
canvas.drawCircle(40, 40, 30, p);
// 绘制正方形
canvas.drawRect(10, 80, 70, 140, p);
// 绘制矩形
canvas.drawRect(10, 150, 70, 190, p);
RectF rect = new RectF(10, 200, 70, 230);
// 绘制圆角矩形
canvas.drawRoundRect(rect, 15, 15, p);
RectF rect1 = new RectF(10, 240, 70, 270);
// 绘制椭圆
canvas.drawOval(rect1, p); paintTriangle(canvas, p);
paintFivePointStar(canvas, p);
paintGraph(canvas, p);
paintGraph2(canvas, p);
paintGraph3(canvas, p);
} /* 设置字符大小后绘制 */
private void paintGraph3(Canvas canvas, Paint paint)
{
paint.setTextSize(26);
paint.setShader(null);
// 绘制字符串
canvas.drawText("圆形", 260, 50, paint);
// canvas.drawText("方形", 260, 120, paint);
// canvas.drawText("长方形", 240, 170, paint);
// canvas.drawText("圆角矩形", 230, 220, paint);
// canvas.drawText("圆形", 240, 260, paint);
// canvas.drawText("三角形", 240, 325, paint);
// canvas.drawText("五角形", 240, 390, paint);
} private void paintGraph2(Canvas canvas, Paint paint)
{
// 设置渐变器后绘制
Shader shader = new LinearGradient(0, 0, 40, 60, new int[] { Color.RED, Color.GREEN,
Color.BLUE, Color.YELLOW }, null, Shader.TileMode.REPEAT);
paint.setShader(shader);
// 设置阴影
paint.setShadowLayer(45, 10, 10, Color.GRAY);
// 绘制圆形
canvas.drawCircle(200, 40, 30, paint);
// 绘制正方形
canvas.drawRect(170, 80, 230, 140, paint);
// 绘制矩形
canvas.drawRect(170, 150, 230, 190, paint);
// 绘制圆角矩形
RectF r = new RectF(170, 200, 230, 230);
canvas.drawRect(r, paint); // 绘制椭圆
RectF rel2 = new RectF(170, 240, 230, 270);
canvas.drawOval(rel2, paint); // 绘制三角形
Path path = new Path();
path.moveTo(170, 340);
path.lineTo(230, 340);
path.lineTo(200, 290);
path.close();
// 根据Path进行绘制,绘制三角形
canvas.drawPath(path, paint); // 定义一个Path对象,封闭成一个三角形
Path p1 = new Path();
p1.moveTo(186, 360);
p1.lineTo(214, 360);
p1.lineTo(230, 392);
p1.lineTo(200, 420);
p1.lineTo(170, 392);
p1.close();
// 根据Path进行绘制,绘制三角形
canvas.drawPath(p1, paint);
} private void paintGraph(Canvas canvas, Paint p)
{
// 设置填充风格后绘制
p.setStyle(Paint.Style.FILL);
p.setColor(Color.RED);
canvas.drawCircle(120, 40, 30, p);
// 绘制正方形
canvas.drawRect(90, 80, 150, 140, p);
// 绘制矩形
canvas.drawRect(90, 150, 150, 190, p);
RectF re2 = new RectF(90, 200, 150, 230);
// 绘制圆角矩形
canvas.drawRoundRect(re2, 15, 15, p); RectF rel2 = new RectF(90, 240, 150, 270);
// 绘制椭圆
canvas.drawOval(rel2, p); // 绘制三角形
Path path = new Path();
path.moveTo(90, 340);
path.lineTo(150, 340);
path.lineTo(120, 290);
path.close();
// 根据Path进行绘制,绘制三角形
canvas.drawPath(path, p); // 定义一个Path对象,封闭成一个三角形
Path p1 = new Path();
p1.moveTo(106, 360);
p1.lineTo(134, 360);
p1.lineTo(150, 390);
p1.lineTo(120, 420);
p1.lineTo(90, 392);
p1.close();
// 根据Path进行绘制,绘制三角形
canvas.drawPath(p1, p);
} private void paintFivePointStar(Canvas canvas, Paint p)
{
// 定义一个Path对象,封闭成一个五角星
Path p2 = new Path();
p2.moveTo(26, 360);
p2.lineTo(54, 360);
p2.lineTo(70, 392);
p2.lineTo(40, 420);
p2.lineTo(10, 392);
p2.close();
// 根据Path进行绘制,绘制五角形
canvas.drawPath(p2, p);
} private void paintTriangle(Canvas canvas, Paint p)
{
// 定义一个Path对象,封闭成一个三角形
Path p1 = new Path();
p1.moveTo(10, 340);
p1.lineTo(70, 340);
p1.lineTo(40, 290);
p1.close();
// 根据Path进行绘制,绘制三角形
canvas.drawPath(p1, p);
} }

注:将自定义组件拖放到布局文件,即可看到效果,如下图所示:

android学习笔记42——图形图像处理2——绘图的更多相关文章

  1. android学习笔记43——图形图像处理3——Path

    Path类 Path类可以预先在View上将N个点连成一条“路径”,然后调用Canavas的drawPath(path,paint)即可沿着路径绘制图形. android还为路径绘制提供了PathEf ...

  2. android学习笔记41——图形图像处理1

    图像图像处理 ImageView:用于显示普通静态图片: AnimationDrawable:用于开发逐帧动画: Animation:用于对普通图片使用补间动画: Bitmap.BitmapFacto ...

  3. Android学习笔记进阶18 之画图并保存图片到本地

    1.首先创建一个Bitmap图片,并指定大小:   2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可:   3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...

  4. Android学习笔记进阶18之画图并保存图片到本地

    1.首先创建一个Bitmap图片,并指定大小:   2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可:   3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...

  5. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  6. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  7. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  8. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  9. udacity android 学习笔记: lesson 4 part b

    udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

随机推荐

  1. find 和 locate 命令

    一, find 命令 find 命令有三部分构成 1,你要搜索的目录 (. 当前目录, ~家目录, /根目录). 2,你的搜索条件. 3,搜索到后要执行的动作. 常用命令: 1, find . -na ...

  2. SM30维护视图添加按钮

    转自http://blog.csdn.net/tsj19881202/article/details/7517232 遇到某需求,要求维护sm30的视图时,能加上排序按钮. 基本参考: http:// ...

  3. bootstrap部分---网格系统;(几天没写博客了,为了潜心研究一下bootstrap)

    1工作原理: (1)行必须放置在 .container class 内,以便获得适当的对齐(alignment)和内边距(padding). (2)使用行来创建列的水平组. (3)内容应该放置在列内, ...

  4. MySQL备份的shell脚本

    经过测试该脚本可以远程备份,但需要配置远程登录用户的权限,经过测试啊,在把这个脚本添加到计划任务的时候是无法识别mysql命令的(即使是将mysql添加到环境变量也无法识别,是因为/etc/cront ...

  5. POJ1419 Graph Coloring(最大独立集)(最大团)

                                                               Graph Coloring Time Limit: 1000MS   Memor ...

  6. phpwind数据同步本地之后板块排版乱

    排版紊乱的问题一般是css文件的问题 解决思路 1.打开chrome调用F12,查看是不是css文件没有获取. 2.如果没有获取到的话检查css文件的路径. 在本例中phpwind数据同步到本地之后, ...

  7. SpringMVC给外部资源加版本号避免缓存

    一.属性文件:version.properties ->内容:version=201608  二.java代码 public class configVersion implements Ser ...

  8. PS CS5

    1.图层 背景图层:双击解锁 右下按键:新建图层.删除图层.新建图层组 眼睛-图层的显示与隐藏 缩略图大小选择:右上三角-面板设置 打开那个图片然后选择工具里面的移动工具然后按住鼠标拖动,拖到那个图片 ...

  9. jQuery easyui datagrid数据绑定

    1.绑定json数据 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...

  10. Python--类定义

    转自:http://kanwoerzi.iteye.com/blog/1304466 Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可 ...