Probe:截断view的onMeasure等方法
你应该听说过安卓布局优化的最佳实践:让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