文件路径:frameworks\base\services\core\java\com\android\server\power\ShutdownThread.java

在beginShutdownSequence()方法中:

 private static void beginShutdownSequence(Context context) {
...... // throw up an indeterminate system dialog to indicate radio is
// shutting down.
//*********************** 系统默认的Dialog ***********************
/*ProgressDialog pd = new ProgressDialog(context);
pd.setTitle(context.getText(com.android.internal.R.string.power_off));
pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
pd.show();*/
//*********************** 替换为自定义的全屏Dialog ***********************
Point outSize = new Point();
Dialog dialog = new Dialog(context, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
IndeterminateProgressBar view = new IndeterminateProgressBar(context);
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
dialog.getWindow().getWindowManager().getDefaultDisplay().getSize(outSize); //获取屏幕宽高
dialog.setContentView(view, new LayoutParams(outSize.x, outSize.y)); //设置自定义view宽高为全屏
dialog.show(); ......
}
 
注意:必须要设置 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 之前忘了加导致什么都不显示
 
替换的自定义View:
 
 class IndeterminateProgressBar extends View {
static final String TAG = "ProgressBar";
private int delayMillis = 30;
private Handler mHandler;
private ArrayList<Entity> entities;
private int width = 0;
// private int height = 0;
private int r = 15;
private int shift = 20;
private int radius = 3;
private int color = Color.WHITE;
private long time = 0;
private boolean started = false;
public IndeterminateProgressBar(Context context) {
super(context);
init();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
width = getLayoutParams().width / 2;
// height = getLayoutParams().height;
if (width > 0) {
radius = width / 20;
r = 2 * width / 5;
//shift = width / 2;
shift = width / 1;
}
}
private void init() {
setBackgroundResource(android.R.color.transparent);
mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
for (Entity e : entities) {
e.update();
}
invalidate();
mHandler.sendEmptyMessageDelayed(0, delayMillis);
time += delayMillis;
return false;
}
});
}
public void setColor(int color) {
this.color = color;
}
public void stop() {
mHandler.removeMessages(0);
started = false;
invalidate();
}
public boolean isStart() {
return started;
}
public void start() {
if (started)
return;
started = true;
time = 0;
entities = new ArrayList<IndeterminateProgressBar.Entity>();
float s = .25f;
entities.add(new Entity(0, color, 0));
entities.add(new Entity(1 * s, color, delayMillis * 4));
entities.add(new Entity(2 * s, color, delayMillis * 8));
entities.add(new Entity(3 * s, color, delayMillis * 12));
entities.add(new Entity(4 * s, color, delayMillis * 16));
// entities.add(new Entity(5 * s, color, delayMillis * 20));
if (mHandler != null)
mHandler.sendEmptyMessage(0);
}
@Override
protected void onDraw(Canvas canvas) {
if (entities != null && entities.size() > 0) {
for (Entity e : entities) {
e.draw(canvas);
}
}
super.onDraw(canvas);
}
class Entity {
private float x;
private float y;
private int color;
private Paint paint;
private double sp = 0;
private long delay;
private int sec = 0;
private float pec = 0;
boolean visiable = true;
public float getInterpolation(float input) {
return (float) (Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}
public Entity(float sp, int color, int delay) {
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
this.color = color;
this.sp = sp;
this.delay = delay;
paint.setColor(this.color);
}
public void update() {
if (time < delay)
return;
visiable = true;
pec += 0.03;
if (pec > 1) {
pec = 0;
sec = ++sec == 3 ? 0 : sec;
delay = sec == 0 ? time + delayMillis * 22 : time + delayMillis
* 3;
visiable = sec == 0 ? false : true;
}
double θ = Math.PI
* .5
+ (sec == 0 ? 0 : sec * Math.PI / sec)
- (sec == 0 ? 0 : sp)
+ (Math.PI * (sec == 1 ? 2 : 1) - (sec == 0 ? sp : 0) + (sec == 2 ? sp
: 0)) * getInterpolation(pec);
x = (float) (r / 2 * Math.cos(θ)) + shift / 2;
y = (float) (r / 2 * Math.sin(θ)) + shift / 2;
}
public void draw(Canvas canvas) {
if (!visiable || x == 0 || y == 0)
return;
canvas.save();
canvas.translate(x, y);
canvas.drawCircle(x, y, radius, paint);
canvas.restore();
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (getVisibility() == View.VISIBLE) {
start();
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
stop();
}
public void setDelayMillis(int delayMillis) {
this.delayMillis = delayMillis;
}
}

效果图:

修改Android系统关机动画的更多相关文章

  1. 修改android系统开机动画

    本文转载自:http://blog.csdn.net/u012301841/article/details/51598115 修改android系统开机动画

  2. 修改Android系统属性SystemProperties.set("sys.powerctl", "shutdown")关机分析

    简介: 从之前的博文中我们提到过,关机流程中最后是通过修改Android属性进行关机操作(SystemProperties.java通过JNI调用访问系统属性),当然我们也可以通过adb命令修改And ...

  3. Windows在生产体系Android开关机动画

    在Windows根据系统.办Android开关机动画,几个需要注意的问题: 1.压缩的选择 2.压缩的格式: 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  4. Android系统关机或重启的几种实现方式

    前阵子工作上遇到一些关于Android系统关机或重启的系统修改,于是,做了一些尝试,也搜集了一下资料,现在整理一下,做一些总结,方便学习或者日后工作的需要. 默认的SDK并没有提供应用开发者直接的An ...

  5. 修改Android系统字号(二)

    /*********************************************************************** * 修改Android系统字号(二) * 说明: * ...

  6. 修改Android系统字号(一)

    /*********************************************************************** * 修改Android系统字号(一) * 说明: * ...

  7. Android系统关机或几种方式重启

    ---------------------------------------------------------------------------------------------------- ...

  8. Android源码分析(九)-----如何修改Android系统默认时间

    一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARL ...

  9. 修改Android系统的触摸提示音【学习笔记】

    平台信息:内核:Linux version 3.10.0系统:android/android6.0平台:rk3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 本 ...

随机推荐

  1. luogu2948 滑雪课

    题解里面全是dp的大神本蒟蒻瑟瑟发抖奉上一篇记忆化搜索... 其实嘛,记忆化搜索还是很安全透彻清真人品的,一般递推不好实现dp可以用记忆化搜索 然后本题先预处理一个mint[i]代表当前能力值为i,参 ...

  2. C语言预处理命令之文件包含

    文件包含预处理命令的一般形式是: #include<文件名> 或者 #include“文件名” #include命令告诉预处理器用指定文件的内容替换这条命令,两种不同的命令格式决定了预处理 ...

  3. Navicat12破解

    Navicat12破解 http://www.sdbeta.com/xiazai/2017/0818/209765.html

  4. Margarite and the best present

    Little girl Margarita is a big fan of competitive programming. She especially loves problems about a ...

  5. NFS网络储存系统

    为什么用NFS网络文件存储系统? 1)实现数据信息统一一致 2)节省局域网数据同步传输的带宽 3)节省网站架构中服务器硬盘资源 NFS系统存储原理介绍 RPC服务类似一个中介服务,NFS服务端与NFS ...

  6. docker(5)常用命令

    1.docker docker安装国内源 $ sudo yum-config-manager \ --add-repo \ https://mirrors.ustc.edu.cn/docker-ce/ ...

  7. Day04 流程控制 while 和for循环

    一.流程控制 if 判断 python中使用缩进来区分代码块的 语法 一: #python if 条件: 代码块1 代码块2 自上而下依次运行 语法二: # python if 条件一: 代码一 el ...

  8. runlevel:启动运行级别(3-13)

    0:halt 关机模式1:single user 单用户2:Multiuser 多用户3:Full multiuser mode 命令行模式4:unused 没有使用5:Xll 桌面模式6:reboo ...

  9. Dockerfile的书写规则和指令的使用方法

    Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命 ...

  10. Golang常用数据结构(对照python)

    python golang init get set extend/update find index size loop list list l := list.New()   l.PushBack ...