文件路径: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. Opencv图像连通域

    [摘要] 本文介绍在图像处理领域中较为常用的一种图像区域(Blob)提取的方法——连通性分析法(连通区域标记法). 文中介绍了两种常见的连通性分析的算法:1)Two-pass:2)Seed-Filli ...

  2. Java实现微信小程序支付(准备)

    Java语言开发微信小程序支付功能: 1.通过https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1路径到官方下载Java的支付SD ...

  3. Spring Security获取已登录的用户信息的两种方法

    第一种是直接从session中手动拿: @RequestMapping(value = "/user", method = RequestMethod.GET)public Res ...

  4. POJ1054 The Troublesome Frog

    题目来源:http://poj.org/problem?id=1054 题目大意: 有一种青蛙在晚上经过一片稻田,在庄稼上跳跃,会把庄稼压弯.这让农民很苦恼.我们希望通过分析青蛙跳跃的路径,找出对稻田 ...

  5. 树莓派编译安装 EMQ 服务器

    前言 EMQ 是一款开源的物联网 MQTT 消息服务器,使用 Erlang/OTP 语言平台设计,在 DIY 智能家居时可以作为网关,前几天摸索了一下在树莓派中安装 EMQ 的方法,记录一下. 步骤 ...

  6. AngularJs 中使用OpenLayer例子,手机端地图加载不显示问题

      var map, toolip, overlay;            var layer = new ol.layer.Vector();            var imgLayer = ...

  7. python3 杂记

    python3 杂记 test001 --test001.py       ( from test2.test002 import * def test1(): print('1') if __nam ...

  8. uva 442

    #include<iostream>#include<stack>#include<map>using namespace std;struct node{ int ...

  9. 第五章:引用类型(一)-Object和Array

    引用类型 引用类型的值(对象)是引用类型的一个实例 引用类型是一种数据结构,用于将数据与功能组织在一起 也常被称为类, Object 对象的两种创建方式 使用new操作符 对象字面量表示法 Array ...

  10. java——并查集 UnionFind

    时间复杂度: O(log*n),近乎是O(1)级别的 UnionFind 接口: public interface UF { int getSize(); boolean isConnected(in ...