sf干货知识:SurfaceControl数据如何与Layer的bounds进行关联及Winscope如何查看?

背景:

前面有发布关于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实战开发干货,请关注下面“千里马学框架”

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值