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

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

新建例如以下变量:

  1. private Context mContext;
  2. private Paint mCirclePaint,mDegreePaint,mHourPaint,mMinPaint;
  3. private int mViewWidth,mViewHeight;

初始化这些变量:

  1. public void init(Context context){
  2. mContext = context;
  3. mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  4. mDegreePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  5. mHourPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  6. mMinPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  7. mCirclePaint.setAntiAlias(true);
  8. mCirclePaint.setStrokeWidth(5);
  9. mCirclePaint.setStyle(Paint.Style.STROKE);
  10. mHourPaint.setStrokeWidth(20);
  11. mMinPaint.setStrokeWidth(10);
  12. getViewTreeObserver().addOnGlobalLayoutListener(this);
  13. }

onGlobalLayout中初始化DashBoardView宽高:

  1. @Override
  2. public void onGlobalLayout() {
  3. mViewHeight = getHeight();
  4. mViewWidth = getWidth();
  5. }

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

  1. /*
  2. * 画表盘圆形
  3. * */
  4. canvas.drawCircle(mViewWidth/2,mViewHeight/2,mViewWidth/2,mCirclePaint);
  5. /*
  6. * 画刻度
  7. * */
  8. for (int i=0;i<24;i++){
  9. if(i==0 || i==6 || i==12 || i==18){
  10. /*
  11. * 画整点刻度
  12. * */
  13. mDegreePaint.setStrokeWidth(5);
  14. mDegreePaint.setTextSize(30);
  15. canvas.drawLine(mViewWidth/2,mViewHeight/2-mViewWidth/2,mViewWidth/2,mViewHeight/2-mViewWidth/2+60,mDegreePaint);
  16. String degree = String.valueOf(i);
  17. canvas.drawText(degree,mViewWidth/2-mDegreePaint.measureText(degree)/2,mViewHeight/2-mViewWidth/2+90,mDegreePaint);
  18. }else{
  19. mDegreePaint.setStrokeWidth(3);
  20. mDegreePaint.setTextSize(15);
  21. canvas.drawLine(mViewWidth/2,mViewHeight/2-mViewWidth/2,mViewWidth/2,mViewHeight/2-mViewWidth/2+30,mDegreePaint);
  22. String degree = String.valueOf(i);
  23. canvas.drawText(degree,mViewWidth/2-mDegreePaint.measureText(degree)/2,mViewHeight/2-mViewWidth/2+90,mDegreePaint);
  24. }
  25. /*
  26. * 通过旋转画布来画好全部的刻度
  27. * */
  28. canvas.rotate(15,mViewWidth/2,mViewHeight/2);
  29. }
  30. /*
  31. * 画指针
  32. * */
  33. mHourPaint.setStrokeWidth(20);
  34. mMinPaint.setStrokeWidth(10);
  35. canvas.save();
  36. canvas.translate(mViewWidth/2,mViewHeight/2);
  37. canvas.drawLine(0,0,100,100,mHourPaint);
  38. canvas.drawLine(0,0,100,200,mMinPaint);
  39. 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. AutoMapper在MVC中的运用03-字典集合、枚举映射,自定义解析器

    本篇AutoMapper使用场景: ※ 源字典集合转换成目标字典集合 ※ 枚举映射 ※ 自定义解析器 ※ 源中的复杂属性和Get...方法转换成目标属性 源字典集合转换成目标字典集合 □ Domain ...

  2. Android:活动的简单使用

    2.1    活动是什么 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件, 主要用于和用户进行交互.一个应用程序中可以包含零个或多个活动,但不包含任何活动的 应用程 ...

  3. Android ormlite like() function is not working

    //http://stackoverflow.com/questions/7642161/android-ormlite-like-function-is-not-working try { Quer ...

  4. dll 显示调用

    今天尝试写了一个简单的C++DLL,并且用另一个CPP调用它,啥都不说,先贴代码 1.DLL(冒泡算法) extern "C" 必须最左 _declspec(dllexport)和 ...

  5. Linux学习19-gitlab配置邮箱postfix(新用户激活邮件)

    前言 gitlab新增新用户有两种方式,第一种可以用户主动注册(自己设置密码):第二种也可以通过root管理员用户直接添加用户,发个邮件到用户的邮箱里,收到邮件后激活. 如果是第二种方式添加新用户的话 ...

  6. BI 可视化

    1. Blackbird: Open Source JavaScript Logging Utility Blackbird 是一款非常酷的 JavaScript 调试工具,带有一个漂亮的界面显示和过 ...

  7. 趣谈Java变量的可见性问题

    了解过多线程的我们,对synchorized,sleep和valatile都比较了解,但是当这三个名词和“Java变量得可见性”的话题联系在一起不知道大家是否还可以保持大脑清晰??? 最近看到一个关于 ...

  8. putty adb

    putty.exe -adb -P 5037 transport-usb 网络调试也是可以的 先connect 再执行上面的命令 http://files.cnblogs.com/files/ahuo ...

  9. Android Lint简介

    Android Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通过它对Android工程源代码进行扫描和检查,可发现潜在的问题,以便程序员及早修正这个问题.Android Li ...

  10. [转]PHP 真正多线程的使用

    From : http://blog.s135.com/pthreads/ PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够 ...