version:1.9.9

fix:
update:优化指示器颜色,优化个人中心,主页增加WiFi电池信息
This commit is contained in:
2024-10-24 17:46:02 +08:00
parent 750af19db6
commit d83c3b9291
33 changed files with 2166 additions and 1419 deletions

View File

@@ -3,7 +3,6 @@ package com.uiui.zyos.activity;
import android.content.Context;
import android.media.AudioAttributes;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
import android.text.TextUtils;
@@ -12,7 +11,6 @@ import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import com.tuo.customview.VerificationCodeView;
@@ -21,6 +19,7 @@ import com.uiui.zyos.base.BaseDataBindingActivity;
import com.uiui.zyos.config.CommonConfig;
import com.uiui.zyos.databinding.ActivityExitBinding;
import com.uiui.zyos.utils.Utils;
import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
public class ExitActivity extends BaseDataBindingActivity {
private static final String TAG = "ExitActivity";
@@ -30,10 +29,10 @@ public class ExitActivity extends BaseDataBindingActivity {
private SoundPool soundPool;
private int soundId;
@Override
public boolean setNightMode() {
return true;
}
// @Override
// public boolean setNightMode() {
// return true;
// }
@Override
protected void initDataBinding() {
@@ -97,6 +96,9 @@ public class ExitActivity extends BaseDataBindingActivity {
mBinding.bt7.setOnClickListener(view1 -> add(mBinding.icv, "7"));
mBinding.bt8.setOnClickListener(view1 -> add(mBinding.icv, "8"));
mBinding.bt9.setOnClickListener(view1 -> add(mBinding.icv, "9"));
// UltimateBarX.addStatusBarTopPadding(mBinding.clRoot);
// UltimateBarX.addNavigationBarBottomPadding(mBinding.clRoot);
}
private void checkPasswd() {

View File

@@ -19,16 +19,17 @@ import com.uiui.zyos.R;
import com.uiui.zyos.base.BaseDataBindingActivity;
import com.uiui.zyos.config.CommonConfig;
import com.uiui.zyos.databinding.ActivityPasswdBinding;
import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
public class PasswordActivity extends BaseDataBindingActivity {
private static final String TAG = "PasswordActivity";
private ActivityPasswdBinding mBinding;
@Override
public boolean setNightMode() {
return true;
}
// @Override
// public boolean setNightMode() {
// return true;
// }
@Override
protected void initDataBinding() {
@@ -108,6 +109,9 @@ public class PasswordActivity extends BaseDataBindingActivity {
setEmpty();
mBinding.tvHint.setText("密码错误");
}
UltimateBarX.addStatusBarTopPadding(mBinding.clRoot);
UltimateBarX.addNavigationBarBottomPadding(mBinding.clRoot);
}
private void setEmpty() {

View File

@@ -54,17 +54,17 @@ public class HomeworkViewModel extends BaseViewModel<ActivityHomeworkBinding, Ac
public void onNext(@NonNull BaseResponse<ArrayList<HomeworkBean>> listBaseResponse) {
Log.e("getHomework", "onNext: " + listBaseResponse);
ArrayList<HomeworkBean> homeworkBeans = listBaseResponse.data;
if (!BuildConfig.DEBUG) {
homeworkBeans = (ArrayList<HomeworkBean>) homeworkBeans.stream().filter(new Predicate<HomeworkBean>() {
if (homeworkBeans != null) {
ArrayList<HomeworkBean> homeworkBeans2 = (ArrayList<HomeworkBean>) homeworkBeans.stream().filter(new Predicate<HomeworkBean>() {
@Override
public boolean test(HomeworkBean homeworkBean) {
return TimeUtils.isHomeworkToday(homeworkBean.getCreated_at());
}
}).collect(Collectors.toList());
mHomeworkBeanListData.setValue(homeworkBeans2);
}else {
mHomeworkBeanListData.setValue(homeworkBeans);
}
mHomeworkBeanListData.setValue(homeworkBeans);
}
@Override

View File

@@ -1,5 +1,6 @@
package com.uiui.zyos.activity.main;
import android.app.ActionBar;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -127,8 +128,8 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
scaleCircleNavigator = new ScaleCircleNavigator(this);
scaleCircleNavigator.setCircleCount(1 + mSubjectFragment.getFragmentSize());
scaleCircleNavigator.setNormalCircleColor(Color.DKGRAY);
scaleCircleNavigator.setSelectedCircleColor(Color.LTGRAY);
scaleCircleNavigator.setNormalCircleColor(getResources().getColor(R.color.normal_circle));
scaleCircleNavigator.setSelectedCircleColor(getResources().getColor(R.color.selected_circle));
scaleCircleNavigator.setCircleClickListener(new ScaleCircleNavigator.OnCircleClickListener() {
@Override
public void onClick(int index) {
@@ -207,6 +208,23 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
} else {
startService(intent);
}
// 全屏展示
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// 全屏显示,隐藏状态栏和导航栏,拉出状态栏和导航栏显示一会儿后消失。
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
} else {
// 全屏显示,隐藏状态栏
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
}
@Override
@@ -666,6 +684,8 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
}
}
public class BtnClick {
public void openRobot(View view) {
OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_VOICE_PACKAGE_NAME, JxwPackageConfig.JXW_VOICE_CLASS_NAME);

View File

@@ -1,5 +1,15 @@
package com.uiui.zyos.activity.permission;
import android.content.Intent;
import android.graphics.Color;
import android.provider.Settings;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
@@ -49,8 +59,24 @@ public class PermissionActivity extends BaseMvvmActivity<PermissionViewModel, Ac
@Override
protected void initView() {
SpannableString spannableString = new SpannableString(getResources().getString(R.string.desktop_permission));
spannableString.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.BLUE); // 设置文本颜色
ds.setUnderlineText(false); // 设置下划线
}
@Override
public void onClick(@NonNull View widget) {
Intent intent = new Intent(Settings.ACTION_SETTINGS);
startActivity(intent);
}
}, 12, 14, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mViewDataBinding.tvNoti.setText(spannableString);
mViewDataBinding.tvNoti.setMovementMethod(LinkMovementMethod.getInstance()); // 设置移动方法以支持点击事件
}
@Override

View File

@@ -5,6 +5,10 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Bundle;
import android.provider.Settings;
import android.text.TextUtils;
@@ -161,8 +165,10 @@ public class UserFragment extends BaseMvvmFragment<UserViewModel, FragmentUserBi
setButtonVisibility();
String avatar = mMMKV.decodeString("USERINFO_AVATAR", "");
Glide.with(mViewDataBinding.ivAvatar).load(avatar).error(R.drawable.default_avatar).into(mViewDataBinding.ivAvatar);
initWifiState();
Glide.with(mViewDataBinding.ivAvatar).load(avatar).error(R.drawable.default_avatar).into(mViewDataBinding.ivAvatar);
mViewDataBinding.tvTime.setText(TimeUtils.getNowTimeInMinute());
mViewDataBinding.tvDate1.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
mViewDataBinding.tvDate2.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
mViewDataBinding.tvDate3.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
@@ -368,6 +374,8 @@ public class UserFragment extends BaseMvvmFragment<UserViewModel, FragmentUserBi
registerRefreshReceiver();
registerUpdateDesktopReceiver();
registerAppChangedReceiver();
registWiFiStatuReceiver();
registBateeryReceiver();
}
private void unregisterOwnReceiver() {
@@ -383,6 +391,12 @@ public class UserFragment extends BaseMvvmFragment<UserViewModel, FragmentUserBi
if (mAppChangedReceiver != null) {
mContext.unregisterReceiver(mAppChangedReceiver);
}
if (mWiFiStatuReceiver != null) {
mContext.unregisterReceiver(mWiFiStatuReceiver);
}
if (mPowerConnectReceiver != null) {
mContext.unregisterReceiver(mPowerConnectReceiver);
}
}
@@ -413,6 +427,7 @@ public class UserFragment extends BaseMvvmFragment<UserViewModel, FragmentUserBi
case Intent.ACTION_TIME_CHANGED:
case Intent.ACTION_TIMEZONE_CHANGED:
case Intent.ACTION_TIME_TICK:
mViewDataBinding.tvTime.setText(TimeUtils.getNowTimeInMinute());
mViewDataBinding.tvDate1.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
mViewDataBinding.tvDate2.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
mViewDataBinding.tvDate3.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
@@ -505,6 +520,123 @@ public class UserFragment extends BaseMvvmFragment<UserViewModel, FragmentUserBi
}
}
private WiFiStatuReceiver mWiFiStatuReceiver;
private void registWiFiStatuReceiver() {
if (mWiFiStatuReceiver != null) {
return;
}
mWiFiStatuReceiver = new WiFiStatuReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(NETWORK_STATE_CHANGE);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
mContext.registerReceiver(mWiFiStatuReceiver, filter);
}
private static final String NETWORK_STATE_CHANGE = "android.net.conn.CONNECTIVITY_CHANGE";
private class WiFiStatuReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d("fht", "action: " + action);
if (action.equals(NETWORK_STATE_CHANGE)) {
boolean isNetOK = isWifiConnect();
Log.d("fht", "网络状态发生变化,是否可用:" + isNetOK);
if (isNetOK) {
initWifiState();
} else {
mViewDataBinding.ivWifi.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_disconnect));
mViewDataBinding.tvWifiStatus.setText("未连接");
}
} else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
int wifistate = intent.getIntExtra(
WifiManager.EXTRA_WIFI_STATE,
WifiManager.WIFI_STATE_DISABLED);
if (wifistate == WifiManager.WIFI_STATE_DISABLED) {
mViewDataBinding.ivWifi.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_disconnect));
mViewDataBinding.tvWifiStatus.setText("未连接");
} else if (wifistate == WifiManager.WIFI_STATE_ENABLED) {
checkWifiState();
}
} else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
initWifiState();
}
}
}
public void initWifiState() {
ConnectivityManager manager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
Log.d("fht", "info.isConnected(): " + info.isConnected());
if (info.isConnected()) {
checkWifiState();
} else {
mViewDataBinding.ivWifi.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_disconnect));
mViewDataBinding.tvWifiStatus.setText("未连接");
}
}
public boolean isWifiConnect() {
ConnectivityManager connManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return mWifiInfo != null && mWifiInfo.isConnected();
}
public void checkWifiState() {
if (isWifiConnect()) {
mViewDataBinding.ivWifi.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_connect));
mViewDataBinding.tvWifiStatus.setText("已连接");
} else {
//无连接
Log.d("fht", "无wifi连接");
mViewDataBinding.ivWifi.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_disconnect));
mViewDataBinding.tvWifiStatus.setText("未连接");
}
}
/**
* 电池广播
*/
private void registBateeryReceiver() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
mContext.registerReceiver(mPowerConnectReceiver, intentFilter);
}
private PowerConnectReceiver mPowerConnectReceiver = new PowerConnectReceiver();
class PowerConnectReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.e("PowerConnectReceiver", "onReceive: " + action);
switch (action) {
case Intent.ACTION_BATTERY_CHANGED:
//你可以读到充电状态,如果在充电可以读到是usb还是交流电
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
//当前剩余电量
int level = intent.getIntExtra("level", 0);
//电量最大值
int scale = intent.getIntExtra("scale", 100);
//电量百分比
int batteryPer = (int) (level / (float) scale * 100);
mViewDataBinding.batteryView.setBatteryLevel(batteryPer, isCharging);
break;
default:
break;
}
}
}
public class BtnClick {
public void exit(View view) {
@@ -544,5 +676,8 @@ public class UserFragment extends BaseMvvmFragment<UserViewModel, FragmentUserBi
mViewModel.getHomework();
}
public void toWifi(View view){
mContext.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
}
}
}

View File

@@ -30,6 +30,7 @@ import com.uiui.zyos.network.UrlAddress;
import com.uiui.zyos.utils.ActivationUtil;
import com.uiui.zyos.utils.ApkUtils;
import com.uiui.zyos.utils.CXAESUtil;
import com.uiui.zyos.utils.TimeUtils;
import com.uiui.zyos.utils.Utils;
import java.lang.reflect.Type;
@@ -217,7 +218,17 @@ public class UserViewModel extends BaseViewModel<FragmentUserBinding, FragmentEv
public void onNext(@NonNull BaseResponse<ArrayList<HomeworkBean>> listBaseResponse) {
Log.e("getHomework", "onNext: " + listBaseResponse);
List<HomeworkBean> homeworkBeans = listBaseResponse.data;
mHomeworkBeanListData.setValue(homeworkBeans);
if (homeworkBeans != null) {
List<HomeworkBean> homeworkBeans2 = homeworkBeans.stream().filter(new Predicate<HomeworkBean>() {
@Override
public boolean test(HomeworkBean homeworkBean) {
return TimeUtils.isHomeworkToday(homeworkBean.getCreated_at());
}
}).collect(Collectors.toList());
mHomeworkBeanListData.setValue(homeworkBeans2);
} else {
mHomeworkBeanListData.setValue(homeworkBeans);
}
}
@Override

View File

@@ -4,12 +4,19 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import com.uiui.zyos.R;
import java.io.ByteArrayOutputStream;
public class BitmapUtils {
@@ -69,4 +76,54 @@ public class BitmapUtils {
return null;
}
}
public static Bitmap getbatteryIcon(Context context, Bitmap bitmap, int level, boolean charging) {
String st_level = String.valueOf(level);
int paddingLeft = 6;
int paddingRight = 8;
int paddingTop = 6;
int paddingBottom = 6;
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Bitmap background = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Bitmap bitmapScale = Bitmap.createScaledBitmap(bitmap, width, height, true);
Canvas canvas = new Canvas();
canvas.setBitmap(background);
Paint paint = new Paint();
if (charging) {
paint.setColor(context.getColor(R.color.default_text_color));
} else {
if (level <= 20) {
paint.setColor(Color.RED);
} else {
paint.setColor(context.getColor(R.color.default_text_color));
}
}
//设置画笔类型
paint.setStyle(Paint.Style.FILL);
//使用画笔在画布上画矩形
paint.setAntiAlias(true);
Rect mSrcRect = new Rect(0, 0, width, height);
canvas.drawBitmap(bitmapScale, mSrcRect, mSrcRect, null);
RectF rectF = new RectF(paddingLeft, paddingTop, (bitmap.getWidth() - paddingRight) * level / 100, bitmap.getHeight() - paddingBottom);// 设置个新的长方形
canvas.drawRoundRect(rectF, 3, 3, paint);
final float mDensity = context.getResources().getDisplayMetrics().density;
Rect rect = new Rect();
Paint mDatePaint = new Paint();
mDatePaint.setTypeface(Typeface.SANS_SERIF);
mDatePaint.setTextSize((int) 9F * mDensity);//文字大小
mDatePaint.setColor(Color.BLACK);
mDatePaint.setAntiAlias(true);
mDatePaint.getTextBounds(st_level, 0, st_level.length(), rect);
//通过文字获取矩形的面积
int width1 = rect.right - rect.left;
int height1 = rect.bottom - rect.top;
int width2 = background.getWidth();
int height2 = background.getHeight();
canvas.drawText(st_level, (width2 - width1) / 2 - rect.left, (height2 - height1) / 2 - rect.top, mDatePaint);
return background;
}
}

View File

@@ -91,6 +91,12 @@ public class TimeUtils {
return sdf.format(date);
}
public static String getNowTimeInMinute() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
Date date = new Date(System.currentTimeMillis());
return sdf.format(date);
}
public static String getHomeworkNowTime() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);

View File

@@ -0,0 +1,226 @@
package com.uiui.zyos.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.blankj.utilcode.util.ColorUtils;
import com.blankj.utilcode.util.ImageUtils;
import com.uiui.zyos.R;
import com.uiui.zyos.utils.ScreenUtils;
/**
* @CreateDate:
* @Author:lp
* @Description:
*/
public class BatteryView extends View {
private static final float OUTLINE_THICKNESS = 3.0f;//电池框厚度
private static final float CAP_WIDTH = 4.0f;//电池盖宽度
private static float CAP_HEIGHT;//电池盖高度
private static final float CAP_SPACE = 1.0f;//电池盖和电池的间隔
private static final float CAP_CORNER_RADIUS = 4;//电池盖矩形圆角
private static final float GAP_OF_SHAPE_BODY = 4.0f;//电池体与外框之间的间隙
private static final float ROUND_CORNER_RADIUS = 6;
private static final float TEXT_SIZE = 11f;
private int FLASH_WIDTH;//闪电的高度和宽度
private int FLASH_HEIGHT;
private float fullPowerWidth; //满电量时电池体的宽度。
private int mBatteryLevel = 20;
private boolean mCharging = false;
private Paint batteryBodyPainter;
private Paint batteryHeadPainter;
private Paint mPowerPaint;//电量画笔
private Paint backgroundPaint;//白色背景
private Paint mTextPaint;//文字
private RectF outlineRect;//电池矩形
private RectF mCapRect;//电池盖矩形
private RectF batteryRect;//电量矩形
private RectF backgroundRect;//背景矩形
private Rect mTextRect;//文字
private int left;
private int top;
public BatteryView(Context context) {
this(context, null);
}
public BatteryView(Context context, AttributeSet attrs) {
super(context, attrs);
//电池外框
batteryBodyPainter = new Paint();
batteryBodyPainter.setColor(ColorUtils.getColor(R.color.battery_box));
batteryBodyPainter.setAntiAlias(true);
batteryBodyPainter.setStyle(Paint.Style.STROKE);
batteryBodyPainter.setStrokeWidth(OUTLINE_THICKNESS);
//电池盖
batteryHeadPainter = new Paint();
batteryHeadPainter.setColor(ColorUtils.getColor(R.color.battery_box));
batteryHeadPainter.setAntiAlias(true);
batteryHeadPainter.setStyle(Paint.Style.FILL);
//电量
mPowerPaint = new Paint();
mPowerPaint.setAntiAlias(true);
mPowerPaint.setColor(ColorUtils.getColor(R.color.battery_normal_power));
mPowerPaint.setStyle(Paint.Style.FILL);
backgroundPaint = new Paint();
backgroundPaint.setAntiAlias(true);
backgroundPaint.setColor(ColorUtils.getColor(R.color.battery_background));
backgroundPaint.setStyle(Paint.Style.FILL);
mTextPaint = new Paint();
mTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
mTextPaint.setTextSize(dip2px(context, TEXT_SIZE));//文字大小
mTextPaint.setColor(ColorUtils.getColor(R.color.battery_text));
mTextPaint.setAntiAlias(true);
outlineRect = new RectF();
outlineRect.left = OUTLINE_THICKNESS;
outlineRect.top = OUTLINE_THICKNESS;
mCapRect = new RectF();
batteryRect = new RectF();
backgroundRect = new RectF();
mTextRect = new Rect();
}
public void setBatteryLevel(int battery, boolean isChanrging) {
this.mBatteryLevel = battery > 100 ? 100 : Math.max(battery, 1);
// this.mBatteryLevel = battery;
this.mCharging = isChanrging;
requestLayout();
}
public int getBatteryLevel() {
return mBatteryLevel;
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int specWidthSize = MeasureSpec.getSize(widthMeasureSpec);//宽
int specHeightSize = MeasureSpec.getSize(heightMeasureSpec);//高
Log.e("onMeasure", "specWidthSize: " + specWidthSize);
Log.e("onMeasure", "specHeightSize: " + specHeightSize);
Log.e("dip2px", "onMeasure: " + ScreenUtils.dip2px(mContext, OUTLINE_THICKNESS));
FLASH_HEIGHT = (int) (specHeightSize - OUTLINE_THICKNESS * 2);
FLASH_WIDTH = FLASH_HEIGHT;
outlineRect.left = OUTLINE_THICKNESS + FLASH_WIDTH;
//设置电池外框
outlineRect.right = specWidthSize - OUTLINE_THICKNESS - CAP_SPACE - CAP_WIDTH;
outlineRect.bottom = specHeightSize - OUTLINE_THICKNESS;
Log.e("onMeasure", "outlineRect.right: " + outlineRect.right);
Log.e("onMeasure", "outlineRect.bottom: " + outlineRect.bottom);
backgroundRect.left = outlineRect.left;
backgroundRect.top = outlineRect.top;
backgroundRect.bottom = outlineRect.bottom;
backgroundRect.right = outlineRect.right;
Log.e("onMeasure", "backgroundRect.left : " + backgroundRect.left);
Log.e("onMeasure", "backgroundRect.top : " + backgroundRect.top);
Log.e("onMeasure", "backgroundRect.bottom : " + backgroundRect.bottom);
Log.e("onMeasure", "backgroundRect.right : " + backgroundRect.right);
//设置电池盖矩形
CAP_HEIGHT = specHeightSize / 2;
mCapRect.left = outlineRect.right + OUTLINE_THICKNESS + CAP_SPACE;
mCapRect.top = (float) specHeightSize / 2 - CAP_HEIGHT / 2;
mCapRect.right = specWidthSize;
mCapRect.bottom = (float) specHeightSize / 2 + CAP_HEIGHT / 2;
Log.e("onMeasure", "mCapRect.left: " + mCapRect.left);
Log.e("onMeasure", "mCapRect.top: " + mCapRect.top);
Log.e("onMeasure", "mCapRect.right: " + mCapRect.right);
Log.e("onMeasure", "mCapRect.bottom: " + mCapRect.bottom);
//设置电池体
batteryRect.left = outlineRect.left + GAP_OF_SHAPE_BODY;
batteryRect.top = outlineRect.top + GAP_OF_SHAPE_BODY;
batteryRect.bottom = outlineRect.bottom - GAP_OF_SHAPE_BODY;
Log.e("onMeasure", "batteryRect.left: " + batteryRect.left);
Log.e("onMeasure", "batteryRect.top: " + batteryRect.top);
Log.e("onMeasure", "batteryRect.bottom: " + batteryRect.bottom);
//闪电位置
left = (int) (specWidthSize / 2 - OUTLINE_THICKNESS * 2);
top = (int) (specHeightSize / 2 - OUTLINE_THICKNESS * 2);
fullPowerWidth = outlineRect.right - GAP_OF_SHAPE_BODY - batteryRect.left;
setMeasuredDimension(specWidthSize, specHeightSize);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
batteryRect.right = (float) mBatteryLevel / 100 * fullPowerWidth + batteryRect.left;
Log.e("onMeasure", "batteryRect.right : " + batteryRect.right);
if (mCharging) {
mPowerPaint.setColor(ColorUtils.getColor(R.color.battery_charing));
} else {
if (mBatteryLevel <= 20) {
mPowerPaint.setColor(ColorUtils.getColor(R.color.battery_low_power));
} else {
mPowerPaint.setColor(ColorUtils.getColor(R.color.battery_normal_power));
}
}
canvas.drawRoundRect(backgroundRect, ROUND_CORNER_RADIUS, ROUND_CORNER_RADIUS, backgroundPaint);
canvas.drawRoundRect(outlineRect, ROUND_CORNER_RADIUS, ROUND_CORNER_RADIUS, batteryBodyPainter);
canvas.drawRoundRect(mCapRect, CAP_CORNER_RADIUS, CAP_CORNER_RADIUS, batteryHeadPainter);
canvas.drawRoundRect(batteryRect, ROUND_CORNER_RADIUS - 1, ROUND_CORNER_RADIUS - 1, mPowerPaint);
String level = String.valueOf(mBatteryLevel);
mTextPaint.getTextBounds(level, 0, level.length(), mTextRect);
Log.e("onMeasure", "mTextRect.right : " + mTextRect.right);
Log.e("onMeasure", "mTextRect.left : " + mTextRect.left);
Log.e("onMeasure", "mTextRect.top : " + mTextRect.top);
Log.e("onMeasure", "mTextRect.bottom : " + mTextRect.bottom);
int width1 = mTextRect.width();
int height1 = mTextRect.height();
Log.e("onMeasure", "width1 : " + width1);
Log.e("onMeasure", "height1 : " + height1);
// canvas.drawText(level, (batteryRect.right - batteryRect.left - width1) - mTextRect.left, (batteryRect.bottom - batteryRect.top - height1) - mTextRect.top, mTextPaint);
canvas.drawText(level, backgroundRect.left + (backgroundRect.width() - width1 - OUTLINE_THICKNESS) / 2, backgroundRect.bottom - (backgroundRect.height() - height1 + OUTLINE_THICKNESS) / 2, mTextPaint);
if (mCharging) {
Bitmap bitmap = ImageUtils.getBitmap(R.drawable.ic_battery_charging);
Bitmap bitmapScale = Bitmap.createScaledBitmap(bitmap, FLASH_WIDTH, FLASH_HEIGHT, true);
canvas.drawBitmap(bitmapScale, 0, (CAP_HEIGHT * 2 - FLASH_HEIGHT) / 2, null);
}
}
}