1直想把外国的1个工具箱的电池那个动画做出来,今天有时间就想做1下 界面是这样的,制作了基本部份,果然还是手机卫士,比较考基础。
①通过Intent去的手机音量的变化
电池的电量1直是手机用户所关心的问题,而在android系统中,专门提供了1个获得电池电量的消息 Action―ACTION_BATTERY_CHANGED。
回到,demo里面 既然我要获得系统的信息,就先注册1个广播,获得电池的信息,BatteryReceiver.java类 广播 4大组件先去配置文件注册1把 我要获得的信息,都在UI上面,用1个map集合装上我们信息 通过handler.dispatchMessage 将信息传过去..................
package com.example.bettary.recevier;
import java.util.HashMap;
import java.util.Map;
import com.example.bettary.BatteryManagerActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.BatteryManager;
import android.os.Message;
/**
* @author xiaoxin007
* 2014⑴2⑷下午5:53:01
* TODO 电池的广播接收者
*/
public class BatteryReceiver extends BroadcastReceiver {
Map<String, Object> map;
private Message message;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
map = new HashMap<String, Object>();
/** 电池剩余电量 */
map.put("level", "" + intent.getIntExtra("level", 0));
/** 获得电池满电量数值 */
map.put("scale", "" + intent.getIntExtra("scale", 0));
/** 获得电池技术支持 */
map.put("technology", "" + intent.getStringExtra("technology"));
/** 获得电池状态 */
map.put("status", ""+ intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN));
/** 获得电源信息 */
map.put("plugType", "" + intent.getIntExtra("plugged", 0));
/** 获得电池健康度 */
map.put("health",""+ intent.getIntExtra("health",BatteryManager.BATTERY_HEALTH_UNKNOWN));
/** 获得电池电压 */
map.put("voltage", intent.getIntExtra("voltage", 0) + "");
/** 获得电池温度 */
map.put("temperature", intent.getIntExtra("temperature", 0) + "");
if (map!=null) {
message = new Message();
message.obj = map;
BatteryManagerActivity.handler1.dispatchMessage(message);
}
}
}
}
②通过动画实现电池的递增增加效果
现在开始 activity代码了 布局有点复杂,后面我贴上源码,大家在看吧
零 动画动起来
1.实例化动画类
animImageView = new AnimImageView();
2.动画类实现runnble 进行耗时操作
public class AnimImageView implements Runnable {
@Override
public void run() {
BterryAnim();
battery_image.postDelayed(animImageView, 1000);
}
}
通过定义postDelayed 延时1秒后 又履行此线程
3.使用Matrix控制充电动画
public void BterryAnim() {
float[] stateArray = new float[] { 0.1f, 0.25f, 0.5f, 0.75f, 1f };
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.battery_full);
int height = bitmap.getHeight();
int width = bitmap.getWidth();
// 使用Matrix控制充电动画
Matrix matrix = new Matrix();
matrix.postScale(stateArray[state], 1.0f);
Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,
matrix, false);
state = state + 1;
battery_image.setImageBitmap(newBitmap);
if (state == 5) {
state = 0;
}
}
1初始化布局
private void init() {
/** 获得电池状态对象 */
battery_Status = (TextView) findViewById(R.id.battery_status);
/** 获得电池运行状态 */
battery_Run_Status = (TextView) findViewById(R.id.battery_health);
/** 获得电池电压 */
battery_Voltage = (TextView) findViewById(R.id.battery_voltage);
/** 获得电池温度 */
battery_Temperature = (TextView) findViewById(R.id.battery_temperature);
/** 获得电池技术 */
battery_Technology = (TextView) findViewById(R.id.battery_technology);
// /** 回去电池运行时间 */
// battery_Time = (TextView) findViewById(R.id.boot_time);
/** 获得电池电量对象 */
battery_Level = (TextView) findViewById(R.id.battery);
/** 获得充电图标 */
bty_Charging = (ImageView) findViewById(R.id.charging);
/** 获得充电 */
battery_image = (ImageView) findViewById(R.id.battery_image);
}
2注册广播
其实我还在是在代码中注册的 1个意图,1个广播类
/**
* 注册广播
*/
private void regReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(new BatteryReceiver(), filter);
}
然后广播类 通过handler类 将获得的到电池信息 返回回来..........
3通过handler履行UI更新操作
/**
* 接收BatteryReceiver广播类
*/
handler1 = new Handler() {
@Override
public void handleMessage(Message msg) {
map = (Map<String, Object>) msg.obj;
int health = Integer.parseInt(map.get("health").toString());
Log.i(TAG, health + "");
if (health == 2) {
/** 设置电池运行状态 */
battery_Run_Status.setText("正常");
} else {
/** 设置电池运行状态 */
battery_Run_Status.setText("1般");
}
/** 设置电池电压 */
battery_Voltage.setText("" + map.get("voltage") + "mV");
/** 设置电池温度 */
double time = Double.parseDouble(map.get("temperature") + "");
battery_Temperature.setText("" + time / 10 + "°C");
/** 设置电池电量 */
max = Double.parseDouble(map.get("scale") + "");
min = Double.parseDouble(map.get("level") + "");
temp = (min / max);
/** 设置电池技术 */
battery_Technology.setText("" + map.get("technology"));
/** 设置启动时间 */
// handler2 = new Handler() {
// @Override
// public void handleMessage(Message msg) {
// battery_Time.setText("" + msg.obj.toString());
// }
// };
/** 设置电池状态 为USB充电 */
if (map.get("plugType").equals("2")) {
// 显示充电图片
bty_Charging.setVisibility(View.VISIBLE);
// 绑定显示充电方式为USB
battery_Status.setText("正在充电(USB)");
if (isAnimRun == false) {
// 设置充电动画
battery_image.postDelayed(animImageView, 1000);
isAnimRun = true;
}
/** 设置电池状态 为交换电充电 */
} else if (map.get("plugType").equals("1")) {
// 显示充电图片
bty_Charging.setVisibility(View.VISIBLE);
// 绑定显示充电方式为交换电
battery_Status.setText("正在充电(交换电)");
if (isAnimRun == false) {
// 设置充电动画
battery_image.postDelayed(animImageView, 1000);
isAnimRun = true;
}
/** 设置电池状态 */
} else if (map.get("plugType").equals("0")) {
// 隐藏充电图标
bty_Charging.setVisibility(View.INVISIBLE);
// 设置信息
battery_Status.setText("正在耗电");
if (isAnimRun == true) {
// 结束充电动画
battery_image.removeCallbacks(animImageView);
// 设置电池剩余电量
setSize(temp * 100);
// 动画关闭
isAnimRun = false;
}
}
setSize(temp * 100);
System.out.println(temp + ":" + temp * 100);
battery_Level.setText(temp * 100 + "%");
}
};
}
点击下载源码