我是靠谱客的博主 贤惠犀牛,这篇文章主要介绍Android 绘制电池电量图标(含充电状态)。,现在分享给大家,希望可以做个参考。

Android 绘制电池电量图标在视频播放等全屏情况下有用到。
先在布局文件中写一个ImageView

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main2" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="@color/colorAccent" tools:context="com.example.mybluetooth.Main2Activity"> <!--电池电量 --> <ImageView android:id="@+id/image_battery" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="300dp" android:src="@drawable/battery"/> </RelativeLayout>

准备好两张电池电量图片(满和空),在drawable中定义battery.xml。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 空的电池 --> <item> <bitmap android:src="@drawable/battery_empty" /> </item> <!-- 裁剪满的电池图标 --> <item android:id="@+id/clip_drawable"> <clip android:clipOrientation="horizontal" android:drawable="@drawable/battery_full" android:gravity="left" /> </item> </layer-list>

在Activity中实现。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
public class Main2Activity extends AppCompatActivity { private ClipDrawable clipDrawable; private int currentPower = 0; private boolean isCharging = false; private Handler handler = new Handler(); private boolean canAnimater; private ImageView imageBattery; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); imageBattery = (ImageView) findViewById(R.id.image_battery); LayerDrawable layerDrawable = (LayerDrawable) imageBattery.getDrawable(); clipDrawable = (ClipDrawable) layerDrawable.findDrawableByLayerId(R.id.clip_drawable); } @Override protected void onResume() { super.onResume(); canAnimater =true; handler.removeCallbacks(chargingRunnable); handler.post(chargingRunnable); IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); intentFilter.addAction(Intent.ACTION_POWER_CONNECTED); intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED); registerReceiver(batteryChangedReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); canAnimater=false; unregisterReceiver(batteryChangedReceiver); handler.removeCallbacks(chargingRunnable); } // 电量变化广播 // TODO 假设进入Activity之前就已经在充电,进入之后无法收到充电的广播 private BroadcastReceiver batteryChangedReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { int level = intent.getIntExtra("level", 0); int scale = intent.getIntExtra("scale", 100); int power = level * 100 / scale; currentPower = power; clipDrawable.setLevel(calculateLevel(power)); } else { int status = intent.getIntExtra("status", currentPower); if (Intent.ACTION_POWER_CONNECTED.equals(intent.getAction())) { isCharging = true; } else if (Intent.ACTION_POWER_DISCONNECTED.equals(intent.getAction())) { isCharging = false; } Toast.makeText(Main2Activity.this, "充电:" + isCharging + "," + status, Toast.LENGTH_SHORT).show(); if (isCharging) { handler.removeCallbacks(chargingRunnable); handler.post(chargingRunnable); } //在自定义充电状态的图片时在这里 // else { // imageBattery.setImageResource(R.drawable.battery_full); // } } } }; private int calculateLevel(int progress) { int leftOffest = dip2px(this, 2); int powerLength = dip2px(this, 26.5f);// 40 px in hdpi int totalLength = dip2px(this, 32.5f);// 49 px in hdpi int level = (leftOffest + powerLength * progress / 100) * 10000 / totalLength; return level; } private int dip2px(Context context, float v) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (v * scale + 0.5f); } private Runnable chargingRunnable = new Runnable() { @Override public void run() { Log.e("test", "isCharging:" + isCharging + ",canAnimater:" + canAnimater); if (!isCharging || !canAnimater) { return; } // imageBattery.setImageResource(R.drawable.battery_empty); 充电状态图片 ValueAnimator animator = ValueAnimator.ofInt(100, currentPower, 100); animator.setDuration(1500); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int animatedValue = (Integer) animation.getAnimatedValue(); clipDrawable.setLevel(calculateLevel(animatedValue)); } }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (isCharging && canAnimater) { handler.postDelayed(chargingRunnable, 600); } else { clipDrawable.setLevel(calculateLevel(currentPower)); } } }); animator.start(); } }; }

最后

以上就是贤惠犀牛最近收集整理的关于Android 绘制电池电量图标(含充电状态)。的全部内容,更多相关Android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部