新建项目,新建DashBoardView继承自View实现OnGlobalLayoutListener接口,并重写OnDraw方法。

使用OnGlobalLayoutListener接口须要重写onGlobalLayout方法。在这种方法中我们将获取View的宽高。

新建例如以下变量:

private Context mContext;
private Paint mCirclePaint,mDegreePaint,mHourPaint,mMinPaint;
private int mViewWidth,mViewHeight;

初始化这些变量:

public void init(Context context){
mContext = context;
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mDegreePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mHourPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mMinPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setAntiAlias(true);
mCirclePaint.setStrokeWidth(5);
mCirclePaint.setStyle(Paint.Style.STROKE);
mHourPaint.setStrokeWidth(20);
mMinPaint.setStrokeWidth(10);
getViewTreeObserver().addOnGlobalLayoutListener(this);
}

onGlobalLayout中初始化DashBoardView宽高:

@Override
public void onGlobalLayout() {
mViewHeight = getHeight();
mViewWidth = getWidth();
}

在onDraw方法中加入例如以下绘制代码:

/*
* 画表盘圆形
* */
canvas.drawCircle(mViewWidth/2,mViewHeight/2,mViewWidth/2,mCirclePaint);
/*
* 画刻度
* */
for (int i=0;i<24;i++){
if(i==0 || i==6 || i==12 || i==18){
/*
* 画整点刻度
* */
mDegreePaint.setStrokeWidth(5);
mDegreePaint.setTextSize(30);
canvas.drawLine(mViewWidth/2,mViewHeight/2-mViewWidth/2,mViewWidth/2,mViewHeight/2-mViewWidth/2+60,mDegreePaint);
String degree = String.valueOf(i);
canvas.drawText(degree,mViewWidth/2-mDegreePaint.measureText(degree)/2,mViewHeight/2-mViewWidth/2+90,mDegreePaint);
}else{
mDegreePaint.setStrokeWidth(3);
mDegreePaint.setTextSize(15);
canvas.drawLine(mViewWidth/2,mViewHeight/2-mViewWidth/2,mViewWidth/2,mViewHeight/2-mViewWidth/2+30,mDegreePaint);
String degree = String.valueOf(i);
canvas.drawText(degree,mViewWidth/2-mDegreePaint.measureText(degree)/2,mViewHeight/2-mViewWidth/2+90,mDegreePaint);
}
/*
* 通过旋转画布来画好全部的刻度
* */
canvas.rotate(15,mViewWidth/2,mViewHeight/2);
}
/*
* 画指针
* */
mHourPaint.setStrokeWidth(20);
mMinPaint.setStrokeWidth(10);
canvas.save();
canvas.translate(mViewWidth/2,mViewHeight/2);
canvas.drawLine(0,0,100,100,mHourPaint);
canvas.drawLine(0,0,100,200,mMinPaint);
canvas.restore();

至此我们就完毕了一个仪表盘的绘制。效果图例如以下:

完整代码下载:完整项目

Android自己定义View之仪表盘的更多相关文章

  1. Android 自己定义View (二) 进阶

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125 继续自己定义View之旅.前面已经介绍过一个自己定义View的基础 ...

  2. Android 自己定义View须要重写ondraw()等方法

    Android  自己定义View须要重写ondraw()等方法.这篇博客给大家说说自己定义View的写法,须要我们继承View,然后重写一些 方法,方法多多,看你须要什么方法 首先写一个自己定义的V ...

  3. 【Android自己定义View实战】之自己定义超简单SearchView搜索框

    [Android自己定义View实战]之自己定义超简单SearchView搜索框 这篇文章是对之前文章的翻新,至于为什么我要又一次改动这篇文章?原因例如以下 1.有人举报我抄袭,原文链接:http:/ ...

  4. Android 自己定义View学习(2)

    上一篇学习了基本使用方法,今天学一下略微复杂一点的.先看一下效果图 为了完毕上面的效果还是要用到上一期开头的四步 1,属性应该要有颜色,要有速度 <?xml version="1.0& ...

  5. 手把手带你画一个 时尚仪表盘 Android 自己定义View

    拿到美工效果图.咱们程序猿就得画得一模一样. 为了不被老板喷,仅仅能多练啊. 听说你认为前面几篇都so easy,那今天就带你做个相对照较复杂的. 转载请注明出处:http://blog.csdn.n ...

  6. Android自己定义view之measure、layout、draw三大流程

    自己定义view之measure.layout.draw三大流程 一个view要显示出来.须要经过測量.布局和绘制这三个过程,本章就这三个流程具体探讨一下.View的三大流程具体分析起来比較复杂,本文 ...

  7. Android自己定义View的实现方法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17357967 不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了.回 ...

  8. Android自己定义View基础篇(三)之SwitchButton开关

    自己定义View基础篇(二) 自己定义View基础篇(一) 自己定义View原理 我在解说之前,先来看看效果图,有图有真相:(转换gif图片效果太差) 那来看看真实图片: 假设你要更改样式,请改动例如 ...

  9. android 自己定义View之SubmitView

    转载请注明出处:王亟亟的大牛之路 近期看了一大堆的自己定义View多数都能够充当耗时操作的交互界面.再接再厉再传一个SubmitView.一个和可用于模仿提交等待与用户交互用的一个自己定义View 效 ...

随机推荐

  1. Nginx配置文件nginx.conf具体解释

    #定义Nginx执行的用户和用户组user www www; #nginx进程数.建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | i ...

  2. Revit Family API 找到实体某一方向上的面。

    PlanarFace.Normal取得向量.IsAlmostEqualTo判断向量是否一致. // ================================================== ...

  3. mac 刻录ISO系统盘

    今天本本系统坏了,手头上又没有U盘PE工具,只有MAC和光驱,只好在MAC上下载系统ISO刻录,我是直接点ISO文件,右键刻录到光盘,刻录好之后放到本本上发现不能引导,再把光盘放回MAC上一看,光盘里 ...

  4. C#中的Hashtable

    richTextBox1.Text = ""; Hashtable ht = new Hashtable(); ht.Add("); ht.Add("); ht ...

  5. Swift:playground

    在介绍Playground之前,我先罗列一些本人认为有点重要然而零碎的知识点. 1. Swift语法.每句话之后不用加分号.但也能够加分号.但假设写在一行的话.必须加分号. 2. Swift严格要求变 ...

  6. 关于面试总结10-selenium中隐藏元素如何定位?(hidden、display: none)

    前言 面试题:selenium中隐藏元素如何定位?这个是很多面试官喜欢问的一个题,如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~很多面试官自己都搞不清楚啥 ...

  7. Java List集合冒泡法排序的两种实现

    冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已 ...

  8. 较老版本 AFNetworking 使用心得

    较老版本的 AFNetworking 下载链接 http://pan.baidu.com/s/14Cxga 将压缩包中的文件夹拖入xcode工程项目中并引入如下的框架 简单的 JOSN 解析例子    ...

  9. 黑马day17 ajax&amp;实现username自己主动刷新

    1. regist.jsp文件 <%@ page language="java" pageEncoding="utf-8"%> <!DOCTY ...

  10. mongodb centos7上的安装

    1,下载安装包 下载mongoDB的安装文件地址:https://www.mongodb.org/downloads#production 选择Linux 64-bit legacy 版本,下载到目标 ...