android学习笔记42——图形图像处理2——绘图
绘图

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——绘图的更多相关文章
- android学习笔记43——图形图像处理3——Path
Path类 Path类可以预先在View上将N个点连成一条“路径”,然后调用Canavas的drawPath(path,paint)即可沿着路径绘制图形. android还为路径绘制提供了PathEf ...
- android学习笔记41——图形图像处理1
图像图像处理 ImageView:用于显示普通静态图片: AnimationDrawable:用于开发逐帧动画: Animation:用于对普通图片使用补间动画: Bitmap.BitmapFacto ...
- Android学习笔记进阶18 之画图并保存图片到本地
1.首先创建一个Bitmap图片,并指定大小: 2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可: 3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...
- Android学习笔记进阶18之画图并保存图片到本地
1.首先创建一个Bitmap图片,并指定大小: 2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可: 3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- Android学习笔记进阶之在图片上涂鸦(能清屏)
Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
- udacity android 学习笔记: lesson 4 part b
udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...
随机推荐
- android布局中的divider(目前只知道TableLayout)
目前在genymotion中设置了之后显示不出来行与行之间的分割线,但是在真机上面是没有问题的 1.使用xml属性添加(3.0以上版本) 设置LinearLayout标签的 android:showD ...
- Codeforces Round #303 (Div. 2) D 贪心
D. Queue time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- HDU 1231 最大连续子序列 --- 入门DP
HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...
- 英语语法最终珍藏版笔记-17名词性-主语-宾语-同位语-表语-that从句
名词性从句 在主从复合句中,从句可以充当主句的主语.表语.宾语或同位语.由于在多数情况下,主语.表语.宾语或同位语这四种句子成分由名词性词类充当,所以,我们把这些作用相当于名词的从句统称为名词性从句, ...
- [POI 2008]Mafia
这题目写了我好长时间,但还是几乎(不要在意细节)一遍 A 了喵~ 据说有代码奇短的,Orz 思路巧妙的大爷 想我这种 Brute Force 写写的傻 X 真是代码量飞起来了耶,喵~ 如果把每个人看成 ...
- 论文笔记之:From Facial Parts Responses to Face Detection: A Deep Learning Approach
From Facial Parts Responses to Face Detection: A Deep Learning Approach ICCV 2015 从以上两张图就可以感受到本文所提方法 ...
- JS之变量的运算
js变量的特点: 1.区分大小写,这是与html及css最大的不同: 2.弱变量.通过var进行定义,无明确的数据类型. 第一部分 字符型 对于字符型的数据,常用的操作为字符的转换.字符的操作 1.字 ...
- ABBYY FineReader的快速任务功能如何用
在使用ABBYY FineReader Pro for Mac OCR文字识别软件处理文档时,经常会执行一系列相同的步骤,如扫描.识别.将已识别文本导出为特定格式或导出至特定应用程序.针对经常执行的任 ...
- SQL Server 系统表简介
SQL Server 系统表简介 系统目录是由描述SQL Server 系统的数据库.基表.视图和索引等对象的结构的系统表组成.SQL Server 经常访问系统目录,检索系统正常运行所需的必要信息. ...
- *.bz2和*.gz分别是什么压缩格式
这两个都是linux常用的压缩格式,通常用来压缩源代码包,因为源代码文件过多,它们还经常跟tar命令结合使用所以一般下载linux的源代码就有.tar.bz2,.tar.gz这样的格式其中bz2格式的 ...