AndroidQ(10.0) 手机锁屏炫酷充电动画————lottie方案

简介: AndroidQ(10.0) 手机锁屏炫酷充电动画————lottie方案

效果图


0YaNVO.gif


知识储备


1、Lottie动画使用指南


Lottie开源动画库介绍与使用示例

Android Lottie动画初探

Lottie动画免费下载网站


2、SystemUI 中引入AAR库编译


因为在源码中加载aar或者jar包编译坑太多,我们先在 AS 中通过本地aar方式成功运行项目后,


排除各种依赖库报错问题再移植到 SystemUI 中进行编译,Android.bp 文件中引入aar、jar、so库正确编译方法(值得收藏)


以下是我整理的 lottie 依赖资源


lottie和html充电动画相关资源.zip


lottie-3.4.3.aar


okio-2.1.0.jar


kotlin-stdlib-1.2.60.jar


runing.json


这里使用的是 3.4.3 版本的lottie库,低版本的库加载有的json动画文件时会报错


依赖库可以去这个网站查找并下载 MvnJar


具体实现


1、将json动画文件拷贝至assets文件夹


2、在根目录下新建libs文件夹,将aar和jar拷贝至libs中,并在libs中


新建 Android.bp 文件


android_library_import {
    name: "lib-lottie",
    aars: ["lottie-3.4.3.aar"],
    sdk_version: "current",
}
java_import {
    name: "okio-jar",
    jars: ["okio-2.1.0.jar"],
    sdk_version: "current",
}
java_import {
    name: "okio-kotlin-jar",
    jars: ["kotlin-stdlib-1.2.60.jar"],
    sdk_version: "current",
}

3、在根目录下的Android.bp 中引入aar库

android_library {
    name: "MtkSystemUI-core",
    srcs: [
        "src/**/*.kt",
        "src/**/*.java",
        "src/**/I*.aidl",
    ],
    resource_dirs: [
        "res-keyguard",
        "res",
        "res-keyguard_ext",
        "res_ext",
    ],
    static_libs: [
        "okio-kotlin-jar",
        "okio-jar",
        "lib-lottie",
        "MtkSystemUIPluginLib",
        "MtkSystemUISharedLib",
        "SettingsLib",
     .....


4、新建 layout_lottie_charg.xml 布局文件


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent">
    <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/lottieAnimationView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:lottie_autoPlay="true"/>
    <TextView
        android:id="@+id/tv_battery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="150dp"
        android:layout_centerHorizontal="true"
        android:text="40%"
        android:textSize="35dp"/>
</RelativeLayout>

5、新建 LottieActivity.java 文件


package com.android.systemui.power;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
import com.airbnb.lottie.LottieAnimationView;
import com.android.systemui.R;
/**
 * Created by cczheng on 2020/9/29.
 */
public class LottieActivity extends Activity {
    private TextView tv_battery;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_lottie_charg);
        LottieAnimationView animationView = findViewById(R.id.lottieAnimationView);
        tv_battery = findViewById(R.id.tv_battery);
        animationView.addAnimatorUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
            }
        });
        animationView.setImageAssetsFolder("assets/");
        animationView.setAnimation("runing.json");
        animationView.loop(true);
        animationView.playAnimation();
        mHandler.sendEmptyMessage(MSG_BATTERY);
        registerReceiver();
    }
    private void registerReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
        registerReceiver(receiver, filter);
    }
    private void closeAnim(){
        mHandler.removeMessages(MSG_BATTERY);
        finish();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (Intent.ACTION_POWER_DISCONNECTED.equals(action)){
                closeAnim();
            }
        }
    };
    private int MSG_BATTERY = 100;
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == MSG_BATTERY){
                int batteryLevel = getBatteryLevel();
                tv_battery.setText(batteryLevel +"%");
                mHandler.sendEmptyMessageDelayed(MSG_BATTERY, 15000);
            }
        }
    };
    private int getBatteryLevel() {
        BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
        return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
    }
}

优化体验


因为本文章只是提供充电动画思路,细节考虑不到位,采用Activity方式加载layout,切换时会有明显拉起动画

可以通过Window addView 方式将 layout 添加到SystemUI中,有需求的可自己去实现

判断是否是锁屏状态

KeyguardManager mKeyguardManager =
 (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
boolean lockState = mKeyguardManager.inKeyguardRestrictedInputMode();
if (lockState ) {
    //锁屏
} else {
    //未锁屏
}

监听充电连接与断开广播

Intent.ACTION_POWER_CONNECTED:充电连接广播

Intent.ACTION_POWER_DISCONNECTED:充电断开广播


参考文章


手机锁屏充电动画

目录
相关文章
|
6月前
|
安全
手机充电器的兼容性
手机充电器的兼容性主要取决于两个方面:充电器的输出规格和手机的输入规格。
|
18天前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
17 1
|
2月前
|
vr&ar 图形学 UED
电子沙盘VR模型大屏平板手机微信使用方案
数字孪生电子沙盘和VR模型被广泛应用在房地产等行业,为不同设备定制不同版本的模型是常见做法。然而,通过实时云渲染技术,可以将PC端的VR模型转化为网页版,使用户能够在平板或手机上流畅浏览详细信息,无需开发多个版本。这不仅提升了用户体验,还简化了模型提供商的工作流程,降低了成本。尤其在新楼盘发布时,可通过公众号或广告链接快速吸引潜在客户。成本主要取决于并发用户数及显卡性能要求,但该技术显著提高了跨设备访问的便利性。
50 1
|
3月前
|
存储 JavaScript 前端开发
看过来!准确直观显示手机充电信息的充电统计软件!
基于自制充电统计App,多设备用户可远程查看各设备充电数据。在软件内可以查看预估充电容量等信息
|
5月前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
109 5
|
6月前
|
运维 安全 Android开发
手机与电脑投屏互联方案
手机与电脑投屏互联方案
185 7
|
6月前
|
XML Java Android开发
Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)
Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)
377 0
|
6月前
|
XML Java Android开发
Android App开发手机阅读中贝塞尔曲线的原理讲解及实现波浪起伏动画实战(附源码和演示视频 可直接使用)
Android App开发手机阅读中贝塞尔曲线的原理讲解及实现波浪起伏动画实战(附源码和演示视频 可直接使用)
124 0
|
6月前
|
XML Java Android开发
Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)
Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)
76 0
|
6月前
手机充电器散热对其充电能效转换的影响
手机充电器散热会对其充电能效产生一定影响。散热不好的充电器,在工作过程中会产生更多的热量,如果不能及时散热,就会导致充电器温度升高。温度升高会造成能量的损失,从而导致充电能效降低。