Android 充电进度获取

1.判断当前是否正在冲电

    private boolean isCharging(Context c) {        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);        Intent batteryStatus = c.registerReceiver(null, ifilter);        int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||                status == BatteryManager.BATTERY_STATUS_FULL;        return isCharging;    }

2.充电当前进度获取

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);Intent batteryStatus = registerReceiver(null, ifilter);int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);float batteryPct = (float) level / (float) scale;

3.通过广播检测充电进度变化

    private BroadcastReceiver mBroadcast = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            String action = intent.getAction();            if (action.equals(Intent.ACTION_POWER_CONNECTED)) {                //电源连接            } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {            //充电进度变化                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);                float batteryPct = (float) level / (float) scale;                         } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {               //断开充电线            }        }    };//使用动态广播注册    private void registerReceiver() {        IntentFilter updateIntent = new IntentFilter();        updateIntent.addAction("android.intent.action.ACTION_POWER_CONNECTED");        updateIntent.addAction("android.intent.action.ACTION_POWER_DISCONNECTED");        updateIntent.addAction("android.intent.action.ACTION_BATTERY_CHANGED");        registerReceiver(mBroadcast , updateIntent);    }

圆形波浪进度

Android充电进度获取,圆形波浪进度展示_第1张图片 效果图

外圈就是一个简单的圆形进度,内圈波浪就是一个利用贝尔曲线绘制的波浪和一个圆两者取重叠后形成。

Android充电进度获取,圆形波浪进度展示_第2张图片 贝尔曲线原理

更多关于贝尔曲线

    private void drawWave(Canvas canvas, Paint paint, Point[] points, float waveOffset) {        mWaveLimitPath.reset();        mWavePath.reset();//波浪路径        float height = lockWave ? 0 : mRadius - 2 * mRadius * mPercent;        //moveTo和lineTo绘制出水波区域矩形        //移动到起始位置        mWavePath.moveTo(points[0].x + waveOffset, points[0].y + height);        for (int i = 1; i < mAllPointCount; i += 2) {            //前面两个是控制位参数,后面两个是终点位            mWavePath.quadTo(points[i].x + waveOffset, points[i].y + height,                    points[i + 1].x + waveOffset, points[i + 1].y + height);        }        mWavePath.lineTo(points[mAllPointCount - 1].x, points[mAllPointCount - 1].y + height);        //不管如何移动,波浪与圆路径的交集底部永远固定,否则会造成上移的时候底部为空的情况        mWavePath.lineTo(points[mAllPointCount - 1].x, mCenterPoint.y + mRadius);        mWavePath.lineTo(points[0].x, mCenterPoint.y + mRadius);        mWavePath.close();        mWaveLimitPath.addCircle(mCenterPoint.x, mCenterPoint.y, mRadius, Path.Direction.CW);        //取该圆与波浪路径的交集,形成波浪在圆内的效果        mWaveLimitPath.op(mWavePath, Path.Op.INTERSECT);//取重叠部分        canvas.drawPath(mWaveLimitPath, paint);    }
    private void startDarkWaveAnimator() {        if (mDarkWaveAnimator != null && mDarkWaveAnimator.isRunning()) {            return;        }        mDarkWaveAnimator = ValueAnimator.ofFloat(0, 2 * mRadius);        mDarkWaveAnimator.setDuration(mDarkWaveAnimTime);        mDarkWaveAnimator.setRepeatCount(ValueAnimator.INFINITE);//循环        mDarkWaveAnimator.setInterpolator(new LinearInterpolator());        mDarkWaveAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                mDarkWaveOffset = (float) animation.getAnimatedValue();               //改变起始坐标的Y值(上面方法drawWave的waveOffset参数),通过参数控制实现波浪抖动                postInvalidate();//重绘            }        });        mDarkWaveAnimator.addListener(                new AnimatorListenerAdapter() {                    @Override                    public void onAnimationStart(Animator animation) {                        super.onAnimationStart(animation);                        mDarkWaveOffset = 0;                    }                }        );        mDarkWaveAnimator.start();    }

参考:
https://github.com/MyLifeMyTravel/CircleProgress
http://blog.csdn.net/z82367825/article/details/51599245

更多相关文章

  1. SeekBar进度条的使用
  2. 【android】解决自定义样式progressbar的进度显示问题
  3. Android 自定义控件实现点击波浪效果(九)
  4. Android带进度条的下载图片示例(AsyncTask异步任务)
  5. android新闻项目、饮食助手、下拉刷新、自定义View进度条、React
  6. Android专题之AsyncTask(三)异步方法操作之进度条
  7. Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片

随机推荐

  1. php判断手机浏览还是web浏览,并执行相应的
  2. PHP变量类型+整型类型细节
  3. PHP中的替代语法
  4. 仅在LARAVEL或AJAX中提交表单时,无需用户
  5. JAVA/PHP/C#版RSA验签--转
  6. 十大最流行PHP框架排名
  7. 无法在phpmyadmin中打开一些表
  8. PHP联系表格给用户发送随机确认号码
  9. 谈谈php里的DAO Model AR
  10. PHP:如何通过sprintf()添加前导零/零填充浮