绘图

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. JavaScript 阶段总结

  2. mysql样例数据库employees

    Oracle和sqlserver都有基于员工信息的样例数据库,同样mysql上也是有的. 给出一个连接地址https://github.com/datacharmer/test_db. 下载后直接调用 ...

  3. man page的介绍

    假设你知道一个命令名,但不知其使用方法,此时可以求助于在线求助系统,即使用man(manual)命令,如man date. 上图为执行man date语句后的结果.<翻页查看时可按空格键,退出m ...

  4. yii2数据修改|联查

    model 层   联查 $con = Yii::$app->db; $re = $con->createCommand("select * from ads LEFT JOIN ...

  5. tyvj 1056 能量项链 区间dp (很神)

    P1056 能量项链 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第一道 描述     在Mars星球上,每个Mars人都随身佩 ...

  6. this指针基础介绍

    =================this指针的由来==================== 一个学生可以有多本书一样,而这些书都是属于这个同学的:同理,如果有很多个同学在一起,那么为了确定他们的书不 ...

  7. 设置只为View加一条边框,子视图大小超出父视图大小,边框在子视图下边显示

    #import "ViewController.h" @interface ViewController () @property (strong,nonatomic) UIVie ...

  8. PCL可视化显示 直接加载显示pcb文件

    简单可视化类,是指直接在程序中使用,而且不支持多线程. #include<iostream> #include<pcl\point_cloud.h> #include<p ...

  9. CDH hive的安装

    tar zxvf 解压包 配置环境变量 export HIVE_HOME=/usr/local/soft/hiveexport PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HO ...

  10. C#的157个建议--读书笔记(一)

    操作符的重载 ----实现类对象可以像值类型那样进行操作符的操作 实现比较器(IComparable)---实现对象的排序方式 协变:让返回值类型返回比声明的类型派生程度更大的类型:协变支持的两种方式 ...