Android - Paint基础

在自定义控件时,经常需要使用canvas、paint等,在canvas类中,绘画基本都是靠drawXXX()方法来完成的,在这些方法中,很多时候都需要用到paint类型的参数,
Paint作为一个非常重要的元素,功能也是非常强大的,这里简单列举一些它的属性和对应的功能.

  • setAntiAlias() //设置画笔的锯齿效果
  • setColor() //设置画笔的颜色
  • setARGB() //设置画笔的ARGB值
  • setAlpha() //设置画笔的Alpha值
  • setTextSize() //设置字体的的大小
  • setStyle() //设置画笔的风格(实心或者是空心)
  • setStrokeWidth() //设置空心边框的宽度.
  • 正是由于画笔的功能不一样,再结合各种不同的绘图api,这样任意的组合就可以实现不同的绘图效果.
    例如:
 mPaint = new Paint();mPaint.setColor(getResources().getColor(R.color.colorAccent));mPaint.setAntiAlias(true);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(10);mPaint.setTextSize(100);
  • 1

以上就是关于Paint类的一个简单的介绍,更多的介绍可以参考Google的官方文档

2,Android - Canvas基础

具体的看代码

 canvas.drawPoint(100,100,mPaint);//绘制一条直线canvas.drawLine(150,150,150,300,mPaint);float [] pts = {300,300,300,400,300,400,400,400,400,400,400,500};//绘制多条直线canvas.drawLines(pts,mPaint);//绘制一个矩形RectF rectF = new RectF(500,100,600,300);canvas.drawRect(rectF,mPaint);//绘制圆角矩形RectF rectF2 = new RectF(700,100,900,300);canvas.drawRoundRect(rectF2,50,50,mPaint);//绘制一个圆canvas.drawCircle(600,600,100,mPaint);//绘制一个扇形RectF rectFArc = new RectF(300,800,500,1000);canvas.drawArc(rectFArc,0,270,true,mPaint);mPaint.setStyle(Paint.Style.STROKE);//绘制一个弧形RectF rectFArc2 = new RectF(300,1100,500,1300);canvas.drawArc(rectFArc2,0,270,false,mPaint);//绘制椭圆 外接矩形 也就就是该椭圆为矩形的内接椭圆RectF rectFArOval = new RectF(520,1100,720,1400);canvas.drawOval(rectFArOval,mPaint);//绘制文本canvas.drawText("hello",100,100,mPaint);Path path = new Path();path.moveTo(100,400);path.lineTo(200,500);path.lineTo(100,600);path.lineTo(50,700);canvas.drawPath(path,mPaint);
  • 1

3,简单实例,绘制一个时钟

先看图

效果就如上图所示,那这样的效果是怎么实现的呢?这就需要用到Canvas和Paint的相关知识了.

Canvas作为绘制图形的直接对象,它提供了以下几个非常有用发方法.
1. canvas.save() : 保存画布,它的作用是将之前的所有已经绘制的图像保存起来,让后续的操作就好像在一个新的图层上,操作一样.
2. canvas.restore() :可以理解和PhotosShop中的合并图层操作.它的作用是我们在save之后绘制的所有图像与save之前的图像进行合并.
3. canvas.translate():画布平移,就是将画布的坐标原点移动到你指定的位置.
4. canvas,rotate():画布翻转,.就是将坐标系翻转了一定的角度.
理解了以上几个方法,那么我们就可以开始绘制我们的时钟了,先来分析下要绘制的这个图形,.我们可以分成4个步骤.

  1. 绘制仪表盘–外面的那个大圆形
  2. 刻度线-
  3. 刻度值
  4. 指针

在这个实例中,第一步绘制表盘,这个挺简单的,只要调用canvas,drawCircle()来绘制一个圆盘就可以了,圆心位置和半径按照自己的需要来确定,
代码如下:

 mWidth = getMeasuredWidth()-100;mHeight = getMeasuredHeight()-100;//首先绘制一个大圆盘Paint paintCircle = new Paint();paintCircle.setStyle(Paint.Style.STROKE);paintCircle.setAntiAlias(true);paintCircle.setStrokeWidth(5);canvas.drawCircle(mWidth/2,mHeight/2,mWidth/2,paintCircle);
  • 1

第二部绘制刻度线和刻度值,我们可以将一个圆分成120根刻度线,每两根刻度线之间的角度为3度,我们只要每绘制好一根线后,我们就画布旋转3度,代码如下:

//绘制刻度Paint paintDegree = new Paint();paintDegree.setStrokeWidth(3);for (int i = 0 ;i<120 ;i++){//大点,12点 3点 6点 9点if (i == 0 || i == 30 || i==60 || i ==90){paintDegree.setStrokeWidth(12);paintDegree.setTextSize(60);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+80,paintDegree);String degree = String.valueOf(i/10);if (i == 0){degree = "12";}canvas.drawText(degree,mWidth/2-paintDegree.measureText(degree)/2,mHeight/2-mWidth/2+150,paintDegree);}else if (i % 10 == 0){整点paintDegree.setStrokeWidth(9);paintDegree.setTextSize(60);String degree = String.valueOf(i/10);canvas.drawText(degree,mWidth/2-paintDegree.measureText(degree)/2,mHeight/2-mWidth/2+140,paintDegree);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+60,paintDegree);}else if (i % 5 == 0){paintDegree.setStrokeWidth(6);paintDegree.setTextSize(20);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+40,paintDegree);}else{paintDegree.setStrokeWidth(3);paintDegree.setTextSize(20);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+20,paintDegree);}//每次绘制完成后将画布旋转3度canvas.rotate(3, mWidth / 2, mHeight / 2);}
  • 1

最后在绘制指针:

 //保存表盘和刻度的画布canvas.save();//绘制指针Paint paintPoint = new Paint();Paint paintHouse = new Paint();paintHouse.setStrokeWidth(15);Paint paintMinute = new Paint();paintMinute.setStrokeWidth(10);Paint paintSecond = new Paint();paintSecond.setStrokeWidth(8);//将画布的起点坐标移动到圆心位置canvas.translate(mWidth/2,mHeight/2);canvas.drawCircle(0,0,15,paintPoint);canvas.drawLine(0,0,0,-100,paintHouse);canvas.drawLine(0,0,0,180,paintMinute);canvas.drawLine(0,0,100,250,paintSecond);//合并图层canvas.restore();
  • 1

全部的代码如下:

package com.example.administrator.myscrollview.view;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;/*** Created by Administrator on 2016/9/29.*/
public class ClockView extends View {private int mWidth,mHeight;public ClockView(Context context) {this(context,null);}public ClockView(Context context, AttributeSet attrs) {this(context, attrs,-1);}public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.translate(50,0);mWidth = getMeasuredWidth()-100;mHeight = getMeasuredHeight()-100;//首先绘制一个大圆盘Paint paintCircle = new Paint();paintCircle.setStyle(Paint.Style.STROKE);paintCircle.setAntiAlias(true);paintCircle.setStrokeWidth(5);canvas.drawCircle(mWidth/2,mHeight/2,mWidth/2,paintCircle);//绘制刻度Paint paintDegree = new Paint();paintDegree.setStrokeWidth(3);for (int i = 0 ;i<120 ;i++){//大点,12点 3点 6点 9点if (i == 0 || i == 30 || i==60 || i ==90){paintDegree.setStrokeWidth(12);paintDegree.setTextSize(60);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+80,paintDegree);String degree = String.valueOf(i/10);if (i == 0){degree = "12";}canvas.drawText(degree,mWidth/2-paintDegree.measureText(degree)/2,mHeight/2-mWidth/2+150,paintDegree);}else if (i % 10 == 0){整点paintDegree.setStrokeWidth(9);paintDegree.setTextSize(60);String degree = String.valueOf(i/10);canvas.drawText(degree,mWidth/2-paintDegree.measureText(degree)/2,mHeight/2-mWidth/2+140,paintDegree);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+60,paintDegree);}else if (i % 5 == 0){paintDegree.setStrokeWidth(6);paintDegree.setTextSize(20);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+40,paintDegree);}else{paintDegree.setStrokeWidth(3);paintDegree.setTextSize(20);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+20,paintDegree);}//每次绘制完成后将画布旋转3度canvas.rotate(3, mWidth / 2, mHeight / 2);}//保存表盘和刻度的画布canvas.save();//绘制指针Paint paintPoint = new Paint();Paint paintHouse = new Paint();paintHouse.setStrokeWidth(15);Paint paintMinute = new Paint();paintMinute.setStrokeWidth(10);Paint paintSecond = new Paint();paintSecond.setStrokeWidth(8);//将画布的起点坐标移动到圆心位置canvas.translate(mWidth/2,mHeight/2);canvas.drawCircle(0,0,15,paintPoint);canvas.drawLine(0,0,0,-100,paintHouse);canvas.drawLine(0,0,0,180,paintMinute);canvas.drawLine(0,0,100,250,paintSecond);//合并图层canvas.restore();}
}
  • 1

效果

Android 自定义控件-Canvas和Paint绘图详解-手把手带你绘制一个时钟.相关推荐

  1. android标尺自定义view,android尺子的自定义view——RulerView详解

    项目中用到自定义尺子的样式: 原效果为 因为跟自己要使用的view稍有不同 所以做了一些修改,修改的注释都放在代码中了,特此记录一下. 首先是一个自定义View: public class RuleV ...

  2. Python Turtle 海龟绘图详解官方文档中文版

    Python Turtle 海龟绘图详解 (官方文档中文版)-安徽省太湖中学陈晓中整理 概述 海龟绘图很适合用来引导孩子学习编程. 最初来自于 Wally Feurzeig, Seymour Pape ...

  3. 【5年Android从零复盘系列之二十】Android自定义View(15):Matrix详解(图文)【转载】

    [转载]本文转载自麻花儿wt 的文章<android matrix 最全方法详解与进阶(完整篇)> [5年Android从零复盘系列之二十]Android自定义View(15):Matri ...

  4. Android 4.1-Jelly Bean新特性详解

    Android 4.1Jelly Bean新特性详解 发布会已经结束,Android新一代的4.1版本,代号Jelly Bean(果冻豆)的新系统已经正式问世,除了新架构.全新通知栏和搜索功能之外,实 ...

  5. python turtle循环图案-Python内置模块turtle绘图详解

    urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的 ...

  6. android idata 模式,Android快速开发之appBase——(3).详解IHolder和IData

    Android快速开发之appBase--(3).详解IHolder和IData IHolder和IData是AVLib的两个组件,在前面已经使用过了,那么这一篇将会详细说明这两个组件的用法. IHo ...

  7. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  8. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  9. Android vector标签 PathData 画图超详解

    此文章来源于https://www.cnblogs.com/yuhanghzsd/p/5466846.html点击打开链接 Android vector标签 PathData 画图超详解 SVG是一种 ...

最新文章

  1. Oracle 环境下 GoldenGate 集成抽取(Integrated Capture)模式与传统抽取模式(Classic Capture)间的切换...
  2. 成功解决pandas.core.indexing.IndexingError: Too many indexers
  3. mysql截取栏目字符_substring从指定字符串开始截取(图)
  4. yunyang tensorflow-yolov3 Intel Realsense D435 (并发)使用locals()函数批量配置摄像头运行识别程序并画框(代码记录)(代码示例)
  5. 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
  6. Bugku杂项-convert
  7. 乐高科技系列搭建指南 pdf_近30年十辆乐高科技系列摩托车回顾_积木
  8. php找不同的数组元素,PHP实现查询两个数组中不同元素的方法
  9. c++ 读取hdmi输入信号_小白需要知道HDMI知识
  10. 【BZOJ4818】序列计数(动态规划,生成函数)
  11. 【交通标志识别】基于matlab GUI模板匹配交通标志识别【含Matlab源码 1059期】
  12. redis雪崩、击穿、穿透
  13. 尝试破解使用网络验证的小软件
  14. 0712-插曲-对拍
  15. 如何开始创业(催生全美最大孵化器YC的文章)
  16. SecureCRT远程连接虚拟机
  17. 数学笔记27——极坐标下的面积
  18. 解决word转PDF文件时图片位置改变和字体格式改变的问题
  19. xpath爬取当当网
  20. 语法分析器---预测分析程序

热门文章

  1. rust队友开挂_腐蚀怎么判断开挂玩家?开挂玩家识别方法一览
  2. matlab怎么算均方位移,用MATLAB计算均方位移(msd)
  3. 2019最新ElasticSearch6.5.4mapping理解
  4. 微服务时代--service meshAGW
  5. 小眼睛适合大框还是小框眼镜_【图】小眼睛适合什么眼镜框呢 你选对了吗_小眼睛_伊秀美容网|yxlady.com...
  6. Delphi修改word页面方向
  7. 制造业项目管理软件如何帮助企业做好项目管理?
  8. 判断APP用户手机是否开启了定位服务
  9. 程序设计基石与实践之C语言指针和数组基础
  10. 零和博弈下的逆增强学习