自定义View(2)canas绘制基本图形的示例
效果

代码:
void drawSample(Canvas canvas) {
/*
* 方法 说明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawPath 绘制路径
* drawLine 绘制直线 drawPoin 绘制点
*/
// 创建画笔
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
int txtSize = ;
paint.setTextSize(txtSize);
/*画点*/
paint.setStyle(Paint.Style.FILL);
canvas.drawText("画点:", , txtSize, paint);
paint.setColor(Color.RED);
float stroke = paint.getStrokeWidth();
paint.setStrokeWidth();
canvas.drawPoint(, , paint);// 画一个点
canvas.drawPoints(new float[] { , , , , , }, paint);// 画多个点
paint.setStrokeWidth(stroke);
/*画线*/
paint.setColor(Color.BLACK);
canvas.drawText("画线:", , , paint);
canvas.drawLine(, , , , paint);// 画线
canvas.drawLine(, , , , paint);// 斜线
/*画虚线*/
canvas.drawText("画虚线:", ,, paint);
paint.setStyle(Paint.Style.STROKE);
Path path3 = new Path();
path3.moveTo(, );
path3.lineTo(,);
/*DashPathEffect第一个参数必须为偶数个整数,其中偶数位上的整数表示绘制的间隔,奇数位上的整数表示不绘制的间隔。*/
PathEffect effects = new DashPathEffect(new float[]{,,,,,},);
PathEffect oldEffect = paint.getPathEffect();
paint.setPathEffect(effects);
canvas.drawPath(path3, paint);
/*画弧线*/
paint.setPathEffect(oldEffect);
canvas.drawText("画弧线:", , , paint);
RectF oval1 = new RectF(, , , ); // 弧线是画在矩形中的
canvas.drawArc(oval1, , , false, paint); // 左眼弧线 ^_^
oval1.set(, , , );
canvas.drawArc(oval1, , , false, paint); // 右眼弧线 ^_^
oval1.set(, , , );
canvas.drawArc(oval1, , , false, paint); // 嘴弧线 ^_^
/*画贝塞尔曲线*/
/* Path类封装复合(多轮廓几何图形的路径
* 由直线段*、二次曲线,和三次方曲线,也可画以油画。drawPath(路径、油漆),要么已填充的或抚摸
* (基于油漆的风格),或者可以用于剪断或画画的文本在路径。
*/
canvas.drawText("画贝塞尔曲线:", , , paint);
Path path2 = new Path();
path2.moveTo(, ); // 设置Path的起点
path2.quadTo(, , , ); // 设置贝塞尔曲线的控制点坐标和终点坐标
canvas.drawPath(path2, paint); // 画出贝塞尔曲线
/*画圆*/
canvas.drawText("画圆:", , , paint); // 画文本
canvas.drawCircle(, , , paint); // 小圆
paint.setAntiAlias(true); // 设置画笔的锯齿效果。true是去除
canvas.drawCircle(, , , paint); // 大圆
/*画扇形和椭圆*/
canvas.drawText("画扇形和椭圆:", , , paint);
/*设置渐变色 这个正方形的颜色是改变的 */
Shader mShader = new LinearGradient(, , , ,
new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW,
Color.LTGRAY }, null, Shader.TileMode.REPEAT); // 一个材质,打造出一个线性梯度沿著一条线。
paint.setShader(mShader);
// p.setColor(Color.BLUE);
// 画扇形,drawArc第一个参数是RectF:该类是第二个参数是角度的开始,第三个参数是多少度,第四个参数是真的时候画扇形,是假的时候画弧线
RectF oval2 = new RectF(, , , );// 设置个新的长方形,扫描测量
canvas.drawArc(oval2, , , true, paint);
// 画椭圆,把oval改一下
oval2.set(, ,,);
canvas.drawOval(oval2, paint);
/*画矩形*/
canvas.drawText("画矩形:", , , paint);
paint.setStyle(Paint.Style.FILL);// 设置填满
canvas.drawRect(, , , , paint);// 正方形
canvas.drawRect(, , , , paint);// 长方形
/*画圆角矩形*/
canvas.drawText("画圆角矩形:", , , paint);
paint.setStyle(Paint.Style.FILL);// 充满
paint.setColor(Color.LTGRAY);
paint.setAntiAlias(true);// 设置画笔的锯齿效果
RectF oval3 = new RectF(, , , );// 设置个新的长方形
canvas.drawRoundRect(oval3, , , paint);// 第二个参数是x半径,第三个参数是y半径
/*画三角形*/
canvas.drawText("画三角形:", , , paint);
// 绘制这个三角形,你可以绘制任意多边形
Path path = new Path();
path.moveTo(, );// 此点为多边形的起点
path.lineTo(, );
path.lineTo(, );
// path.lineTo(160, 380);
path.close(); // 使这些点构成封闭的多边形,就不用画回到起点 path.lineTo(160, 380);
canvas.drawPath(path, paint);
/*画任意多边形,*/
paint.setShader(null);
canvas.drawText("画任意多边形:", , , paint);
paint.setColor(Color.LTGRAY);
paint.setStyle(Paint.Style.STROKE);// 设置空心
Path path1 = new Path();
path1.moveTo(, );
path1.lineTo(, );
path1.lineTo(, );
path1.lineTo(, );
path1.close(); // 封闭形状
canvas.drawPath(path1, paint);
/*画图片,就是贴图*/
canvas.drawText("画图片:", , , paint);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
canvas.drawBitmap(bitmap, , , paint);
/*画文本*/
paint.setColor(Color.BLACK);
canvas.drawText("画文本:", , , paint);
paint.setTextSize(txtSize * );
paint.setStyle(Paint.Style.FILL);
FontMetrics fontMetrics = paint.getFontMetrics();
float originX = ;
float originY = ;
float topY = originY + fontMetrics.top;
float ascentY = originY + fontMetrics.ascent;
float descentY = originY + fontMetrics.descent;
float bottomY = originY + fontMetrics.bottom;
float leading = fontMetrics.leading;
//文本
paint.setColor(Color.RED);
paint.setTextAlign(Align.CENTER);
canvas.drawText("text1", originX , originY, paint);
//origin point
canvas.drawCircle(originX, originY, , paint);
paint.setTextAlign(Align.LEFT);
//baseline
paint.setColor(Color.LTGRAY);
paint.setTextSize(txtSize);
canvas.drawText("baseline", originX - , originY, paint);
canvas.drawLine(originX, originY, originX + , originY, paint);
//top line
paint.setColor(Color.GREEN);
canvas.drawText("topline", originX - , topY, paint);
canvas.drawLine(originX, topY, originX + , topY, paint);
//ascent line
paint.setColor(Color.CYAN);
canvas.drawText("ascent line", originX + , ascentY, paint);
canvas.drawLine(originX+, ascentY, originX + , ascentY, paint);
//descent line
paint.setColor(Color.YELLOW);
canvas.drawText("descent line", originX + , descentY, paint);
canvas.drawLine(originX+, descentY, originX + , descentY, paint);
//bottom line
paint.setColor(Color.BLUE);
canvas.drawText("bottom line", originX - , descentY, paint);
canvas.drawLine(originX-, bottomY, originX + , bottomY, paint);
}
注意其中画弧形时要指定一个矩形区域,画文字时各种线的位置
自定义View(2)canas绘制基本图形的示例的更多相关文章
- Android显示框架:自定义View实践之绘制篇
文章目录 一 View 二 Paint 2.1 颜色处理 2.2 文字处理 2.3 特殊处理 三 Canvas 3.1 界面绘制 3.2 范围裁切 3.3 集合变换 四 Path 4.1 添加图形 4 ...
- Android -- 自定义View小Demo,绘制钟表时间(一)
1,昨天刚看了hongyang大神推荐的自定义时钟效果(传动门:http://www.jianshu.com/users/a45d19d680af/),效果还是不错的,自己又在github上找了找,发 ...
- Android 自定义View修炼-Android实现圆形、圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)
一.概述 Android实现圆角矩形,圆形或者椭圆等图形,一般主要是个自定义View加上使用Xfermode实现的.实现圆角图片的方法其实不少,常见的就是利用Xfermode,Shader.本文直接继 ...
- Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解
上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定 ...
- Android 自定义View之自绘控件
首先要提前声明一下,我对于自定义View的理解并不是很深,最近啃了几天guolin博主写的关于自定义View的博客,讲的非常棒,只不过涉及到源码和底层的一些东西,我自己就懵逼了,目前只是会了关于自定义 ...
- 自定义View—绘制基本图形
一.Canvas能够绘制哪些图形 二.
- Android 自定义 View 绘制
在 Android 自定义View 里面,介绍了自定义的View的基本概念.同时在 Android 控件架构及View.ViewGroup的测量 里面介绍了 Android 的坐标系 View.Vie ...
- 自定义view:view的绘制流程
1.view的绘制流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw. ...
- Android UI 绘制过程浅析(五)自定义View
前言 这已经是Android UI 绘制过程浅析系列文章的第五篇了,不出意外的话也是最后一篇.再次声明一下,这一系列文章,是我在拜读了csdn大牛郭霖的博客文章<带你一步步深入了解View> ...
随机推荐
- Swift学习:闭包(Closures)
/* 闭包(Closures)* 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值.* 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas类 ...
- JAVASCRIPT、ANDROID、C#分别实现普通日期转换多少小时前、多少分钟前、多少秒
貌似最近很流行这个,就写了个js函数实现之 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ...
- SVN的405错误
错误1: 如果你没有阅读以下文字,活该你倒霉(这段文字是在googlecode添加新项目时生成的): Command-line access If you plan to make changes, ...
- setjmp和longjmp的使用
问题描述: setjmp和longjmp的使用 问题解决: setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序 ...
- apache nginx php不显示版本号
apache 不显示版本号 http.conf 中的 修改为 ServerTokens ProdServerSignature Off 有的版本没有,在最后添加即可 php php.ini 中的 修改 ...
- 【POJ】【2096】Collecting Bugs
概率DP/数学期望 kuangbin总结中的第二题 大概题意:有n个子系统,s种bug,每次找出一个bug,这个bug属于第 i 个子系统的概率为1/n,是第 j 种bug的概率是1/s,问在每个子系 ...
- Ubuntu的LTS版本
Ubuntu的LTS版本什么意思 LTS是长期支持(Long Term Support)的缩写. 我们每六个月制作一个新的Ubuntu桌面和服务器的版本,这意味着你总能拥有开源世界提供的最新最好的应用 ...
- Oracle调优总结(经典实践 重要)
转载:http://langgufu.iteye.com/blog/1974211 Problem Description:1.每个表的结构及主键索引情况2.每个表的count(*)记录是多少3.对于 ...
- POJ 3440 Coin Toss(求概率)
题目链接 题意 :把硬币往棋盘上扔,分别求出硬币占1,2,3,4个格子的时候的概率. 思路 : 求出公式输出,不过要注意输出格式,我还因为输入的时候用了int类型错了好几次..... #include ...
- hdu 4315 Climbing the Hill 博弈论
题意:有n个人爬山,山顶坐标为0,其他人按升序给出,不同的坐标只能容纳一个人(山顶不限),Alice和Bob轮流选择一个人让他移动任意步,但不能越过前面的人,且不能和前面一个人在相同的位置.现在有一个 ...