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 ...
随机推荐
- 解决SimpleCursorAdapter不能自动更新的问题
假设场景是这样的:你使用SimpleCursorAdapter显示数据,并监听数据的变化:在数据发生变化的时候,调用cursor的requery,期待UI显示也跟着变化. 但是,你可能会发现,UI并没 ...
- 解决f.lux总是弹框定位
解决f.lux总是弹框定位,直接导入成功定位的注册表文件即可. 以下保存为f.lux.reg 双击导入即可. Windows Registry Editor Version 5.00 [HKEY_CU ...
- 使用Dnsmasq搭建本地dns服务器上网
导读 搭建一个属于自己的本地DNS服务器很有必要,利用Dnsmasq来搭建一个属于自己的本地DNS服务器,享受更干净无污染.更智能快速和没有广告干扰的DNS解析服务. 一.Dnsmasq安装 安装并启 ...
- JavaScript 编写多线程代码引用Concurrent.Thread.js(转)
这是一个很简单的功能实现: <script type="text/javascript" src="Concurrent.Thread.js">&l ...
- No 11.11 in my dictionary
今年雙十一又被坑了.被京东坑大發了,正在努力維權中. 買了大大小小將近3wCNY的商品中唯有一件,我十分滿意 羅技的G105遊戲鍵盤,雖然我不是拿來玩遊戲的. 中國人在對比國內外產品時總有1萬個理由好 ...
- ES6 — 字符串String
ES6对字符串新增了一些函数和操作规范.下面我们来看ES6中对字符串新加的特性. 1.模版字符串 (即用反引号定义的字符串) 传统的字符串拼接通过我们使用'+'号与变量连接.例如: let name= ...
- Oozie的安装过程
依赖CDH5,JDK和关系数据库 集群规划 主机名 IP Ooize节点 CHD1 XX.XX.XX.XX oozie server,oozie ...
- click 绑定(一)无参数的click 事件绑定
目的 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 例子 <d ...
- PPT图片快速编辑技巧
修改*.ppt或*.pptx的后缀名为zip 例如:demo.pptx修改为demo.zip 修改为, 使用压缩软件打开此压缩包, 一般图片资源都会存放在ppt/media下 找到你所要修改的图片,然 ...
- Android sdk 镜像服务器资源
大连东软信息学院镜像服务器地址:- http://mirrors.neusoft.edu.cn 端口:80北京化工大学镜像服务器地址:- IPv4: http://ubuntu.buct.edu.cn ...