背景:
前面有发布关于SF中Layer的bounds计算相关文章:
重学SurfaceFlinger:Layer显示区域bounds计算剖析
文章因为直接是基于SurfaceFlinger中的Layer中的computeBounds进行源码剖析的,大部分同学发来了对这篇文章干货发来肯定的点赞哈。
但是也有同学求助马哥,希望这个文章内容可以扩展一下和平时接触的WMS或者SurfaceControl设置bounds相关数据结合起来,而且经常在Winscope使用时候也需要看这些bounds数据,希望马哥也可以稍微补充一下这块。
因为对于窗口显示开发来说操作最多就是SurfaceControl,但是SurfaceControl其实并没有什么setBounds相关的方法。其实看完Layer的computeBounds方法也完全可以理解,因为Layer的bounds其实是受到几个关键因素的影响,比如parent的bounds,自己transform,crop等,综合计算得出了自己的screenbounds显示区域。
那么接下来看看SurfaceControl是如何通过参数影响computeBounds方法的计算的。
客户端层面如何设置bounds
客户端设置一般都是通过SurfaceControl相关的接口来进行设置数据最后跨进程传递到SF端的
这里其实一般有多个个接口可以影响,这里主要列举以下几个:
1.客户端SurfaceControl调用setPosition
frameworks/native/services/surfaceflinger/Layer.cpp
bool Layer::setPosition(float x, float y) {
if (mRequestedTransform.tx() == x && mRequestedTransform.ty() == y) {
return false;
}
//客户端的setPosition方法转变成了mRequestedTransform
mRequestedTransform.set(x, y);
mDrawingState.sequence++;
mDrawingState.modified = true;
setTransactionFlags(eTransactionNeeded);
return true;
}
可以看到客户端在SurfaceControl类中调用的setPosition转成成了sf的Layer对象的mRequestedTransform。
2、客户端调用SurfaceControl的setMatrix方法,也被转换到mRequestedTransform中
bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
if (mRequestedTransform.dsdx() == matrix.dsdx && mRequestedTransform.dtdy() == matrix.dtdy &&
mRequestedTransform.dtdx() == matrix.dtdx && mRequestedTransform.dsdy() == matrix.dsdy) {
return false;
}
mRequestedTransform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
mDrawingState.sequence++;
mDrawingState.modified = true;
setTransactionFlags(eTransactionNeeded);
return true;
}
mRequestedTransform最后都会在updateGeometry赋值给mDrawingState.transform
bool Layer::updateGeometry() {
if ((mDrawingState.flags & layer_state_t::eIgnoreDestinationFrame) ||
mDrawingState.destinationFrame.isEmpty()) {
// If destination frame is not set, use the requested transform set via
// Layer::setPosition and Layer::setMatrix.
return assignTransform(&mDrawingState.transform, mRequestedTransform);
}
那么什么时候使用这个mDrawingState.transform,那就是在getActiveTransform方法中返回的
ui::Transform getActiveTransform(const Layer::State& s) const
{ return s.transform; }
这里的getActiveTransform方法调用就可以又回到
void Layer::computeBounds(FloatRect parentBounds, ui::Transform parentTransform,
float parentShadowRadius) {
const State& s(getDrawingState());
// Calculate effective layer transform
mEffectiveTransform = parentTransform * getActiveTransform(s);
Winscope结合查看bounds相关数据
结合Winscope也看这些bounds相关数据:



原文地址:
https://mp.weixin.qq.com/s/Ayf5JbDfoK4LbC7kvVu9ZA
更多framework实战开发干货,请关注下面“千里马学框架”
1万+

被折叠的 条评论
为什么被折叠?



