一、简述

前几天在群里看见有个小伙伴用的一款gif录屏软件有一个类似水滴的点击效果。于是想了想,便开始了Code。思路也很简单,就是借助Qt的动画类QVariantAnimation然后不断重绘达到点击的动画效果,先看一下效果图。

二、代码之路

WaterDrop.h

#include <QtWidgets/QWidget>
#include <QVariantAnimation>class WaterDrop : public QWidget
{Q_OBJECTpublic:WaterDrop(QWidget *parent = Q_NULLPTR);~WaterDrop();void show();void move(const QPoint &point);void setColor(QColor color);private:void paintEvent(QPaintEvent *event);
public slots:void onRaduisChanged(QVariant value);private:QVariantAnimation* m_waterDropAnimation;// 水滴变化的半径;int m_animationRadius;// 水滴的颜色;QColor m_waterDropColor;
};

WaterDrop.cpp

#include "WaterDrop.h"
#include <QPainter>// 水滴的半径;
#define WATER_DROP_RADIUS 15WaterDrop::WaterDrop(QWidget *parent): QWidget(parent), m_waterDropAnimation(NULL), m_animationRadius(0), m_waterDropColor(QColor(255, 120, 0, 150))    // 默认为橘黄色;
{this->setFixedSize(QSize(WATER_DROP_RADIUS * 2, WATER_DROP_RADIUS *2));this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);this->setAttribute(Qt::WA_TranslucentBackground);// 控件显示完关闭后自动删除;this->setAttribute(Qt::WA_DeleteOnClose);m_waterDropAnimation = new QVariantAnimation(this);
}WaterDrop::~WaterDrop()
{}void WaterDrop::move(const QPoint &point)
{// 这里要把鼠标点击的点转换为圆心点坐标;QPoint translatePoint = point - QPoint(WATER_DROP_RADIUS, WATER_DROP_RADIUS);__super::move(translatePoint);
}void WaterDrop::show()
{QWidget::show();// 通过动画类不断进行重绘;m_waterDropAnimation->setStartValue(0);m_waterDropAnimation->setEndValue(WATER_DROP_RADIUS);m_waterDropAnimation->setDuration(350);connect(m_waterDropAnimation, &QVariantAnimation::valueChanged, this, &WaterDrop::onRaduisChanged);connect(m_waterDropAnimation, &QVariantAnimation::finished, this, &WaterDrop::close);m_waterDropAnimation->start();}
// 设置水滴的颜色;
void WaterDrop::setColor(QColor color)
{m_waterDropColor = color;
}
// 绘制鼠标的水滴点击效果;
void WaterDrop::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setPen(Qt::NoPen);painter.setBrush(QBrush(m_waterDropColor));// 思路就是先绘制一个固定大小的圆A,然后绘制同一圆心的透明的圆B,然后通过动画类是圆B的半径从0增长到WATER_DROP_RADIUS,以致覆盖固定的圆A;QPainterPath waterDropPath;waterDropPath.addEllipse(QPoint(WATER_DROP_RADIUS, WATER_DROP_RADIUS), WATER_DROP_RADIUS, WATER_DROP_RADIUS);QPainterPath hidePath;hidePath.addEllipse(QPoint(WATER_DROP_RADIUS, WATER_DROP_RADIUS), m_animationRadius, m_animationRadius);waterDropPath -= hidePath;painter.drawPath(waterDropPath);
}void WaterDrop::onRaduisChanged(QVariant value)
{// 不断增加圆B的半径值,并重绘;m_animationRadius = value.toInt();update();
}

测试代码

// 新建一窗口类,重写mousePressEvent事件即可;
void MyWidget::mousePressEvent(QMouseEvent *event)
{QPoint cursorPos = event->pos();qDebug() << "mousePressEvent" << cursorPos;WaterDrop* waterDrop = new WaterDrop();waterDrop->move(this->mapToGlobal(cursorPos));waterDrop->setColor(Qt::green);waterDrop->show();
}

Qt动画之鼠标水滴点击效果相关推荐

  1. android水平波浪扩散动画,Android实现水波纹扩散效果

    本文实例为大家分享了Android实现水波纹扩散效果的具体代码,供大家参考,具体内容如下 先上图 ?澹∶挥型计??跃湍昧诵"泊?媪恕?/p> 先看一下如何使用这个View. andro ...

  2. js+css制作导航栏下划线跟随动画,App+H5点击效果

    这是使用Vue制作的一个下划线跟随效果,没有使用其他插件 目录 1. 制作一个初始的导航栏 2. 增加点击样式 3. 下划线移动 最终代码 注意事项 这是最终效果↓ 一开始从网上查其他人的做法,大部分 ...

  3. android水波纹点击动画,android 控件点击水波纹效果的几种方案

    目前我所知道的至少有三种可以实现点击水波纹的效果 第一种:安卓自带的方法 在安卓中有自带的一种属性,可以实现水波纹的效果,就是在所需要点击的控件属性加上如下代码: android:background ...

  4. 博客园自定义页面风格设计 后续篇(页面设计模式及代码高亮 鼠标点击效果升级)...

    前言 在之前所写过的博客园自定义页面风格设计篇中,我们已经说明了其中两种风格的页面设计,鼠标图案的修改,公告栏的设置,背景音乐的制作,关于CSS以及用Canvas和requestAnimFrame做动 ...

  5. android l 效果,[原]Android L中水波纹点击效果的实现

    博主参加了2014 CSDN博客之星评选,帮我投一票吧. 前言 前段时间android L(android 5.0)出来了,界面上做了一些改动,主要是添加了若干动画和一些新的控件,相信大家对view的 ...

  6. css 点击效果_使用CSS实现逼真的水波纹点击效果

    这篇文章特别介绍如何使用CSS来完成水波纹的效果. div的层层叠叠 虽然webkit具有遮罩的能力(webkit mask),不过webkit虽然强大,但在跨浏览器上总是它的罩门,况且在性能上也是往 ...

  7. 鼠标点击特效:canvas点击效果

    JS代码(代码中包含了sketch.min.js的源码,如果你的网站已经引用了,请删掉下面的6到7行.): /** 鼠标点击特效:canvas点击效果*/ /* Copyright (C) 2013 ...

  8. Android L中水波纹点击效果的实现

    博主参加了2014 CSDN博客之星评选,帮我投一票吧. 点击给我投票 前言 前段时间android L(android 5.0)出来了,界面上做了一些改动,主要是添加了若干动画和一些新的控件,相信大 ...

  9. Android点击水波纹扩散效果整理(附带一个自定义的水波纹效果控件)

    很久很久没有写博客了,说来也有点惭愧.正好最近整理自己的项目工程目录,看到一些值得分享的控件,准备在之后的几篇博客中准备把它们陆续搬运上来. 这篇博客准备整理一下Android Material De ...

最新文章

  1. 滴水穿石--Pydoop 架构和模块包介绍
  2. linux bash Shell脚本经典之Fork炸弹解析:() { :|: };:
  3. oracle中判断空,Oracle中判断空游标的方法
  4. (14)数据结构-二叉排序树
  5. C++ 多线程编程 封装多线程api 类似java多线程风格
  6. 一文搞懂三种工厂模式
  7. 毕业设计管理系统(JAVA毕业设计)
  8. Linux下安装HP打印机的驱动程序
  9. Netbean8.2初次运行Mavn的初始配置
  10. 【python基础】python爬虫对网页壁纸图片批量抓取下载
  11. 原理剖析(第 006 篇)Semaphore工作原理分析
  12. 一键批量下载皮皮虾视频
  13. 利用Python取出excel数据并生成统计图
  14. 老A:抖音爆火的“弹幕互动游戏”是什么?该如何搭建直播间?
  15. 如何写一篇可实施的技术方案?
  16. caffe学习笔记2:net forward与backward
  17. 机器学习作业-FOGS: 基于学习图的一阶梯度监督交通流预测
  18. Matlab+Robotic toolbox (各版本免费获取,及安装步骤)
  19. IOS应用的产品设计、交互设计理念断想
  20. CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面并安装火狐浏览器

热门文章

  1. QT 利用QAxObject大数据读写excel文件
  2. 硬件设计基础——电阻、电容、电感、磁珠
  3. 百度android离线下载,离线宝app下载-百度离线宝 安卓版v1.0.0.0-PC6安卓网
  4. 宝塔自助建站程序源码 网站建设公司必备程序
  5. 2005年10月--至今 开发过的项目
  6. Hierarchical Z-Buffer Visibility (Hi-Z)
  7. 目标检测之CSK(Exploiting the Circulant Structure of Tracking-by-detection with Kernels)
  8. html字体颜色代码属性,HTML文本属性颜色控制属性的实现
  9. mongodb mysql读写_MySQL vs MongoDB 1000读取
  10. Linux配置Samba实现局域网共享文件夹