网站分析对比,wordpress获取表前缀,制作公司内部网站,北京大型商场目录
#x1f4c2; 前言
AR 眼镜系统版本
充电动画
1. #x1f531; 技术方案
1.1 方案介绍
1.2 实现方案
关机充电动画
亮屏/锁屏充电动画
2. #x1f4a0; 关机充电动画
2.1 关机充电动画核心处理类与路径
2.2 实现细节
步骤一#xff1a;1#xff09;定制 …
目录 前言
AR 眼镜系统版本
充电动画
1. 技术方案
1.1 方案介绍
1.2 实现方案
关机充电动画
亮屏/锁屏充电动画
2. 关机充电动画
2.1 关机充电动画核心处理类与路径
2.2 实现细节
步骤一1定制 ui.c 文件适配分辨率
步骤一2定制 ui.c 文件定制动画 UI
步骤二新增定制的动画 UI 相关png图片
3. ⚛️ 亮屏/锁屏充电动画
3.1 亮屏/锁屏充电动画时序图
3.2 实现细节
步骤一注册广播 Action 监听充电接通/断开/充满电等状态
步骤二开发充电接通/断开/充满电的系统弹窗显示对应动画
4. ✅ 小结 前言
AR 眼镜系统版本 W517 Android9。
充电动画 Android 充电动画分为关机充电动画 与 亮屏/锁屏充电动画而且据了解 Android 原生系统只提供了关机充电动画并未提供亮屏/锁屏充电动画所以对于关机情况下需要定制亮屏/锁屏情况下需要增加。 1. 技术方案
1.1 方案介绍 技术方案概述对于关机充电动画是通过 minui 开发的主要定制 ui.c 文件以及 /images/*.png 图片对于亮屏/锁屏充电动画主要通过监听系统充电连接、断开和充满电的广播去实现。
1.2 实现方案
关机充电动画 定制 ui.c 文件适配分辨率定制动画 UI 新增定制的动画 UI 相关png图片。
亮屏/锁屏充电动画 注册 ACTION_POWER_CONNECTED、ACTION_POWER_DISCONNECTED、ACTION_BATTERY_OKAY 等广播 Action 监听充电接通/断开/充满电等状态 开发充电接通/断开/充满电的系统弹窗显示对应动画。 2. 关机充电动画
2.1 关机充电动画核心处理类与路径 关机充电动画 UI 处理类w517\vendor\sprd\proprietories-source\charge\ui.c 关机充电动画图片存放路径w517\vendor\sprd\proprietories-source\charge\images\ AR 眼镜上的充电动画图片存放路径/vendor/etc/res/images/
2.2 实现细节
步骤一1定制 ui.c 文件适配分辨率 步骤一2定制 ui.c 文件定制动画 UI 步骤二新增定制的动画 UI 相关png图片 3. ⚛️ 亮屏/锁屏充电动画
3.1 亮屏/锁屏充电动画时序图 3.2 实现细节
步骤一注册广播 Action 监听充电接通/断开/充满电等状态
class BatteryListener(context: Context) {private val TAG BatteryListener::class.java.simpleNameprivate val mContext: Contextprivate val mReceiver: BatteryBroadcastReceiverprivate val mBatteryChargeWindow: BatteryChargeWindowinit {mContext contextmReceiver BatteryBroadcastReceiver()mBatteryChargeWindow BatteryChargeWindow()}fun register() {Log.e(TAG, register: )val filter IntentFilter()
// filter.addAction(Intent.ACTION_BATTERY_CHANGED) // 电量发生改变filter.addAction(Intent.ACTION_BATTERY_LOW) // 电量低filter.addAction(Intent.ACTION_BATTERY_OKAY) // 电量充满filter.addAction(Intent.ACTION_POWER_CONNECTED) // 接通电源filter.addAction(Intent.ACTION_POWER_DISCONNECTED) // 拔出电源mContext.registerReceiver(mReceiver, filter)mBatteryChargeWindow.init(mContext)}fun unregister() {Log.e(TAG, unregister: )mContext.unregisterReceiver(mReceiver)}private inner class BatteryBroadcastReceiver : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {Log.e(TAG, onReceive: ${intent.action})when (intent.action) {
// Intent.ACTION_BATTERY_CHANGED - {
//
// }Intent.ACTION_BATTERY_LOW - {}Intent.ACTION_BATTERY_OKAY - {mBatteryChargeWindow.finishCharge()}Intent.ACTION_POWER_CONNECTED - {SoundPoolTools.play(context, SoundPoolTools.MUSIC, R.raw.notification_power_connected)mBatteryChargeWindow.startCharge()}Intent.ACTION_POWER_DISCONNECTED - {}}}}}
步骤二开发充电接通/断开/充满电的系统弹窗显示对应动画
class BatteryChargeWindow {private lateinit var mContext: Contextprivate lateinit var mWindowManager: WindowManagerprivate lateinit var mBatteryChargeView: Viewprivate lateinit var mChargingAnimation: LottieAnimationViewprivate lateinit var mFinishedChargingAnimation: LottieAnimationViewprivate lateinit var mBattery: AGGTextViewprivate var mLayoutParams: WindowManager.LayoutParams? nullprivate var mIsBarWindowAdded falseprivate val mUiHandler Handler(Looper.getMainLooper())fun init(context: Context) {mContext context.applicationContextmWindowManager context.getSystemService(Context.WINDOW_SERVICE) as WindowManagerinitLayoutParams()initView()}fun startCharge() {initLayoutParams()addBarWindow()mChargingAnimation.visibility View.VISIBLEmChargingAnimation.playAnimation()mBattery.text getBatteryLevel()mUiHandler.postDelayed({mChargingAnimation.cancelAnimation()mChargingAnimation.visibility View.GONEremoveBarWindow()}, BATTERY_CHARGE_TIME_OUT)}SuppressLint(SetTextI18n)fun finishCharge() {initLayoutParams()addBarWindow()mFinishedChargingAnimation.visibility View.VISIBLEmFinishedChargingAnimation.playAnimation()mBattery.text 100%mUiHandler.postDelayed({mFinishedChargingAnimation.cancelAnimation()mFinishedChargingAnimation.visibility View.GONEremoveBarWindow()}, BATTERY_CHARGE_TIME_OUT)}private fun initLayoutParams() {mLayoutParams WindowManager.LayoutParams().apply {type WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANELval density mContext.resources.displayMetrics.densitywidth (640 * density).toInt()height (640 * density).toInt()flags WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITSformat PixelFormat.RGBA_8888 // 去除默认时有的黑色背景设置为全透明gravity Gravity.CENTERtitle Constants.AGG_SYSUI_BATTERY_CHARGEx 0y 0dofIndex 1 // 默认为1。 为0则表示窗口为0DOF模式为1则表示窗口为3DOF模式为2则表示窗口为6DOF模式。setTranslationZ(Constants.TRANSLATION_Z_150CM)setRotationXAroundOrigin(-XrEnvironment.getInstance().headPose.roll)setRotationYAroundOrigin(-XrEnvironment.getInstance().headPose.yaw)setRotationZAroundOrigin(-XrEnvironment.getInstance().headPose.pitch)}}private fun initView() {mBatteryChargeView LayoutInflater.from(mContext).inflate(R.layout.battery_charge_layout, null, false)mChargingAnimation mBatteryChargeView.findViewById(R.id.charging)mFinishedChargingAnimation mBatteryChargeView.findViewById(R.id.finishedCharging)mBattery mBatteryChargeView.findViewById(R.id.battery)}private fun addBarWindow() {mUiHandler.post {synchronized(this) {if (!mIsBarWindowAdded) {try {mWindowManager.addView(mBatteryChargeView, mLayoutParams)} catch (e: Exception) {e.printStackTrace()}mIsBarWindowAdded true}}}}private fun removeBarWindow() {mUiHandler.post {synchronized(this) {if (mIsBarWindowAdded) {try {mWindowManager.removeViewImmediate(mBatteryChargeView)} catch (e: Exception) {e.printStackTrace()}mIsBarWindowAdded false}}}}/*** 获取剩余电池容量占总容量的整数百分比*/private fun getBatteryLevel(): String {val batteryManager mContext.getSystemService(BATTERY_SERVICE) as BatteryManagerreturn batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY).toString() %}} 4. ✅ 小结 对于充电动画定制本文只是一个基础实现方案更多业务细节请参考产品逻辑去实现。 另外由于本人能力有限如有错误敬请批评指正谢谢。