要做波纹效果,用径向渐变是最简单的。QML中有两个RadialGradient径向渐变,一个是QtGraphicalEffects模块中的,另一个是QtQuick.Shapes模块中的(Shapes是Qt5.10开始引入的模块)。

Effects的径向渐变默认效果就没有锯齿感,Shapes的径向渐变抗锯齿设置更麻烦(暂时还没实现和Effects一样的效果,或许可以配合Shader来实现)。所以实际应用中,这种简单的波纹我准备用QtGraphicalEffects模块的径向渐变。

下面的Demo代码我实现了两个波纹以及一个点击效果(GIF不流畅):

代码有四个文件,使用Qt5.12版本编写及测试

//ClickWave.qml

import QtQuick 2.12
import QtGraphicalEffects 1.0Item {id: controlimplicitWidth: 100implicitHeight: 100visible: falseproperty double wave_offset: 0.0property color wave_color: "red"RadialGradient{id: gradientanchors.fill: parent//horizontalRadius: 0//verticalRadius: 0//horizontalOffset: 0//verticalOffset: 0gradient: Gradient{GradientStop{position: (control.wave_offset>0.1)?(control.wave_offset-0.1):0color: "transparent"}GradientStop{ position: control.wave_offset+0.09; color: control.wave_color }GradientStop{ position: control.wave_offset+0.11; color: "transparent" }}}PropertyAnimation{id: animationtarget: controlproperty: "wave_offset"from:0to:0.4duration: 400running: falseonStarted: control.visible=trueonFinished: control.visible=false}function click(ptx,pty){animation.stop()control.x=ptx-control.width/2control.y=pty-control.height/2animation.start()}
}

//EffectsWave.qml

import QtQuick 2.12
import QtGraphicalEffects 1.0Item {id: controlimplicitWidth: 150implicitHeight: 150property double wave_offset: 0.0property color wave_color: "red"property alias running: animation.runningRadialGradient{id: gradientanchors.fill: parent//horizontalRadius: 0//verticalRadius: 0//horizontalOffset: 0//verticalOffset: 0//待改进,根据参数来设置波纹数量gradient: Gradient{//很遗憾,不能用RepeaterGradientStop{ position: 0; color: "transparent" }GradientStop{ position: control.wave_offset+0.001; color: control.wave_color }GradientStop{ position: control.wave_offset+0.01; color: "transparent" }GradientStop{ position: control.wave_offset+0.07; color: "transparent" }GradientStop{ position: control.wave_offset+0.1; color: control.wave_color }GradientStop{ position: control.wave_offset+0.11; color: "transparent" }GradientStop{ position: control.wave_offset+0.17; color: "transparent" }GradientStop{ position: control.wave_offset+0.2; color: control.wave_color }GradientStop{ position: control.wave_offset+0.21; color: "transparent" }GradientStop{ position: control.wave_offset+0.27; color: "transparent" }GradientStop{ position: control.wave_offset+0.3; color: control.wave_color }GradientStop{ position: control.wave_offset+0.31; color: "transparent" }GradientStop{ position: control.wave_offset+0.37; color: "transparent" }GradientStop{ position: control.wave_offset+0.4; color: control.wave_color }GradientStop{ position: control.wave_offset+0.41; color: "transparent" }}}PropertyAnimation{id: animationtarget: controlproperty: "wave_offset"from:0to:0.1duration: 1000running: control.visibleloops: Animation.Infinite}
}

Shape用起来没Effects简单,但功能也更多。还要注意的是,ShapePath要围起来他才会填充,这里我用一个透明边框围了一个矩形框。有一点不同的是,Effects径向范围到0.5就到矩形边上了,Shapes径向范围为1才到矩形边上。

//ShapesWave.qml

import QtQuick 2.12
import QtQuick.Shapes 1.12Item {id: controlimplicitWidth: 150implicitHeight: 150property double wave_offset: 0.0property color wave_color: "red"property alias running: animation.runningShape {anchors.fill: parent//这些设置感觉没效果//多重采样抗锯齿//layer.enabled: true//layer.smooth: true//layer.samples: 8//平滑处理//smooth: true//反走样抗锯齿//antialiasing: trueShapePath{startX:0startY: 0strokeColor: "transparent"//需要圈起来他才会填充渐变色PathLine {x: control.width;y: 0}PathLine {x: control.width;y: control.height}PathLine {x: 0;y: control.height}PathLine {x: 0;y: 0}fillGradient: RadialGradient {//ShapeGradient.PadSpread    该区域将填充最接近的停止色。//ShapeGradient.RepeatSpread  在渐变区域外重复渐变。//ShapeGradient.ReflectSpread    渐变会反射到渐变区域之外。//spread: ShapeGradient.PadSpreadcenterRadius: control.width/2//对于简单的径向渐变,应该将focusRadius设置为0(默认值)centerX: control.width/2 //中心centerY: control.height/2focalX: centerX  //焦点focalY: centerY//待改进,根据参数来设置波纹数量, 很遗憾,不能用RepeaterGradientStop{ position: 0; color: "transparent" }GradientStop{ position: control.wave_offset+0.001; color: control.wave_color }GradientStop{ position: control.wave_offset+0.01; color: "transparent" }GradientStop{ position: control.wave_offset+0.15; color: "transparent" }GradientStop{ position: control.wave_offset+0.2; color: control.wave_color }GradientStop{ position: control.wave_offset+0.21; color: "transparent" }GradientStop{ position: control.wave_offset+0.35; color: "transparent" }GradientStop{ position: control.wave_offset+0.4; color: control.wave_color }GradientStop{ position: control.wave_offset+0.41; color: "transparent" }GradientStop{ position: control.wave_offset+0.55; color: "transparent" }GradientStop{ position: control.wave_offset+0.6; color: control.wave_color }GradientStop{ position: control.wave_offset+0.61; color: "transparent" }GradientStop{ position: control.wave_offset+0.75; color: "transparent" }GradientStop{ position: control.wave_offset+0.8; color: control.wave_color }GradientStop{ position: control.wave_offset+0.81; color: "transparent" }}}}PropertyAnimation{id: animationtarget: controlproperty: "wave_offset"from:0to:0.2duration: 1000running: control.visibleloops: Animation.Infinite}
}

//main.qml

import QtQuick 2.12
import QtQuick.Window 2.12Window {visible: truewidth: 720height: 520title: qsTr("Hello World")color: "black"EffectsWave{width: 200height: 200x:100y:100}ShapesWave{width: 200height: 200x:300y:100}ClickWave{id: click_wavewidth: 100height: 100x:100y: 300}MouseArea{anchors.fill: parentonClicked: {click_wave.click(mouse.x,mouse.y)}}
}

(完结~~)

QML用径向渐变做波纹效果相关推荐

  1. css渐变小案例,比较复杂的线性渐变和径向渐变做泡泡

    目录 一,前言 二,案例一,多个镜像渐变复合出图像 1.分析 2.第一步,四角的白色与红色条纹. 3.第二步,从上到下的渐变 4.第四步,后面的蓝红条纹效果 5.源码 6.奇思妙想 三,径向渐变做出好 ...

  2. CSS3技巧:利用css3径向渐变做一张优惠券(转)

    在很多购物网站上都能看到优惠券,代金券,什么什么的券,但基本都是图片直接放上去,那么你有没有想过css来做一个呢,反正我是这样想过.那么你怎么做呢,切图做背景平铺边缘,嗯,有这样想过,如今css3技术 ...

  3. html设置径向渐变色,【前端Talkking】CSS系列-css3之径向渐变初探

    1 径向渐变radial-gradient 这是关于渐变的第二篇文章径向渐变,第一篇文章是线性渐变,有兴趣的可以看这里 1.1 基本语法 线性渐变是沿着一条直线渐变,而径向渐变则是沿着椭圆或者圆进行渐 ...

  4. css3五花八门渐变之径向渐变【完美光晕效果】

    CSS3 渐变(Gradients) CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必须使用图像来实现这些效果.但是,通过使用 CSS3 渐变(gra ...

  5. 用shader做水波纹效果

    用shader做水波纹效果 1.效果展示: 2.代码: shader代码: Shader "Unlit/Water" {Properties{_MainTex("Text ...

  6. HTML径向效果,HTML5版径向渐变梯度色彩

    HTML5版径向渐变梯度色彩 有个读者问我如何用HTML5生成一个径向梯度色彩效果,而不使用图片.仔细思考下,其实这个问题一点都不难,请看代码. HTML HTML5 Radial Gradient ...

  7. html按钮按下效果_【CSS小分享】纯CSS实现一个水波纹效果按钮

    前言 如果大家有用过Material Design风格的UI库,那么一定对水波纹按钮很熟悉,我们这次就是使用纯CSS实现一个最简单的水波纹效果按钮,先上成品: 原理 在按钮中放置一个默认隐藏径向渐变的 ...

  8. html渐变显示动画效果,使用CSS transition和animation改变渐变状态

    到目前为止,CSS的渐变属性linear-gradient和radial-gradient已经是很成熟的CSS特性了,而且repeating-linear-gradient和conic-gradien ...

  9. html用渐变做彩虹,photoshop如何用渐变制作彩虹

    很多同学都喜欢那种彩虹,其实彩虹也可以用photoshop制作,只要用好渐变就可以了.那么大家知道photoshop如何用渐变制作彩虹吗?下面是学习啦小编整理的photoshop如何用渐变制作彩虹的方 ...

最新文章

  1. nginx+tomcat实现集群负载均衡(实现session复制)
  2. 超酷的JS时间效果--收集
  3. Vivadoz中Block Memory Generator v8.3的使用方法(二)
  4. c语言浮点乘法 溢出,浮点加减乘除运算各在什么情况下会发生溢出?
  5. android requestFocus的使用
  6. ***是如何能破解诸如美国中情局之类的密码
  7. 20211102:数字滤波器按照实现结构的分类及其优缺点总结
  8. 20210322 :贪心思想力扣典型题目合集
  9. dot-files/directories 点开头的文件或文件夹(windows/linux)
  10. 剖析vector.erase()实现
  11. 强制不使用“兼容性视图”的HTML代码
  12. hashmap 存取原理图_HashMap原理(二) 扩容机制及存取原理
  13. 【ACM International Collegiate Programming Contest Gym-100814 C】Connecting Graph【并查集按秩合并】
  14. cocos2d-x-3.x 场景(3)场景切换特效
  15. 基于大数据平台的异常检测场景分析方案
  16. 闪迪u盘量产工具U盘正常显示但是多出几个空分区的解决方案
  17. java工商银行项目_工商银行聚合支付,java开发实现
  18. vim打开文件时显示行号
  19. 腾讯2019年理财通用户突破两亿;浪潮云估值突破100亿元 | 美通企业日报
  20. Python 预测基因变异是否具有相互冲突的临床分类问题

热门文章

  1. 衣服不管染上什么,用这招都能洗掉!99%的人不知道!
  2. MySql使用if语句例子
  3. 太原理工大学系统分析与设计实验报告实验室设备_“艺术之光”绽放太原理工大学首届本科生专业节...
  4. mysql 导出指定分隔符_mysql 导出行数据到txt文件,指定字符分割
  5. PHP 数组基本概念
  6. 【分享】常用JS(2)
  7. python绘制笛卡尔心形线方程_canvas绘制爱心的几种方法
  8. Typora如何把图片上传到图床smms.app
  9. Java桌面应用程序设计新贵:SWT 简介
  10. 花 作品php,《不谢之花》作品赏析