Android 修改系统关机动画的实现

在Android 系统移植做自己的移动设备,肯定会遇到更改开机或者关机画面,配置自己产品logo 这点是必须的,这些都要在源码中修改,然后编译,下面给大家介绍个关机动画修改,一个简单示例!

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

在beginShutdownSequence()方法中:

private static void beginShutdownSequence(Context context) {
  ...... 3   // 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;
    }
}

效果图:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android中关于递归和二分法的算法实例代码

    // 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public static void main(String[] args) { int[] arr={1,2,5,9,11,45}; int index=findIndext(arr,0,arr.length-1,12); System.out.println("index="+index); } // 1

  • Android仿斗鱼直播的弹幕效果

    记得之前有位朋友在我的公众号里问过我,像直播的那种弹幕功能该如何实现?如今直播行业确实是非常火爆啊,大大小小的公司都要涉足一下直播的领域,用斗鱼的话来讲,现在就是千播之战.而弹幕则无疑是直播功能当中最为重要的一个功能之一,那么今天,我就带着大家一起来实现一个简单的Android端弹幕效果. 分析 首先我们来看一下斗鱼上的弹幕效果,如下图所示: 这是一个Dota2游戏直播的界面,我们可以看到,在游戏界面的上方有很多的弹幕,看直播的观众们就是在这里进行讨论的. 那么这样的一个界面该如何实现呢?其实并

  • Android 矩阵ColorMatrix

    中文名:坐标矩阵 高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matrix由9个float值构成,是一个3*3的矩阵.最好记住.如下图 各个字段的含义: 上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的. translateX和translateY表示x和y的平移量.scale是缩放的比例,1是不变,2是表示缩放1/2,这样子. 如何使用 set,pre,post方法 Matrix调用一系列set

  • Android中转场动画的实现与兼容性处理

    前言 在 Android 5.0 之前,我们已经有了 overridePendingTransition() 方法来实现一些转场效果.然而,在 Android 5.0 以后,转场效果更加炫酷. 比如下面的动画: 一.Android L 中的转场动画 实现转场动画只需三步: 在 res/ 目录下创建 transition 文件夹,在该文件夹下定义界面转场动画和共享元素的动画. 在 res/value/style 文件中为每个 Activity 指定转场动画的 style ,并在 AndroidMa

  • Android ListView position详解及实例代码

    我们在使用ListView的时候,一般都会为ListView添加一个响应事件android.widget.AdapterView.OnItemClickListener.对OnItemClickListener的position和id参数,我相信有些人在这上面走了些弯路. 在使用listview的时候,我们经常会在listview的监听事件中,例如OnItemClickListener(onItemClick)中,或listview的adapter中(getView.getItem.getIte

  • Android ListView ImageView实现单选按钮实例

    做Android开发两年的时间,技术稍稍有一些提升,刚好把自己实现的功能写出来,记录一下,如果能帮助到同行的其他人,我也算是做了件好事,哈哈!!废话不多说,先上个图. 先上一段代码: 1 if (lastposition == position){ 2 viewHolder.setImageResource(R.id.iv_yuandian1,R.mipmap.ic_button_checked); 3 } else { 4 viewHolder.setImageResource(R.id.iv

  • Android跳转到通讯录获取用户名称和手机号码的实现思路

    效果图如下所示: 先给大家说下实现android 跳转到通讯录的实现思路: 1.点击跳转到通讯录界面 2.获取通讯录姓名和手机号码 3.回调显示姓名和手机号码 1首先是跳转到通讯录界面 Uri uri = Uri.parse("content://contacts/people"); Intent intent = new Intent(Intent.ACTION_PICK, uri); startActivityForResult(intent, 0); 通过设置通讯录url跳转,可

  • Android 修改系统关机动画的实现

    在Android 系统移植做自己的移动设备,肯定会遇到更改开机或者关机画面,配置自己产品logo 这点是必须的,这些都要在源码中修改,然后编译,下面给大家介绍个关机动画修改,一个简单示例! 文件路径:frameworks\base\services\core\java\com\android\server\power\ShutdownThread.java 在beginShutdownSequence()方法中: private static void beginShutdownSequence

  • Android使用AudioManager修改系统音量的方法

    本文实例讲述了Android使用AudioManager修改系统音量的方法.分享给大家供大家参考,具体如下: 下面介绍几个AudioManager的几个音量调整方面的方法. 首先是得到AudioManager实例: AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE); 调整音量方法有两种,一种是渐进式,即像手动按音量键一样,一步一步增加或减少,另一种是直接设置音量值. 1.渐进式 public void ad

  • Android黑科技之读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波"黑科技". 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证码,一些app马上就能自动获取并填上验证码,省去我们手动填写验证码.原理就是通过Android的ContentProvider组件间接访问系统的短信数据库,获取所有短信内容.下面来演示一下. 布局很简单,如下: 代码如下: public class MainActivity extends

  • Android 调用系统联系人界面(添加联系人,添加已有联系人,编辑和修改)

    一.添加联系人 Intent addIntent = new Intent(Intent.ACTION_INSERT,Uri.withAppendedPath(Uri.parse("content://com.android.contacts"), "contacts")); addIntent.setType("vnd.android.cursor.dir/person"); addIntent.setType("vnd.androi

  • Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能实例

    一.前言 本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信息来实现隐藏功能,在如今社交工具的发展特别是微信,他有一个实时位置共享功能,那么对于那些不是单身狗的同学来说可能会有些蛋疼,哪天媳妇要查岗发送位置,结果你不在她期望的位置这时候就尴尬了,而且朋友圈在分享内容的时候可以选择当前位置,有的屌丝就像我一样没钱但是又想到处旅游,那么这时候咋们就可以一本正经的装个逼了. 二.定位原理 看到上面说的那么多,感觉这个功能必须要搞起来了,好处太多了,下面咋们就开始操作了,但是在这之前一

  • Android系统关机的全流程解析

    在PowerManager的API文档中,给出了一个关机/重启接口: public void reboot (String reason) 对于这个接口的描述很简单,就是几句话. 接口的作用就是重启设备,而且,就算重启成功了也没有返回值. 需要包含REBOOT权限,也就是android.permission.REBOOT 唯一参数reason代表需要的特定重启模式,比如recovery,当然也可以为null. 一.上层空间 1.frameworks/base/core/java/android/

  • Android 修改现有ROM资源文件如何实现

    Android 修改现有ROM资源文件 一,准备工作 1.一台开发手机. 我推荐最好用G7,也是就HTC Desire那款(是不是有些广告嫌疑...),这台机各种ROM都很全,资料也多些,很容易刷到root,Android版本也是最新的2.3.3. 2.Auto-sign签名工具    这个是必备的,网上很多下载点,主要做ROM签名所用 3.apktool     打包解包apk工具 二,具体步骤 1.先将ROM包解压,比如我用的就是g7_3.3_hiapk_signed.zip,你就会看到两个

  • Android自定义水波纹动画Layout实例代码

    话不多说,我们先来看看效果: Hi前辈搜索预览 这一张是<Hi前辈>的搜索预览图,你可以在这里下载这个APP查看更多效果: http://www.wandoujia.com/apps/com.superlity.hiqianbei LSearchView 这是一个MD风格的搜索框,集成了ripple动画以及search时的loading,使用很简单,如果你也需要这样的搜索控件不妨来试试:https://github.com/onlynight/LSearchView RippleEverywh

  • Android Activity跳转动画效果

    Activity的跳转动画在5.0的时候做了一个重大的突破,下面来看一下吧 1.5.0之前的overridePendingTransition 相信大家对OverridePendingTransition还是很熟悉的,使用方法也是很简单就是 //fade_in是第二个界面的进入动画,fade_out是第一个界面退出动画,不想动画传入0  overridePendingTransition(R.anim.fade_in,R.anim.fade_out); fade_in : <?xml versi

  • Android调用系统默认浏览器访问的方法

    一.启动android默认浏览器 这样子,android就可以调用起手机默认的浏览器访问. 二.指定相应的浏览器访问 1.指定android自带的浏览器访问 ( "com.android.browser":packagename :"com.android.browser.BrowserActivity":启动主activity) Intent intent= new Intent(); intent.setAction("android.intent.a

随机推荐