qml : qml控件自适应;

import QtQuick 2.4

 

Item {

    property var targetItem: parent

    property bool fixedAspectRatio: true // Else zoom from width and height

    property bool accordingToX: true // Else according to center

 

    property var targetItemGeometry

    property var childrenItemGeometry

 

    property bool isBegin: false

 

    function begin() {

        targetItemGeometry = new Object;

        targetItemGeometry["width"] = targetItem.width;

        targetItemGeometry["height"] = targetItem.height;

 

        var children = targetItem.children;

        var data = new Array;

        for(var index = 1; index < children.length; index++)

        {

            var currentItem = children[index];

            var buf = new Object;

 

            buf["item"] = currentItem;

            buf["x"] = currentItem.x;

            buf["y"] = currentItem.y;

            buf["centerX"] = currentItem.x + (currentItem.width / 2);

            buf["centerY"] = currentItem.y + (currentItem.height / 2);

            buf["width"] = currentItem.width;

            buf["height"] = currentItem.height;

 

            data.push(buf);

        }

 

        childrenItemGeometry = data;

        isBegin = true;

    }

 

    function resize() {

        if(isBegin)

        {

            var horizontalRatio, verticalRatio;

 

            horizontalRatio = targetItem.width / targetItemGeometry["width"];

            verticalRatio = targetItem.height / targetItemGeometry["height"];

 

            for(var index = 0; index < childrenItemGeometry.length; index++)

            {

                if(fixedAspectRatio)

                {

                    if(horizontalRatio > verticalRatio)

                    {

                        childrenItemGeometry[index]["item"].width  = childrenItemGeometry[index]["width"] * verticalRatio;

                        childrenItemGeometry[index]["item"].height = childrenItemGeometry[index]["height"] * verticalRatio;

                    }

                    else

                    {

                        childrenItemGeometry[index]["item"].width  = childrenItemGeometry[index]["width"] * horizontalRatio;

                        childrenItemGeometry[index]["item"].height = childrenItemGeometry[index]["height"] * horizontalRatio;

                    }

                }

                else

                {

                    childrenItemGeometry[index]["item"].width  = childrenItemGeometry[index]["width"] * horizontalRatio;

                    childrenItemGeometry[index]["item"].height = childrenItemGeometry[index]["height"] * verticalRatio;

                }

 

                if(accordingToX)

                {

                    childrenItemGeometry[index]["item"].x = childrenItemGeometry[index]["x"] * horizontalRatio;

                    childrenItemGeometry[index]["item"].y = childrenItemGeometry[index]["y"] * verticalRatio;

                }

                else

                {

                    childrenItemGeometry[index]["item"].x = childrenItemGeometry[index]["centerX"] * horizontalRatio - (childrenItemGeometry[index]["item"].width / 2);

                    childrenItemGeometry[index]["item"].y = childrenItemGeometry[index]["centerY"] * verticalRatio - (childrenItemGeometry[index]["item"].height / 2);

                }

            }

        }

    }

 

    Component.onCompleted: {

        begin();

    }

 

    Component {

        id: connections

 

        Connections {

            target: targetItem

 

            onWidthChanged: {

                resize();

            }

            onHeightChanged:

            {

                resize();

            }

        }

    }

 

    Loader {

        Component.onCompleted: {

            sourceComponent = connections;

        }

    }

}

  

posted @ 2018-12-24 14:23  时光旅者  阅读(3166)  评论(0编辑  收藏  举报