一种寻找安卓应用绘制第一帧的方法

安卓中界面的呈现是通过窗口(window)来展现的,其中最主要的窗口是Activity,Activtiy主要以xml文件的形式来布局UI界面,最终会通过cpu和gpu来完成绘制工作,那么我们有没有办法来找到Activtiy第一帧绘制的时间点呢?

我们知道,安卓设备在绘制界面时,要求一帧需要在16毫秒以内完成,超过这个时间就可能造成丢帧的情况。这是因为系统底层每隔16毫秒会产生一个vsync信号,cpu接收到信号后,就开始计算一帧的绘制内容,然后通知gpu进行绘制。也就是说,如果我们找到第一个vsync信号发送的时刻,就可以知道应用程序第一帧的绘制时间点。

通过对源码和框架层api的查找,我们发了一个类:Choreographer,它的中文翻译为:舞蹈指导。。我们看下类的说明

/**
 * Coordinates the timing of animations, input and drawing.
 * 
 * The choreographer receives timing pulses (such as vertical synchronization)
 * from the display subsystem then schedules work to occur as part of rendering
 * the next display frame.
*/

意指:协调动画、输入、绘制的定时任务,行为是从显示子系统接收信号(垂直同步),然后分发下一帧的渲染工作。

顾名思义,它就是应用框架层接收垂直同步信号的类。也就是说,假如我们在应用刚启动,Activity还没有开始绘制的时候注册一个监听垂直同步信号的回调。我们就可以知道第一个垂直信号的接收点了。

我们进一步发现postFrameCallback方法可以向垂直同步信号处理队列添加一个处理任务。我们可以在其回调方法doFrame中对垂直同步信号进行拦截处理。。

完整操作为:

    Choreographer choreographer = Choreographer.getInstance();
    choreographer.postFrameCallback(this);
    
    
    @Override public void doFrame(long frameTimeNanos) {
    Log.e("wh", "start sleep");
    try {
      Thread.sleep(3000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    Log.e("wh", "stop sleep");
  }

以上实例中,我们在入口类Application中处理的,这样正常情况下,我们会第一个接收到系统发出的垂直同步信号。接收到垂直同步信号后,将当前线程睡眠3000毫秒,可以预见的是:第一个Activtiy在执行完onResume方法后,界面内容会在至少3000毫秒以后才会展示出来。

世界测试中,我们发现也的确如此。

没有采用任何的反射、hook等手段,我们就简单的定位了应用程序第一帧绘制的时刻。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于第一个问题,Android设置画笔的颜色可以使用```setColor()```方法,设置笔触的宽度可以使用```setStrokeWidth()```方法绘制一个实心矩形可以使用```drawRect()```方法,并在其中设置实心矩形的参数。希望这些信息能够帮助到你。 ### 回答2: 在Android中,我们可以使用Paint类的setColor()方法来设置画笔的颜色。此方法接受一个颜色值作为参数,可以是16进制颜色值,也可以是color资源的引用。例如,要设置画笔为红色,可以使用以下代码: ```java Paint paint = new Paint(); paint.setColor(Color.RED); ``` 关于笔触的宽度,我们可以使用Paint类的setStrokeWidth()方法来设置。该方法接受一个浮点型数值作为参数,表示笔触的宽度大小。例如,要设置笔触宽度为2个像素,可以使用以下代码: ```java Paint paint = new Paint(); paint.setStrokeWidth(2); ``` 绘制实心矩形可以使用Canvas类的drawRect()方法。该方法接受四个参数:左上角的x坐标、y坐标、右下角的x坐标、y坐标以及要绘制的矩形的画笔。例如,要绘制一个实心矩形,可以使用以下代码: ```java Paint paint = new Paint(); paint.setColor(Color.RED); RectF rect = new RectF(100, 100, 200, 200); // 左上角坐标(100, 100),右下角坐标(200, 200) canvas.drawRect(rect, paint); ``` 以上就是设置画笔的颜色、笔触的宽度以及绘制实心矩形的方法。 ### 回答3: 在Android中,我们可以通过Paint类来设置画笔的颜色和笔触的宽度。 1. 设置画笔的颜色:可以使用Paint类的setColor()方法来设置画笔的颜色。例如,可以使用Color类的静态方法来创建一种颜色,然后将其传递给setColor()方法,如下所示: ```java Paint paint = new Paint(); paint.setColor(Color.RED); ``` 2. 设置笔触的宽度:可以使用Paint类的setStrokeWidth()方法来设置笔触的宽度。该方法接受一个浮点数参数,表示笔触的宽度,单位为像素。例如,可以将笔触的宽度设置为3像素,如下所示: ```java Paint paint = new Paint(); paint.setStrokeWidth(3); ``` 3. 绘制一个实心矩形:可以使用Canvas类的drawRect()方法绘制一个实心矩形。该方法接受四个参数,分别为矩形的左上角坐标和右下角坐标。例如,可以绘制一个左上角坐标为(100, 100),右下角坐标为(200, 200)的实心矩形,如下所示: ```java Canvas canvas = new Canvas(bitmap); // 创建一个Canvas对象,将要绘制的矩形绑定到一个Bitmap上 Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawRect(100, 100, 200, 200, paint); ``` 综上所述,以上就是如何在Android中设置画笔的颜色、笔触的宽度以及如何绘制一个实心矩形的方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值