Canvas与Paint的0基础使用
看了非常多android自己定义方面的资料,了解了非常多原理,遇到人家自己定义的东西也可以看得懂,可是。当自己去自己定义的时候。发现脑袋一片空白,所以就先从认识Canvas和Paint開始吧!
Canvas 类
主要是实现了屏幕的绘制过程,是自己定义View的时候不可少的一个步骤,当中包括了非常多有用的方法,不如绘制一条路径、区域、画点、画线、渲染文本。以下就是一下canvas的经常用法介绍。
void drawRect(RectF rect,Paint paint) //绘制区域,參数为一个RectF一个区域
void drawPath(Path path,Paint paint)// 绘制一个路径,參数为一个Path路径对象
void drawBitmap(Bitmap bitmap,Rect src,Rect dst,Paint paint)//贴图。參数一就是常规的Bitmap对象,參数二是原区域,參数三是目标区域。參数四是自己定义的paint对象。这个地方设计到了图像学的一些知识,就是原区域跟目标区域混合的情况。涉及到PorterDuffXfermode 这个类。该类含有一个构造方法
PorterDuffXfermode(PorterDuff.Mode mode)虽说构造方法的签名列表里仅仅有一个PorterDuff.Mode的參数,可是它能够实现非常多酷毙的图形效果!
PorterDuffXfermode(PorterDuff.Mode mode)虽说构造方法的签名列表里仅仅有一个PorterDuff.Mode的參数,可是它能够实现非常多酷毙的图形效果!
!
而PorterDuffXfermode就是图形混合模式的意思,其概念最早来自于SIGGRAPH的Tomas Proter和Tom Duff,混合图形的概念极大地推动了图形图像学的发展。延伸到计算机图形图像学像Adobe和AutoDesk公司著名的多款设计软件都能够说一定程度上受到影响。而我们PorterDuffXfermode的名字也来源于这俩人的人名组合PorterDuff。那PorterDuffXfermode能做些什么呢?我们先来看一张API DEMO里的图片:
这张图片从一定程度上形象地说明了图形混合的作用,两个图形一圆一方通过一定的计算产生不同的组合效果。
例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) //画线,參数一起始点的x轴位置,參数二起始点的y轴位置,參数三终点的x轴水平位置。參数四y轴垂直位置。最后一个參数为Paint画刷对象。
void drawPoint(float x, float y, Paint paint) //画点,參数一水平x轴,參数二垂直y轴,第三个參数为Paint对象。
void drawText(String text, float x, float y, Paint paint) //渲染文本。Canvas类除了上面的还能够描绘文字,參数一是String类型的文本,參数二x轴,參数三y轴。參数四是Paint对象。
void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) //在路径上绘制文本,相对于上面第二个參数是Path路径对象
从上面来看我们能够看出Canvas绘制类比較简单同一时候非常灵活,实现一般的方法通常没有问题,同一时候能够叠加的处理设计出一些效果,只是细心的网友可能发现最后一个參数均为Paint对象。假设我们把Canvas当做绘画师来看。那么Paint就是我们绘画的工具。比方画笔、画刷、颜料等等。
Paint类
void setARGB(int a, int r, int g, int b) 设置Paint对象颜色,參数一为alpha透明通道
void setAlpha(int a) 设置alpha不透明度,范围为0~255
void setAntiAlias(boolean aa) //是否抗锯齿
void setColor(int color) //设置颜色,这里Android内部定义的有Color类包括了一些常见颜色定义
void setFakeBoldText(boolean fakeBoldText) //设置伪粗体文本
void setLinearText(boolean linearText) //设置线性文本
PathEffect setPathEffect(PathEffect effect) //设置路径效果
Rasterizer setRasterizer(Rasterizer rasterizer) //设置光栅化
Shader setShader(Shader shader) //设置阴影
void setTextAlign(Paint.Align align) //设置文本对齐
void setTextScaleX(float scaleX) //设置文本缩放倍数,1.0f为原始
void setTextSize(float textSize) //设置字体大小
Typeface setTypeface(Typeface typeface) //设置字体。Typeface包括了字体的类型。粗细,还有倾斜、颜色等。
void setUnderlineText(boolean underlineText) //设置下划线
主要的知识点介绍完毕了,我们须要把两者结合起来用一下
package com.example.shise; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager; public class LineView extends View{ Paint mPaint,mPaint2; Path mPath;
int right,right2;
int width;
public LineView(Context context) {
super(context); init();
}
public LineView(Context context,AttributeSet attrs) {
super(context,attrs); // TODO Auto-generated constructor stub
init();
}
public void init(){
mPaint=new Paint();
mPaint2=new Paint();
mPath=new Path(); mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(2);
mPaint.setColor(Color.GREEN);
mPaint2.setAntiAlias(true);
mPaint2.setStrokeWidth(2);
mPaint2.setColor(Color.GREEN); WindowManager wm = (WindowManager) getContext()
.getSystemService(Context.WINDOW_SERVICE); width = wm.getDefaultDisplay().getWidth(); right=width/2+10;
right2=width/2-10;
} @Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.save();
Rect r=new Rect(width/2,20,right,30);
Rect r2=new Rect(right2,20,width/2,30); canvas.drawRect(r, mPaint);
canvas.restore();
canvas.drawRect(r2, mPaint2);
if(right<width){ right=(int) (right*1.2);
right2=(int) (right2-(right*1.2-right));
invalidate(); }
} }
上述代码通过invalidate的不断重绘View实现两条直线向两边发散的动画效果。
Canvas与Paint的0基础使用的更多相关文章
- 自定义控件学习之canvas和paint相关知识点学习
1,继承自view,实现ondraw方法: 初始化画笔,TextPaint paint,并设置画笔属性: paint.setFlags(Paint.ANTI_ALIAS_FLAG):画笔抗锯齿. pa ...
- 【Android】21.2 2D图形图像处理(Canvas和Paint)
分类:C#.Android.VS2015: 创建日期:2016-03-19 一.Canvas对象简介 画布(Canvas对象)是与System.Drawing或iOS核心图形等传统框架非常类似的另一种 ...
- android Canvas 和 Paint用法
自定义view里面的onDraw方法,在这里我们可以绘制各种图形,onDraw里面有两个API我们需要了解清楚他们的用法:Canvas 和 Paint. Canvas翻译成中文就是画布的意思,Canv ...
- android通过Canvas和Paint截取无锯齿圆形图片
一个通过Canvas和Paint截取无锯齿圆形图片. /** * 根据原图和变长绘制圆形图片 * * @param source * @param min * @return */ public st ...
- Android使用学习之画图(Canvas,Paint)与手势感应及其应用(乒乓球小游戏)
作为一个没有学习Android的菜鸟,近期一直在工作之外努力地学习的Android的使用. 这周看了下Android的画图.主要是Canvas,Paint等,感觉须要实践下.下午正好有空,就想整一个乒 ...
- 使用Canvas和Paint自己绘制折线图
主要用于Canvas一个特别简单的小demo. 能够手动点击看每一个月份的数据.很easy.就是用paint在canvas上画出来的. 主要内容就是计算左边价格的位置,以下日期的位置,三根虚线的位置, ...
- 安卓自定义控件(一)Canvas、Paint、Shader、Xfermode
关于自定义控件,之前就写过一篇自定义控件,上图下字的Button,图片任意指定大小,但是使用效果还是让人感觉不幸福,这次索性彻彻底底地对自定义控件做一次彻彻底底的总结. 我会花4篇博客来介绍自定义控件 ...
- Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解
上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定 ...
- Android为TV端助力 Canvas 和 Paint用法
自定义view里面的onDraw方法,在这里我们可以绘制各种图形,onDraw里面有两个API我们需要了解清楚他们的用法:Canvas 和 Paint. Canvas翻译成中文就是画布的意思,Canv ...
随机推荐
- swift语言点评十二-Subscripts
Classes, structures, and enumerations can define subscripts, which are shortcuts for accessing the m ...
- pthread_cleanup_push
#define pthread_cleanup_push(func, val) \ { \ struct __darwin_pthread_handler_rec __handler; \ pthre ...
- 优动漫PAINT-简单的树、叶教学
如题,简单.好用:其实说的还是一个观察的事.看你是否足够细心,对于树叶的生长.枝桠和树干的关系是否了解咯. 对于这样的树枝丫和叶子完全可以使用优动漫PAINT完成,简单又快捷,软件下载:www.don ...
- [CTSC1999]家园 分层图网络流_并查集
Code: #include<cstdio> #include<vector> #include<algorithm> #include<queue> ...
- 服务器搭建域控与SQL Server的AlwaysOn环境过程(一) 搭建域控服务器
0 准备阶段 1. Windows Server 服务器 3台(其中域控服务器配置可降低一个水准,目前博主试用的是:域控服务器--2核4G 数据库服务器(节点)--4核8G ) 2. SQL Serv ...
- (四)React高级内容
1. React developertools安装及使用 2. PropTypes与DefaultProps 讲一下PropTypes, 先拿TodoItem来说: 从几种类型中选: 3 props ...
- STM32是如何进入中断服务函数xxx_IRQHandler的
今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口. 以串口中断服务函数void USART1_IRQ ...
- 【codeforces 29B】Traffic Lights
[题目链接]:http://codeforces.com/problemset/problem/29/B [题意] 一辆车; 让从A开到B; 然后速度是v; (只有在信号灯前面才能停下来..否则其他时 ...
- SpringBoot项目maven 打包时跳过测试
在打包spring boot项目时,如果测试用例特别多,打包时间会增加: 而且测试用例有时忘记了做相应修改,在打包时则会报错而终止打包,就很烦. 所以这时会想在打包时跳过测试,大致有2种方法: 方法一 ...
- 北京联通光猫WO-36(HG220GS-U)改为桥接模式
家里弄了个极路由,想在公司里去操作路由器,交换文件.提前下载电影什么的,因此需要光猫改为桥接模式,让路由器拨号 由于WO-36(HG220GS-U)这个型号的光猫固件升级后(我的是3.x)不能用工程账 ...