首先看一下效果图,

下面看代码:

  1. /**
  2. *
  3. */
  4. package com.example.batterydemo;
  5. import android.content.Context;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.graphics.Paint.Style;
  10. import android.graphics.RectF;
  11. import android.util.AttributeSet;
  12. import android.view.View;
  13. /**
  14. * @author kince
  15. * @category 自定义View电池
  16. * @time 2014.2.13
  17. * @qq 543781062
  18. *
  19. */
  20. public class BatteryView extends View {
  21. /**
  22. * 画笔信息
  23. */
  24. private Paint mBatteryPaint;
  25. private Paint mPowerPaint;
  26. private float mBatteryStroke = 2f;
  27. /**
  28. * 屏幕高宽
  29. */
  30. private int measureWidth;
  31. private int measureHeigth;
  32. /**
  33. *
  34. * 电池参数
  35. */
  36. private float mBatteryHeight = 30f; // 电池的高度
  37. private float mBatteryWidth = 60f; // 电池的宽度
  38. private float mCapHeight = 15f;
  39. private float mCapWidth = 5f;
  40. /**
  41. *
  42. * 电池电量
  43. */
  44. private float mPowerPadding = 1;
  45. private float mPowerHeight = mBatteryHeight - mBatteryStroke
  46. - mPowerPadding * 2; // 电池身体的高度
  47. private float mPowerWidth = mBatteryWidth - mBatteryStroke - mPowerPadding
  48. * 2;// 电池身体的总宽度
  49. private float mPower = 0f;
  50. /**
  51. *
  52. * 矩形
  53. */
  54. private RectF mBatteryRect;
  55. private RectF mCapRect;
  56. private RectF mPowerRect;
  57. public BatteryView(Context context) {
  58. super(context);
  59. initView();
  60. }
  61. public BatteryView(Context context, AttributeSet attrs) {
  62. super(context, attrs);
  63. initView();
  64. }
  65. public BatteryView(Context context, AttributeSet attrs, int defStyleAttr) {
  66. super(context, attrs, defStyleAttr);
  67. initView();
  68. }
  69. public void initView() {
  70. /**
  71. * 设置电池画笔
  72. */
  73. mBatteryPaint = new Paint();
  74. mBatteryPaint.setColor(Color.GRAY);
  75. mBatteryPaint.setAntiAlias(true);
  76. mBatteryPaint.setStyle(Style.STROKE);
  77. mBatteryPaint.setStrokeWidth(mBatteryStroke);
  78. /**
  79. * 设置电量画笔
  80. */
  81. mPowerPaint = new Paint();
  82. mPowerPaint.setColor(Color.RED);
  83. mPowerPaint.setAntiAlias(true);
  84. mPowerPaint.setStyle(Style.FILL);
  85. mPowerPaint.setStrokeWidth(mBatteryStroke);
  86. /**
  87. * 设置电池矩形
  88. */
  89. mBatteryRect = new RectF(mCapWidth, 0, mBatteryWidth, mBatteryHeight);
  90. /**
  91. * 设置电池盖矩形
  92. */
  93. mCapRect = new RectF(0, (mBatteryHeight - mCapHeight) / 2, mCapWidth,
  94. (mBatteryHeight - mCapHeight) / 2 + mCapHeight);
  95. /**
  96. * 设置电量矩形
  97. */
  98. mPowerRect = new RectF(mCapWidth + mBatteryStroke / 2 + mPowerPadding
  99. + mPowerWidth * ((100f - mPower) / 100f), // 需要调整左边的位置
  100. mPowerPadding + mBatteryStroke / 2, // 需要考虑到 画笔的宽度
  101. mBatteryWidth - mPowerPadding * 2, mBatteryStroke / 2
  102. + mPowerPadding + mPowerHeight);
  103. }
  104. @Override
  105. protected void onDraw(Canvas canvas) {
  106. super.onDraw(canvas);
  107. canvas.save();
  108. canvas.translate(measureWidth / 2, measureHeigth / 2);
  109. canvas.drawRoundRect(mBatteryRect, 2f, 2f, mBatteryPaint); // 画电池轮廓需要考虑 画笔的宽度
  110. canvas.drawRoundRect(mCapRect, 2f, 2f, mBatteryPaint);// 画电池盖
  111. canvas.drawRect(mPowerRect, mPowerPaint);// 画电量
  112. canvas.restore();
  113. }
  114. @Override
  115. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  116. measureWidth = MeasureSpec.getSize(widthMeasureSpec);
  117. measureHeigth = MeasureSpec.getSize(heightMeasureSpec);
  118. setMeasuredDimension(measureWidth, measureHeigth);
  119. }
  120. /**]
  121. * @category 设置电池电量
  122. * @param power
  123. */
  124. public void setPower(float power) {
  125. mPower = power;
  126. if (mPower < 0) {
  127. mPower = 0;
  128. }
  129. mPowerRect = new RectF(mCapWidth + mBatteryStroke / 2 + mPowerPadding
  130. + mPowerWidth * ((100f - mPower) / 100f), // 需要调整左边的位置
  131. mPowerPadding + mBatteryStroke / 2, // 需要考虑到 画笔的宽度
  132. mBatteryWidth - mPowerPadding * 2, mBatteryStroke / 2
  133. + mPowerPadding + mPowerHeight);
  134. invalidate();
  135. }
  136. }

代码已经注释得比较清楚了,大家自己看吧,不懂的方法可以去看一下api。

Android 自定义UI--电池的更多相关文章

  1. android自定义UI模板图文详解

    不知道大家在实际开发中有没有自定义过UI模板?今天花时间研究了一下android中自定义UI模板,与大家分享一下. 每个设计良好的App都是自定义标题栏,在自定义标题栏的过程中大部分人可能都是自定义一 ...

  2. Android自定义UI的实现和应用

    在Android项目开发中,不可避免的要遇到自定义的UI,用较好的体验去讨好UED妹子和交互设计师手下留情~几个迭代下来,遇到了不少这样的要求,有简单有复杂.最好的实现方案就是讲业务和UI隔离,封装成 ...

  3. Android自定义UI模板

    第一步:自定义xml属性 新建一个android项目,在values文件夹中新建一个atts.xml的文件,在这个xml文件中声明我们一会在使用自定义控件时候需要指明的属性.atts.xml < ...

  4. android自定义View之NotePad出鞘记

    现在我们的手机上基本都会有一个记事本,用起来倒也还算方便,记事本这种东东,如果我想要自己实现,该怎么做呢?今天我们就通过自定义View的方式来自定义一个记事本.OK,废话不多说,先来看看效果图. 整个 ...

  5. Android开源的精美日历控件,热插拔设计的万能自定义UI

    Android开源的精美日历控件,热插拔设计的万能自定义UI UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的 ...

  6. Android自定义View和控件之一-定制属于自己的UI

    照例,拿来主义.我的学习是基于下面的三篇blog.前两是基本的流程,第三篇里有比较细致的绘制相关的属性.第4篇介绍了如何减少布局层次来提高效率. 1. 教你搞定Android自定义View 2. 教你 ...

  7. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  8. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

  9. Android 自定义View (五)——实践

    前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压 ...

  10. [原] Android 自定义View步骤

    例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...

随机推荐

  1. source insight3.5中文乱码解决方案

    source insight3.5中文乱码,网上看别人说改变宽字体.宋体等方法都不起效.根本原因是,source insight 3.5 不支持Unicode编码,所以导致中文的乱码,将文件转为gb2 ...

  2. Oracle 执行计划(Explain Plan)

    如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...

  3. 监听键盘 防止输入时覆盖掉textfiled

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardwasChange:) name:U ...

  4. jQuery Scroll div滚动条样式更改

    <script type="text/javascript" src="js/jquery-1.2.6.min.js"></script> ...

  5. ZOJ3557 How Many Sets II( Lucas定理)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud How Many Sets II Time Limit: 2 Seconds    ...

  6. java学习笔记 (7) —— 实现简单的上传处理

    1.下载apache 的 commons-fileupload.jar 包及 commons-io.jar 2.引入到lib 文件夹下 3.新建uploadApache.jsp <%@ page ...

  7. CFLAGS/CPPFLAGS/CXXFLAGS in Makefile介绍

    先来看一张关于Makefile中的常见预定义变量. CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项.这两个变量实际上涵盖了编译和汇编两个步骤.大多数程序和库 ...

  8. ADT-位图

    利用位图数据结构实现排序,利用每一位的下标作为索引,每位的值作为属性值,可以表示存在或不存在,适合存储稠密的数据,排序遍历的范围会是索引的最大值 最后发现耗时比python中list自带的sort多, ...

  9. 用js实现两个select下拉框之间的元素互相移动

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Commons Beanutils使用setProperty() - 就是爱Java

    有时不能只依靠getter/setter操作bean,如:需要名字动态取得的,或是访问bean内的field,甚至是集合或数组内bean的field,利用反射机制对bean的field进行处理,这时候 ...