自定义电池View

来源:互联网 发布:短信猫 java 编辑:程序博客网 时间:2024/04/30 02:06

在 Android 中自定义一个电池图标,一般是采用自定义 View,在 onDraw 中采用 Canvas 去绘制 Bitmap 或者各种几何图形。

(1)自定义电池View的实现:

/** *  * @author hjy * 自定义电池view实现飞机电量显示 */public class BatteryView extends View{private int mPower = 70;    private int orientation;    private int width;    private int height;    private int mColor;    public BatteryView(Context context) {        super(context);    }    public BatteryView(Context context, AttributeSet attrs) {        super(context, attrs);        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Battery);        mColor = typedArray.getColor(R.styleable.Battery_batteryColor, Color.WHITE);        orientation = typedArray.getInt(R.styleable.Battery_batteryOrientation, 0);        mPower = typedArray.getInt(R.styleable.Battery_batteryPower, 70);        width = 65;//30        height = 30;//50        /**         * recycle() :官方的解释是:回收TypedArray,以便后面重用。在调用这个函数后,你就不能再使用这个TypedArray。         * 在TypedArray后调用recycle主要是为了缓存。当recycle被调用后,这就说明这个对象从现在可以被重用了。         *TypedArray 内部持有部分数组,它们缓存在Resources类中的静态字段中,这样就不用每次使用前都需要分配内存。         */        typedArray.recycle();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        //对View上的內容进行测量后得到的View內容占据的宽度        width = 65;        //对View上的內容进行测量后得到的View內容占据的高度        height = 30;    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //判断电池方向    horizontal: 0   vertical: 1        if (orientation == 0) {            drawHorizontalBattery(canvas);        } else {            drawVerticalBattery(canvas);        }    }    /**     * 绘制水平电池     *     * @param canvas     */    private void drawHorizontalBattery(Canvas canvas) {        Paint paint = new Paint();        paint.setColor(mColor);        paint.setStyle(Paint.Style.STROKE);        float strokeWidth = width / 20.f;        float strokeWidth_2 = strokeWidth / 2;        paint.setStrokeWidth(strokeWidth);        RectF r1 = new RectF(strokeWidth_2, strokeWidth_2, width - strokeWidth - strokeWidth_2, height - strokeWidth_2);        //设置外边框颜色为黑色        paint.setColor(Color.WHITE);        canvas.drawRect(r1, paint);        paint.setStrokeWidth(0);        paint.setStyle(Paint.Style.FILL);        //画电池内矩形电量        float offset = (width - strokeWidth * 2) * mPower / 100.f;        RectF r2 = new RectF(strokeWidth, strokeWidth, offset, height - strokeWidth);        //根据电池电量决定电池内矩形电量颜色        if (mPower < 20) {            paint.setColor(Color.RED);        }        if (mPower > 20) {            paint.setColor(Color.WHITE);        }//        if (mPower >= 50) {//            paint.setColor(Color.WHITE);//        }        canvas.drawRect(r2, paint);        //画电池头        RectF r3 = new RectF(width - strokeWidth, height * 0.25f, width, height * 0.75f);        //设置电池头颜色为黑色        paint.setColor(Color.WHITE);        canvas.drawRect(r3, paint);    }    /**     * 绘制垂直电池     *     * @param canvas     */    private void drawVerticalBattery(Canvas canvas) {        Paint paint = new Paint();        paint.setColor(mColor);        paint.setStyle(Paint.Style.STROKE);        float strokeWidth = height / 20.0f;        float strokeWidth2 = strokeWidth / 2;        paint.setStrokeWidth(strokeWidth);        int headHeight = (int) (strokeWidth + 0.5f);                RectF rect = new RectF(strokeWidth2, headHeight + strokeWidth2, width - strokeWidth2, height - strokeWidth2);        canvas.drawRect(rect, paint);        paint.setStrokeWidth(0);        float topOffset = (height - headHeight - strokeWidth) * (100 - mPower) / 100.0f;        RectF rect2 = new RectF(strokeWidth, headHeight + strokeWidth + topOffset, width - strokeWidth, height - strokeWidth);        paint.setStyle(Paint.Style.FILL);        canvas.drawRect(rect2, paint);        RectF headRect = new RectF(width / 4.0f, 0, width * 0.75f, headHeight);        canvas.drawRect(headRect, paint);    }    /**     * 设置电池电量     *     * @param power     */    public void setPower(int power) {        this.mPower = power;        if (mPower < 0) {            mPower = 100;        }        invalidate();//刷新VIEW    }    /**     * 设置电池颜色     *     * @param color     */    public void setColor(int color) {        this.mColor = color;        invalidate();    }    /**     * 获取电池电量     *     * @return     */    public int getPower() {        return mPower;    }}
(2)自定义电池View布局文件的实现:

(3)如何使用自定义电池View:

private BatteryView iv_menu_electricity = (BatteryView) findViewById(R.id.iv_menu_electricity);if(gcs.myDrone.getBattery().getBattRemain() > 100.0){tv_menu_electricity.setText("100.0%");iv_menu_electricity.setPower(100);}else if (gcs.myDrone.getBattery().getBattRemain() < 0) {tv_menu_electricity.setText("0.0%");iv_menu_electricity.setPower(0);}else {tv_menu_electricity.setText(gcs.myDrone.getBattery().getBattRemain()+"%");int BattRemain = (int) gcs.myDrone.getBattery().getBattRemain();iv_menu_electricity.setPower(BattRemain);}

原创粉丝点击