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 ...
随机推荐
- ActiveMQ学习笔记(22)----ActiveMQ的优化和使用建议
1. 什么时候使用ActiveMQ 1. 异步通信 2. 一对多通信 3. 做个系统的集成,同构,异构 4. 作为RPC的替代 5. 多个应用相互解耦 6. 作为事件驱动架构的幕后支撑 7. 为了提高 ...
- ZBrush实用插件ZAppLink简介
ZAppLink是ZBrush版本推出时被评为最值得期待的插件.事实证明,ZAppLink的出现让工具与工具之间有了交流,搭起软件与软件的沟通桥梁. ZAppLink插件专用于扩展ZBrush®的绘制 ...
- 不实例化一个 class 的时候使用它的property
class A: @property def name(self): " print(A.name) # <property object at 0x10d54cf98> cla ...
- windows下命令行复制
在CMD命令提示符窗口中点击鼠标右键,选择“标记”选项,然后按住鼠标左键不动,拖动鼠标标记想要复制的内容.标记完成以后请按键盘上的“回车”键
- 经典C语言编程注意点
C/C++程序员应聘试题剖析 分中的2分.读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次.此外,还有一些面试题考查面试者敏捷的思维能力. 分析这些面试题,本身包含很 ...
- CentOS 7.2 (mini) 里iptables防火墙怎么关闭?
centos从7开始默认用的是firewalld,这个是基于iptables的,虽然有iptables的核心,但是iptables的服务是没安装的.所以你只要停止firewalld服务即可:sudo ...
- 死锁的Dump文件
死锁的Dump文件 package com.stono.thread; public class DeadLockDemo { private static String A = "A&qu ...
- drupal7 怎样将一个date字段加入上日期插件效果
//这里以created字段为样例 function Hook_form_alter($form,$form_state,$form_id){ $form['created']['#type'] = ...
- 足球大数据:致足球怀疑论者-The Counter(s)-Reformation反教条改革
足球大数据:致足球怀疑论者-The Counter(s)-Reformation反教条改革 注:本序列文章都是本人对<The Numbers Game>书(豆瓣链接http://book. ...
- 【RQNOJ】460 诺诺的队列
[题目大意] 求全部数对(i,j)满足随意a[k]<=a[i]且a[k]<=a[j]. 形象地说,就是有一群人站成一列.每一个人有一定的身高,然后问有多少对人能够互相看得到. 把数对(i, ...