Android电量图标实现

来源:互联网 发布:oracle 删除数据库 编辑:程序博客网 时间:2024/05/10 04:26
  最近实现了一个显示系统电量View,外部调用不需要任何控制。简单添加View就可使用。   思路很简单,通过监听Intent.ACTION_BATTERY_CHANGED)获取系统电量。用Canvas画出电池框和电池芯。  实现了三种状态:  1.未充电时,显示白色  2.电量小于10%,显示红色  3.充电状态,显示绿色

实现效果:
这里写图片描述

代码如下:
github地址

public class BatteryView extends View {    private int mMargin = 5;    //电池内芯与边框的距离    private int mBoder = 4;     //电池外框的宽带    private int mWidth = 70;    //总长    private int mHeight = 40;   //总高    private int mHeadWidth = 6;    private int mHeadHeight = 10;    private RectF mMainRect;    private RectF mHeadRect;    private float mRadius = 4f;   //圆角    private float mPower;    private boolean mIsCharging;    //是否在充电    public BatteryView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView();    }    public BatteryView(Context context, AttributeSet attrs) {        super(context, attrs);        initView();    }    public BatteryView(Context context) {        super(context);        initView();    }    private void initView() {        mHeadRect = new RectF(0, (mHeight - mHeadHeight)/2, mHeadWidth, (mHeight + mHeadHeight)/2);        float left = mHeadRect.width();        float top = mBoder;        float right = mWidth-mBoder;        float bottom = mHeight-mBoder;        mMainRect = new RectF(left, top, right, bottom);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        Paint paint1 = new Paint();        //画电池头        paint1.setStyle(Paint.Style.FILL);  //实心        paint1.setColor(Color.WHITE);        canvas.drawRect(mHeadRect, paint1);        //画外框        paint1.setStyle(Paint.Style.STROKE);    //设置空心矩形        paint1.setStrokeWidth(mBoder);          //设置边框宽度        paint1.setColor(Color.WHITE);        canvas.drawRoundRect(mMainRect, mRadius, mRadius, paint1);        //画电池芯        Paint paint = new Paint();        if (mIsCharging) {            paint.setColor(Color.GREEN);        } else {            if (mPower < 0.1) {                paint.setColor(Color.RED);            } else {                paint.setColor(Color.WHITE);            }        }        int width   = (int) (mPower * (mMainRect.width() - mMargin*2));        int left    = (int) (mMainRect.right - mMargin - width);        int right   = (int) (mMainRect.right - mMargin);        int top     = (int) (mMainRect.top + mMargin);        int bottom  = (int) (mMainRect.bottom - mMargin);        Rect rect = new Rect(left,top,right, bottom);        canvas.drawRect(rect, paint);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        setMeasuredDimension(mWidth, mHeight);    }    private void setPower(float power) {        mPower = power;        invalidate();    }    private BroadcastReceiver mPowerConnectionReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);            mIsCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||                    status == BatteryManager.BATTERY_STATUS_FULL;            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);            setPower(((float) level)/scale);        }    };    @Override    protected void onAttachedToWindow() {        getContext().registerReceiver(mPowerConnectionReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));        super.onAttachedToWindow();    }    @Override    protected void onDetachedFromWindow() {        getContext().unregisterReceiver(mPowerConnectionReceiver);        super.onDetachedFromWindow();    }}
0 0