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:充电断开广播


参考文章


手机锁屏充电动画

目录
相关文章
|
13天前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
58 5
|
2月前
|
运维 安全 Android开发
手机与电脑投屏互联方案
手机与电脑投屏互联方案
62 7
|
2月前
|
XML Java Android开发
Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)
Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)
153 0
|
2月前
|
XML Java Android开发
Android App开发手机阅读中贝塞尔曲线的原理讲解及实现波浪起伏动画实战(附源码和演示视频 可直接使用)
Android App开发手机阅读中贝塞尔曲线的原理讲解及实现波浪起伏动画实战(附源码和演示视频 可直接使用)
70 0
|
2月前
|
XML Java Android开发
Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)
Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)
46 0
|
2月前
手机充电器散热对其充电能效转换的影响
手机充电器散热会对其充电能效产生一定影响。散热不好的充电器,在工作过程中会产生更多的热量,如果不能及时散热,就会导致充电器温度升高。温度升高会造成能量的损失,从而导致充电能效降低。
|
2月前
手机充电器散热对其充电能效的影响
手机充电器散热对其充电能效的影响
|
10月前
|
存储 编解码 监控
变废为宝:使用废旧手机实现实时监控方案
随着手机淘汰的速度越来越快,大多数手机功能性能很强劲就不再使用了,以大牛直播SDK现有方案为例,本文探讨下,如何用废旧手机实现实时监控方案(把手机当摄像头做监控之用): 本方案需要准备一个手机作为采集手机(要求摄像头完好就行),采集到的数据,编码,然后推送到服务器,本地也可以实时录像,其他终端,作为远程监控端设备,拉取采集手机的实时音视频即可。
238 0
|
11月前
|
前端开发
【CSS动画03--伸缩式导航栏/手机原子组件】
【CSS动画03--伸缩式导航栏/手机原子组件】
|
Android开发
Android11.0(R) 手机锁屏炫酷充电动画————自定义View方案
Android11.0(R) 手机锁屏炫酷充电动画————自定义View方案
269 0