新建项目,新建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. VMware Workstation Pro 12 桥接联网(物理主机:Windows 7,虚拟机:CentOS 6.8)

    物理主机:Windows 7,虚拟机:CentOS 6.8 1.设置虚拟机的 默认路径:编辑 -> 首选项 -> 设置“虚拟机的默认位置” 2.设置 虚拟网络:编辑 -> 虚拟网络编 ...

  2. 改进架构,实现动态数据源,减少java维护

    怎样不用写java代码来完毕开发? 对于大部分的产品和项目来说.页面变化是很头痛的事情.每次小功能上线,新客户到来,都须要进行定制改造,不断的开发维护.每次开发一方面要修改页面,一方面要修改serve ...

  3. hibernate对查询的几个知识点

    1.      query里面的主要方法 list()可以得到查询的结果集 uniqueResult()如果查询的结果只有一条可以用这个   通过这两句可以实现分页,好处是可以跨数据库 query.s ...

  4. 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...

  5. Creating Reusable XAML User Controls with Xamarin Forms

    In the previous post on making fancy layouts with Xamarin Forms we saw how you can design a Dashboar ...

  6. iOS 项目一直在后台执行

    我后来是这么解决不知道行不行,能够长期的在后台执行 首先我在xx-info.plist 里的 "Required background modes" 里增加"App pr ...

  7. Idea2018激活破解

    原文:https://www.imsxm.com/2018/07/idea-2018-1-5-crack-patcher.html 最近更新了Intellij IDEA到2018.1.5之后,使用之前 ...

  8. jquery 图片文件转base64 显示

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  9. HttpMessageNotWritableException: Could not write JSON: No serializer found for class ****

    今天碰到一个异常,下面是错误信息 org.springframework.http.converter.HttpMessageNotWritableException: Could not write ...

  10. 管理Mysql常用指令

    知识会更新,数据库系统也一样,本文只保证对Mysql 5.7以及MariaDB 10有效. 编码篇 展示当前默认的编码和字符集 SHOW VARIABLES LIKE 'char%'; 修改服务器默认 ...