qml扇形角度动态渲染控件封装

import QtQuick 2.0


Item {
    id:root

    property url imagePath

    property alias effectWidth:displayEffect.width
    property alias effectHeight: displayEffect.height
    property alias curOffset: displayEffect.offsetVal

    property real originX:effectWidth/2
    property real originY:effectHeight/2

    property real beginAngle:360.0
    property real endAngle:0.0
    property int  durTime:2000
    property real curentAngle:0


    property real derection: endAngle-beginAngle
    property alias angle: animation.angle


    Image {
        id: srcImg
        visible: false
        source: imagePath
    }

    ShaderEffect {
        id: displayEffect
        width: srcImg.width
        height: srcImg.height
        blending: true
        visible:  true
        cullMode: ShaderEffect.BackFaceCulling
        property real degre : endAngle
        property real bAngle :beginAngle
        property variant src: srcImg
        property real offsetVal: 1
        property real angleDerection: derection


        vertexShader: "
        uniform highp mat4 qt_Matrix;
        attribute highp vec4 qt_Vertex;
        attribute highp vec2 qt_MultiTexCoord0;
        varying highp vec2 coord;
        void main() {
            coord = qt_MultiTexCoord0;
            gl_Position = qt_Matrix * qt_Vertex;
        }"
        fragmentShader: "
        varying highp vec2 coord;
        uniform sampler2D src;
        uniform lowp float qt_Opacity;
        uniform highp float degre;
        uniform highp float bAngle;
        uniform highp float offsetVal;
        uniform lowp float angleDerection;

        void main() {
        float angle = radians(degre);
        float bangle = radians(bAngle);

        float m = tan(angle)*offsetVal;
        float bm = tan(bangle)*offsetVal;
        lowp vec4 tex = texture2D(src, coord);

        if(angleDerection > 0.0)
        {
            if(degre <=90.0 && degre>=0.0 )
                {if(coord.y<=0.5 && coord.x>=0.5 && coord.y< (0.5*m+0.5-coord.x*m) || coord.y>0.5||coord.x<0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(degre > 90.0 && degre <= 180.0)
                {if(coord.x<=0.5 && coord.y<=0.5 && coord.y > (0.5*m+0.5-coord.x*m) || coord.y>0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(degre > 180.0 && degre < 270.0)
                {if(coord.y>=0.5 && coord.x<=0.5 && coord.y > (0.5*m+0.5-coord.x*m) || (coord.x>0.5 && coord.y>0.5)) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(degre >=270.0 && degre<=360.0)
                {if(coord.y>=0.5 && coord.x>=0.5 && coord.y < (0.5*m+0.5-coord.x*m)) {tex = vec4(0.0,0.0,0.0,0.0);}}

            if(bAngle <=90.0 && bAngle>=0.0 )
                {if(coord.y> (0.5*bm+0.5-coord.x*bm) && coord.x>=0.5 && coord.y<=0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(bAngle > 90.0 && bAngle <= 180.0)
                {if(coord.y< (0.5*bm+0.5-coord.x*bm) && coord.x<=0.5 && coord.y<=0.5 ||(coord.x>=0.5 && coord.y<=0.5)) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(bAngle > 180.0 && bAngle < 270.0)
                {if(coord.y< (0.5*bm+0.5-coord.x*bm) && coord.x<=0.5 && coord.y>=0.5 || coord.y<=0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(bAngle >=270.0 && bAngle<=360.0)
                {if(coord.y> (0.5*bm+0.5-coord.x*bm) && coord.x>=0.5 && coord.y>=0.5 || coord.x<=0.5 || coord.y<=0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}

        }
        else
        {
            if(degre <=90.0 && degre>=0.0 )
                {if(coord.y<=0.5 && coord.x>=0.5 && coord.y > (0.5*m+0.5-coord.x*m)) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(degre > 90.0 && degre <= 180.0)
                {if(coord.y<=0.5 && coord.x<=0.5 && coord.y < (0.5*m+0.5-coord.x*m) || (coord.x>0.5 && coord.y<0.5)) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(degre > 180.0 && degre < 270.0)
               {if(coord.y>=0.5 && coord.x<=0.5 && coord.y < (0.5*m+0.5-coord.x*m) || coord.y<0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(degre >=270.0 && degre<=360.0)
                {if(coord.y>=0.5 && coord.x>=0.5 && coord.y > (0.5*m+0.5-coord.x*m) || coord.x<0.5||coord.y<0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}

            if(bAngle <=90.0 && bAngle>=0.0 )
                {if(coord.y< (0.5*bm+0.5-coord.x*bm) && coord.x>=0.5 && coord.y<=0.5 ||coord.x<=0.5 ||coord.y>=0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(bAngle > 90.0 && bAngle <= 180.0)
                {if(coord.y> (0.5*bm+0.5-coord.x*bm) && coord.x<=0.5 && coord.y<=0.5||coord.y>=0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(bAngle > 180.0 && bAngle < 270.0)
                {if(coord.y> (0.5*bm+0.5-coord.x*bm) && coord.x<=0.5 ||(coord.y>=0.5 && coord.x>=0.5)) {tex = vec4(0.0,0.0,0.0,0.0);}}
            else if(bAngle >=270.0 && bAngle<=360.0)
                {if(coord.y< (0.5*bm+0.5-coord.x*bm) && coord.x>=0.5 && coord.y>=0.5) {tex = vec4(0.0,0.0,0.0,0.0);}}

        }

        gl_FragColor = tex;

        }"

        transform: Rotation {
            id: animation
            origin.x:displayEffect.width/2
            origin.y:displayEffect.height/2
            angle: 0
        }
    }


}

 

转载于:https://my.oschina.net/urlove/blog/1933107

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值