绘图

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. Educational Codeforces Round 15 C 二分

    C. Cellular Network time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  2. CSS 阴影怎么写?

    只有CSS3才zh支持阴影效果,ke可以用如下写法:.shadow {-webkit-box-shadow:1px 1px 3px #292929;-moz-box-shadow:1px 1px 3p ...

  3. 选数 2002年NOIP全国联赛普及组

    题目描述 Description 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整 ...

  4. 2016 Sichuan Province Programming Contest

    2016 Sichuan Province Programming Contest 代码 2016 Sichuan Province Programming Contest A. Nearest Ne ...

  5. Python文件格式化写入

    [root@localhost test]# cat 1.py fd = open('format.txt','w') head = "%10s%10s%10s\n"%('id', ...

  6. poj1270 拓扑序(DFS)

    题意:给出将会出现的多个字母,并紧接着给出一部分字母的大小关系,要求按照字典序从小到大输出所有符合上述关系的排列. 拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字 ...

  7. apache日志切割

    一.日志切割 安装cronolog CentOS 5.4中编译安装Apache默认日志是不切割的,需要用用工具Cronnolog进行日志切割 1.下载及安装 wget http://cronolog. ...

  8. struts2标签整理

    在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题,   一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文件:   Java代码   ...

  9. 生成n个数的全排列【递归、回溯】

    下面讨论的是n个互不相同的数形成的不同排列的个数.毕竟,假如n个数当中有相同的数,那n!种排列当中肯定会有一些排列是重复的,这样就是一个不一样的问题了. /*===================== ...

  10. OpenJudge计算概论-计算三角形面积【海伦公式】

    /*============================================== 计算三角形面积 总时间限制: 1000ms 内存限制: 65536kB 描述 平面上有一个三角形,它的 ...