Android 自定义UI--电池

 首先看一下效果图,

  下面看代码:

 

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

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

posted @ 2015-02-13 15:15  dongweiq  阅读(548)  评论(0编辑  收藏  举报