看了非常多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就是图形混合模式的意思,其概念最早来自于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基础使用的更多相关文章

  1. 自定义控件学习之canvas和paint相关知识点学习

    1,继承自view,实现ondraw方法: 初始化画笔,TextPaint paint,并设置画笔属性: paint.setFlags(Paint.ANTI_ALIAS_FLAG):画笔抗锯齿. pa ...

  2. 【Android】21.2 2D图形图像处理(Canvas和Paint)

    分类:C#.Android.VS2015: 创建日期:2016-03-19 一.Canvas对象简介 画布(Canvas对象)是与System.Drawing或iOS核心图形等传统框架非常类似的另一种 ...

  3. android Canvas 和 Paint用法

    自定义view里面的onDraw方法,在这里我们可以绘制各种图形,onDraw里面有两个API我们需要了解清楚他们的用法:Canvas 和 Paint. Canvas翻译成中文就是画布的意思,Canv ...

  4. android通过Canvas和Paint截取无锯齿圆形图片

    一个通过Canvas和Paint截取无锯齿圆形图片. /** * 根据原图和变长绘制圆形图片 * * @param source * @param min * @return */ public st ...

  5. Android使用学习之画图(Canvas,Paint)与手势感应及其应用(乒乓球小游戏)

    作为一个没有学习Android的菜鸟,近期一直在工作之外努力地学习的Android的使用. 这周看了下Android的画图.主要是Canvas,Paint等,感觉须要实践下.下午正好有空,就想整一个乒 ...

  6. 使用Canvas和Paint自己绘制折线图

    主要用于Canvas一个特别简单的小demo. 能够手动点击看每一个月份的数据.很easy.就是用paint在canvas上画出来的. 主要内容就是计算左边价格的位置,以下日期的位置,三根虚线的位置, ...

  7. 安卓自定义控件(一)Canvas、Paint、Shader、Xfermode

    关于自定义控件,之前就写过一篇自定义控件,上图下字的Button,图片任意指定大小,但是使用效果还是让人感觉不幸福,这次索性彻彻底底地对自定义控件做一次彻彻底底的总结. 我会花4篇博客来介绍自定义控件 ...

  8. Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解

    上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定 ...

  9. Android为TV端助力 Canvas 和 Paint用法

    自定义view里面的onDraw方法,在这里我们可以绘制各种图形,onDraw里面有两个API我们需要了解清楚他们的用法:Canvas 和 Paint. Canvas翻译成中文就是画布的意思,Canv ...

随机推荐

  1. swift语言点评十一-Methods

    Assigning to self Within a Mutating Method Mutating methods can assign an entirely new instance to t ...

  2. [AHOI2013]作业 莫队 树状数组

    #include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...

  3. bzoj2333 [SCOI2011]棘手的操作(洛谷3273)

    题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作:U x y: 加一条边,连接第x个节点和第y个节点A1 x v: 将第x个节点的权 ...

  4. SP687 REPEATS - Repeats(后缀数组)

    一个初步的想法是我们枚举重复子串的长度\(L\).然后跑一遍SA.然后我们枚举一个点\(i\),令他的对应点为\(i+L\),然后求出这两个点的LCP和LCS的长度答案就是这个点的答案就是\((len ...

  5. 如何绑定host

    绑定host一般分为windows和linux下两种情况. windows下,首先打开host文件,其操作步骤 ,打开 C:\Windows\System32\Drivers\etc\hosts的文件 ...

  6. c进程学习日志

    #include<unistd.h> #include<sys/types.h> #include<pwd.h> #include<stdio.h> i ...

  7. salt 安装kubernetes集群3节点

    [root@linux-node1 k8s]# tree .├── etcd.sls├── files│   ├── cfssl-1.2│   │   ├── cfssl-certinfo_linux ...

  8. rdesktop 脚本

    [root@Eren liwm]# cat rdesktop.sh #!/bin/bash -rdesktop -u user  192.168.122.10 -r sound:local -g 10 ...

  9. Centos7 安装 opencv

      Centos7 安装 opencv CentOS Linux release 7.2.1511 (Core)   1.安装依赖     yum install https://dl.fedorap ...

  10. Java 二进制,八进制,十进制,十六进制转换

    A.十进制转换其他 十进制转成二进制  Integer.toBinaryString(int i) 十进制转成八进制  Integer.toOctalString(int i) 十进制转成十六进制:  ...