自定义电池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; }}
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);}
阅读全文
1 0
- android自定义电池View
- 自定义电池View
- 自定义view之 电池充电view动画
- Android显示电量——自定义电池View
- Android 自定义UI--电池
- Android 自定义UI--电池
- Android 自定义UI--电池
- Android自定义电池控件
- 自定义电池UI
- Android自定义电池控件
- 自定义电池充电动画
- 自定义view
- 自定义View
- 自定义view
- 自定义View
- 自定义View
- 自定义view
- 自定义View
- 进入阿里巴巴,实现了大学时的梦想
- mount执行时相关错误
- CherryPy文档中文翻译
- Dalivik GC
- android源代中内置应用
- 自定义电池View
- ios 弹框总结
- 自定义eventbus 10多k
- 查看linux上面是否有安装redis,redis启动
- spring ioc
- Liunx — 进程等待 (wait和waitpid函数)
- Eclipse创建Maven Web项目
- Java并发编程:volatile关键字解析
- JAVA垃圾回收详解(算法篇)