Probe:截断view的onMeasure等方法

probe.png

你应该听说过安卓布局优化的最佳实践:让view尽可能的简单,避免view树结构过于复杂等等,但现实是,你很难知道每次UI绘制过程中(measure → layout → draw)到底发生了什么。通过一些开发工具我们可以了解到一些(debug GPU overdraw, show hardware layers updates, profile GPU rendering),但是关于布局绘制的跟踪仍然是个盲点,因此,我写了Probe

Probe是一个可以在布局遍历的时候打断view方法调用的工具(比如onMeasure(), onLayout(), onDraw()等方法)。当view的方法被打断,你可以在这些方法中添加额外的功能,或者完全重写这些方法。

注:打断在这里的意思是指,系统在调用onDraw之类的方法的时候不去调用view本身的,而是调用你自定义的。

Probe使用起来很简单,你只需实现一个Interceptor就可以了。下面是一个完全重写了view onDraw()方法的interceptor。调用super.onDraw()可以调用view本身的onDraw方法。

public class DrawGreen extends Interceptor {
    private final Paint mPaint;
    public DrawGreen() {
        mPaint = new Paint();
        mPaint.setColor(Color.GREEN);
    }
    @Override
    public void onDraw(View view, Canvas canvas) {
        canvas.drawPaint(mPaint);
    }
}

Then deploy your Interceptor by inflating your layout with a Probe:

要使用这个Interceptor,只需在inflate 布局的时候:

Probe probe = new Probe(this, new DrawGreen(), new Filter.ViewId(R.id.view2));
View root = probe.inflate(R.layout.main_activity, null);

上面的例子只是让你初步了解Probe所能做的事情。我已经实现了几个内置的interceptor。OvermeasureInterceptor  根据view在一次绘制请求中被measure的次数来处理view,相当于overdraw的作用,但是是针对measure过程的。

LayoutBoundsInterceptor 相当于安卓开发者选项中的“显示布局边界“的功能。区别在于它允许只显示特定view的布局边界。

Probe使用goolge的DexMaker来产生view的代理,原生的ProxyBuilder实现不适合用在Probe,因为我想避免在代理类完全生成之后使用反射。因此我创建了一个特殊的View proxy builder。这意味着Probe比传统的LayoutInflater在inflate布局文件的时候花费更多的时间。

Probe的代码已经放在了github上https://github.com/lucasr/probe/

英文原文:Introducing Probe 

转载请注明出处:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0205/2419.html