精华内容
下载资源
问答
  • 行业分类-电子政务-一种环形圆盘发电系统.zip
  • 电子政务-一种风筝驱动的环形圆盘发电系统.zip
  • 行业制造-电动装置-多级喷射式反作用力圆盘发电系统.zip
  • 电子政务-圆盘式海浪发电装置.zip
  • 为了提高GaN基蓝光LED的发光效率,设计了在LED有源层上方引入银纳米圆盘阵列的模型。利用时域有限差分方法计算了银纳米圆盘阵列不同结构参数情况下LED有源层自发辐射率的变化情况及光提取效率值。通过对有源区的近场...
  • 行业分类-电器装置-二次反射圆盘形闭合腔体采光太阳能热水发电装置.zip
  • 共掺杂对Zn2SnO4:Cr3þ,Eu3þ陶瓷圆盘近红外发光性能的影响
  • } /* 圆盘悬浮时暂停动画,设置动画播放状态为暂停 */ .banner-box .circle-box:hover .menu-box { animation-play-state: paused; } 结果我满头大汗做出来给客户看了以后,客户居然说“不是要转动的。是像某某项目...

    标题当然是我自创的啦,这个效果是我偶然做出来的,并没有人严肃地起过名字。那我为什么会偶然做出这个东西呢?

    最近做一个PC端官网的项目,首页的banner迟迟没有定下来,感觉客户想搞个大文章。果然后来客户说了个“要会动的banner”?什么是会动的?banner图左边有一个大圆环,(圆环上有8个栏目,每个栏目有个小圆圈,下面是标题)所以我认为,会动是圆环会转动。然后我花了好几个小时,研究如何使用animation动画让圆环转动,而且不让里面的文字颠倒。

    banner的截图,长这样——

    简单介绍一下圆环转动的思路:这个思路不是我原创的,而是来自一本叫做《CSS揭秘》的书的最后一节。

    这个圆环有个特点:里面的每个项目并不是单纯的一个圆,而是含有文字的,甚至文字和圆是在同一张切图上的,也就是说,这些子项目的中心点并不是圆心。让圆环转动不难,但是如果只是圆环在转动,文字会颠倒,所以文字需要做相反方向的转动。据我所知有两种实现方法。

    第一种是我一开始使用的,很蠢,非常蠢——分别指定每个子项目的transform-origin为圆环的圆心位置(因为不同的对于不同的点来说,圆心的位置不一样,)让子项目绕着圆心转动,因为它们本身就在圆环上,所以绕圆心转动,就是沿着圆环转动,理想的情况下是刚好在圆上的。然后让子项目里再套一层子元素(图片是子元素的背景图),子元素旋转的方向相反,让文字不颠倒。这个方法很麻烦,需要一一指定转动的中心,而且指定的位置如果没那么准确,转的时候会脱离轨道,效果很尴尬。

    第二种效果好多了,那就是,不让每个子项目自己绕着圆心转,而是就摆在圆环上,让圆环自己转动,子项目自然就被带动着转起来了。然后,找到每个子项目中的圆心位置,让子项目绕着自己的圆心做方向相反的转动,就保证了文字不颠倒。这样计算量小得多,也不容易出意外(因为每个子项目看起来差不多大,圆心的位置几乎是一样的,只需要设置一次就可以了)

    代码是这样的——

            <!-- banner -->
    		<div class="banner-box">
    			<img src="img/banner_bg.png" class="index-img"/>
    			<!-- 左边,圆环 -->
    			<div class="left-box">
    				<div class="circle-box">
    					<div class="menu-box menu-box1">
    						<a href="#" class="menu">创新成果</a>
    					</div>
                        ...
    					<!-- 这里一共8个子项目,每个子项目有两层,外层是div,class为menu-box,内层是a,class为menu --->
    				</div>
    				<!-- 中间的文字 -->
    				<img src="img/gxdjlc.png" alt="高校对接流程" class="circle-title"/>
    			</div>
    			<!-- 右边不重要 -->
    			<div class="right-box">
    				<img/><img/>
    			</div>
    		</div>

     

    /* 两个方向相反的旋转关键帧动画 */
    @keyframes spin{
    	to{transform: rotate(1turn);}
    }
    
    @keyframes spin-reverse{
    	from{
    		transform:rotate(1turn);
    	}
    }
    
    /* 圆环 */
    .banner-box .circle-box {
    	width: 560px;
    	height: 560px;
    	transform-origin: center;
    	background: url("../img/circle_bg.png");
        /* 圆环转动 */
    	animation:spin 60s infinite linear;
    }
    
    /* banner里面的每一个子项目div */
    .banner-box .circle-box .menu-box {
    	position: absolute;
    	animation: inherit;
    	animation-name: spin-reverse;
    	transform-origin: 50% 40px;
    	/* 子元素转动,animation是继承了圆环的,但是指定了另一个动画名字,所以是倒着转的 */
    	animation: inherit;
    	animation-name: spin-reverse;
    }
    
    /* 每个子元素div的位置,menu-box1到menu-box8各不相同,这里省略了其他的 */
    .banner-box .circle-box .menu-box1 {
    	top: -39px;
    	left: 218px;
    }
    
    /* 每个里面的a的大小和背景图 */
    .banner-box .circle-box .menu-box1 .menu {
    	width: 125px;
    	height: 131px;
    	background: url("../img/banner_menu1.png");
    }
    
    /* 圆盘悬浮时暂停动画,设置动画播放状态为暂停 */
    .banner-box .circle-box:hover .menu-box {
        animation-play-state: paused; 
    }

    结果我满头大汗做出来给客户看了以后,客户居然说“不是要转动的。是像某某项目一样有发光、发散的效果。转动先留着。如果领导想不开,可能会想让圆环转起来”。所以重点并不是圆环转动,而是小圆发光。于是我接着去做小圆发光的事情……

    为了防止给HTML代码“添乱”,我这里借用了伪元素,大部分元素都有两个伪元素,分别叫before和after。这样,看似一个元素,其实就有两个跟它站在一起的"分身“。思路是这样的(这个思路也不是我原创的,我在看黑马程序员老师讲CSS3的时候看到的):因为发光的时候光线会随着时间变淡,所以应该是透明度降低;而且光线应该是渐渐走出我们的视野,所以应该是变透明的同时放大了;而且发光的时候看起来是一闪一闪的,所以必须有两个光圈同时在动,而且节奏不一致。

    更进一步说,两个光圈同时在动,但节奏不同,说明它们用的是同一个动画但有不同的延时,而这两个光圈,可以使用绝对定位、背景透明但有白色边框的伪元素来做。用js给子元素做了轮流闪烁的效果。另外,为了在鼠标悬浮时吸引用户的注意,我让鼠标悬浮的项目加上动画,并且次数为无数次。

    /* 用伪元素做两个白色小圆环,初始状态下透明度为0,看不见 */
    .banner-box .circle-box .menu::before,
    .banner-box .circle-box .menu::after {
    	content: '';
    	position: absolute;
    	top: 0;
    	left: 50%;
    	margin-left: -39.5px;
    	width: 80px;
    	height: 80px;
    	box-sizing: border-box;
    	border: 2px solid #fff;
    	border-radius: 50%;
    	transform-origin: center;
    	opacity: 0;
    }
    
    /* 发光动画,在动的时候,透明度变淡,同时光圈变大 */
    @keyframes shining {
    	from {
    		opacity: 1;
    		transform: scale(1);
    	}
    	to {
    		opacity: 0;
    		transform: scale(1.8);
    	}
    }
    
    /* 悬浮和active闪烁*/
    .banner-box .circle-box .menu.active::before,
    .banner-box .circle-box .menu:hover::before {
    	/* 加上发光动画 */
    	animation: shining 3s infinite linear;
    }
    
    /* after的动画有延时 */
    .banner-box .circle-box .menu.active::after,
    .banner-box .circle-box .menu:hover::after {
    	animation: shining 3s infinite 1.5s linear;
    }
    
    /* 如果是加上了active,那么就只动一次 */
    .banner-box .circle-box .menu.active::after,
    .banner-box .circle-box .menu.active::before {
    	animation-iteration-count: 1;
    }
    // 让元素自己闪的动画
    // 现在闪烁的元素索引
    let activeIndex = 0;
    let links = $('.circle-box .menu');
    // 先让第一个元素闪烁
    links.eq(0).addClass('active')
    /* 让里面的链接自动按顺序闪烁 */
    window.setInterval(function() {
    	activeIndex++;
    	// 只有当前的元素有active类
    	links.removeClass('active')
    	links.eq(activeIndex % 8).addClass('active')
    }, 4500) //闪烁一次时间是4.5秒

    效果是这样的——

    我不知道怎么截gif,所以就随手灵魂截图截了几张给大家看看,子项目的位置在变,说明有在旋转,而且有的子项目外面有半透明圆圈。

    整体来说,这是一个不太难,但是又比较有趣的一个效果,莫名地有一种摩天轮的感觉。如果有小伙伴在学习CSS3动画,可以来了解一下,练习一下。好啦,这一个效果讲完了。我是南宫,我的愿望是——好好学习,好好生活,早日找到好工作!

    展开全文
  • 行业-电子政务-圆盘高压直流发电机.zip
  • 最近我们领导要搞web3d,了一些关于3DJS引擎的博客给我看。一问需求,要把公司大楼用web3d展现出来。惊出一身冷汗,慢慢学吧。只好把之前写过一个canvas百分比的圆盘插件拿出来封装了一下压压惊。 写了一个小时,...

    最近我们领导要搞web3d,发了一些关于3DJS引擎的博客给我看。一问需求,要把公司大楼用web3d展现出来。惊出一身冷汗,慢慢学吧。只好把之前写过一个canvas百分比的圆盘插件拿出来封装了一下压压惊。
    写了一个小时,动画还是没想好怎么写,思路有点爆炸,求大神指点啊。
    效果图
    在这里插入图片描述
    不废话直接上代码

    <canvas width="300" height="300"></canvas>
    <canvas width="300" height="300"></canvas>
    

    运行函数

    var canvas = new DrawDisk({
    	    element:'canvas',
    		 num:[75,80],
    		// text:['javaScript'],
    		bgColor:'#fff',
    		scaleColor:'black',
    		whiteColor:'rgba(151,187,205,0.5)',
    		pointColor:rgba(30,90,250,0.5)'
    	})
    	 canvas.draw();
    

    构造函数

    function DrawDisk(ele){
    		this.element = ele.element; //获取dom
    		this.num = ele.num || [60]; //获取百分比number的值
    		this.text = ele.text || ["HelloWorld"] ; //获取中间的词语
    		this.bgColor = ele.bgColor || "white"; //背景颜色
    		this.scaleColor = ele.scaleColor || "black"; //刻度颜色
    		this.pointColor = ele.pointColor || "rgba(30,90,250,0.5)"; //指针颜色
    		this.whiteColor = ele.whiteColor || "rgba(151,187,205,0.5)";  //刻度背景颜色
    		this.textColor = ele.textColor || "black"; //字体颜色
    		this.n = ""; //留着做动画的
    	}
    

    画圆画刻度函数

    DrawDisk.prototype.draw = function(){
    		if(this.element==''){
    			throw '未拿到dom对象'
    			return;		
    		}
    		let ele = document.querySelectorAll(this.element);
    		
    		ele.forEach((el,index)=>{
    			if(this.num[index]==undefined){
    				this.num[index] = this.num[0]; //如果DOM有多个num只有一个值,赋予默认值
    			}
    			if(this.text[index]==undefined){
    				this.text[index] = this.text[0];//如果DOM有多个text只有一个值,赋予默认值
    			}
    			let width = el.width;
    			let height = el.height;
    			let ctx = el.getContext("2d");
    			let rem = width/400;
    			let RADIUS = width / 2;
    
         		//画布背景
    		ctx.clearRect(0, 0, width, height); 
    		ctx.fillStyle = this.bgColor;
    		ctx.fillRect = (0, 0, width, height);
    		ctx.save();
    		 //画最外面的圆
    		ctx.beginPath();
    		ctx.fillStyle = this.whiteColor;
    		ctx.arc(RADIUS, RADIUS, RADIUS, Math.PI * 2, false);
    		ctx.lineTo(RADIUS, RADIUS);
    		ctx.fill();
    		ctx.closePath();
    		//画一个小圆
    		ctx.beginPath();
    		ctx.fillStyle = this.bgColor;
    		ctx.arc(RADIUS, RADIUS, RADIUS*0.8, 0, Math.PI * 2, false);
    		ctx.lineTo(RADIUS, RADIUS);
    		ctx.fill();
    		ctx.save();
    
    		//画小刻度
    		ctx.strokeStyle = this.scaleColor;
    		ctx.translate(RADIUS, RADIUS);
    
    		ctx.rotate(Math.PI / 180 * 360);
    
    		ctx.lineWidth = 1;
    		for (var i = 0; i < 20; i++) {
    			ctx.rotate(Math.PI / 180 * 18);
    			ctx.beginPath();
    			ctx.moveTo(0, 0);
    			ctx.lineTo(0, RADIUS*0.9);
    			ctx.stroke();
    		}
    		ctx.restore();
    		ctx.closePath();
    		ctx.save();
    		//将小刻度背景颜色到圆心的区域遮住
    		ctx.beginPath();
    		ctx.fillStyle = this.bgColor;
    		ctx.arc(RADIUS, RADIUS, RADIUS*0.8, Math.PI * 2, false);
    		ctx.lineTo(RADIUS, RADIUS);
    		ctx.fill();
    
    		//画大刻度
    		ctx.strokeStyle = this.scaleColor;
    		ctx.translate(RADIUS, RADIUS);
    
    		ctx.rotate(Math.PI / 180 * 360);
    		ctx.lineWidth = 2;
    		for (var i = 0; i < 10; i++) {
    			ctx.rotate(Math.PI / 180 * 36);
    			ctx.beginPath();
    			ctx.moveTo(0, 0);
    			ctx.lineTo(0, RADIUS);
    			ctx.stroke();
    		}
    		ctx.restore();
    		ctx.closePath();
    		ctx.save();
    		//将大刻度背景颜色到圆心的区域遮住
    		ctx.beginPath();
    		ctx.fillStyle = this.bgColor;
    		ctx.arc(RADIUS, RADIUS, RADIUS*0.8, Math.PI * 2, false);
    		ctx.fill();
    		//画百分比
    		var percent = ['100%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%'];
    
    		ctx.font = 20 * rem + "px Arial";
    		ctx.textAlign = "center";
    		ctx.baseline = "middle";
    		ctx.fillStyle = this.scaleColor;
    		percent.forEach(function (index, i) {
    			ctx.save();
    			ctx.translate(RADIUS, RADIUS);
    			ctx.beginPath();
    			let rad = 2 * Math.PI / 10 * i;
    			let x = ((RADIUS *0.9) - 40 * rem) * Math.sin(rad);
    			let y = -((RADIUS *0.9) - 40 * rem) * Math.cos(rad);
    			ctx.translate(x, y);
    			ctx.rotate(2 * Math.PI / 10 * i);
    			ctx.fillText(index, 0, 0);
    			ctx.restore();
    			ctx.closePath();
    			});
    			//将这个圆盘表示什么东西的文字画上去
    			this.DrawText(ctx,rem,index,RADIUS);
    			//画百分比
    			this.ChangeNum(ctx,rem,index,RADIUS,this.num);
    			//画指针
    			this.ChangeRatate(ctx,rem,index,RADIUS,this.num)
    		})
    	}
    

    画文字函数

    DrawDisk.prototype.DrawText = function(ctx,rem,index,RADIUS){
    		
    			 ctx.save();
    	 		 ctx.font = 40 * rem + "px Avenir";
    	 		 ctx.textAlign = "center";
    	 		 ctx.baseline = "middle";
    	 		 ctx.fillStyle = this.textColor;
    	 		 ctx.beginPath;
    	 		 ctx.fillText(this.text[index],RADIUS,1.3*RADIUS);
    			  ctx.restore();
    
    	}
    

    画百分比函数

    	DrawDisk.prototype.ChangeNum = function(ctx,rem,index,RADIUS,n){
    			ctx.save();
    	 		ctx.font = 30 * rem + "px Arial";
    	 		ctx.textAlign = "center";
    	 		ctx.baseline = "middle";
    	 		ctx.fillStyle = this.textColor;
    	 		ctx.beginPath;
    			ctx.fillText(n[index]+"%",RADIUS,0.9*RADIUS);
    		 	ctx.restore();
    	}
    

    画刻度函数

    DrawDisk.prototype.ChangeRatate = function(ctx,rem,index,RADIUS,n){
    			ctx.save();
    			ctx.translate(RADIUS, RADIUS);
    			ctx.beginPath();
    			ctx.lineWidth = 1;
    			ctx.lineCap = "round";
    			ctx.fillStyle = this.pointColor;
    			ctx.rotate(2 * Math.PI / 100 * n[index]);
    			ctx.moveTo(0, -RADIUS*0.7);
    			 ctx.lineTo(-5*rem, 15* rem);
    			 ctx.lineTo(5 * rem, 15 * rem);
    			 ctx.fill();
    			ctx.restore();
    	}
    
    展开全文
  • 圆盘取色器 效果图 完整代码 import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; class CircularColorFinder ...

    下面展示一些 内联代码片

    圆盘取色器

    效果图

    请添加图片描述

    完整代码
    import 'dart:math';
    
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/widgets.dart';
    
    
    class CircularColorFinder extends StatefulWidget {
      Color color;
      double size;
      double thumbSize;
      ValueChanged<Color> onColorChange;
      ValueChanged<Color> onColorChangeEnd;
      CircularColorFinder({Key key,this.color,this.size=300,this.thumbSize=25,this.onColorChange,this.onColorChangeEnd}) : super(key: key);
    
      @override
      _CircularColorFinderState createState() => _CircularColorFinderState();
    }
    
    class _CircularColorFinderState extends State<CircularColorFinder> {
      Offset topPosition;
      Offset center;
      Offset position;
      Offset currentOffset;
      double radians = 0;
      double radius;
      double hue = 0;
      Color color;
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        radius = widget.size/2;
        color = Colors.white;
        topPosition = Offset(0, widget.size/2);
        center = Offset(widget.size/2, widget.size/2);
        position = Offset(widget.size/2, widget.size/2);
        currentOffset = Offset(widget.size/2, widget.size/2);
      }
      @override
      Widget build(BuildContext context) {
        return Container(
          alignment: Alignment.center,
          width: widget.size+40,
          height: widget.size+40,
          child: Stack(
            children: [
              Container(
                width: widget.size+40,
                height: widget.size+40,
                alignment: Alignment.center,
                child: GestureDetector(
                  onPanDown: onPanDown,
                  onPanUpdate: onPanUpdate,
                  onPanEnd: onPanEnd,
                  child: Container(
                    alignment: Alignment.center,
                    width: widget.size,
                    height: widget.size,
                    child: Stack(
                      alignment: Alignment.center,
                      children: [
                        Transform.rotate(
                          angle:pi,
                          child: CustomPaint(
                            painter: CircularColorPainter(
                              color: color,
                              center: center,
                              radius: radius,
                            ),
                            child: Container(
                              alignment: Alignment.center,
                              width: widget.size,
                              height: widget.size,
                            ),
                          ),
                        ),
                        Row(
                          crossAxisAlignment: CrossAxisAlignment.center,
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            Column(
                              crossAxisAlignment: CrossAxisAlignment.center,
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: [
                                Icon(Icons.wb_sunny_sharp,color: Color.fromRGBO(183, 202, 208, 1.0)),
                                Text('Warm',style: TextStyle(color: Color.fromRGBO(183, 202, 208, 1.0)),),
                                Text('White',style: TextStyle(color: Color.fromRGBO(183, 202, 208, 1.0)),),
                              ],
                            ),
                            SizedBox(width: 15,),
                            Column(
                              crossAxisAlignment: CrossAxisAlignment.center,
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: [
                                Icon(Icons.brightness_2_sharp,color: Color.fromRGBO(183, 202, 208, 1.0)),
                                Text('Cool',style: TextStyle(color: Color.fromRGBO(183, 202, 208, 1.0)),),
                                Text('White',style: TextStyle(color: Color.fromRGBO(183, 202, 208, 1.0)),),
                              ],
                            ),
                          ],
                        ),
                      ],
                    ),
                  ),
                ),
              ),
              Thumb(
                // top: 0,
                // left: 0,
                top: currentOffset.dy+20,
                left: currentOffset.dx+20,
                thumbSize:widget.thumbSize,
                color: color,
              ),
            ],
          ),
        );
      }
      ///获取象限
      static int getQuadrant(double x, double y, double size) {
        if (x >= size / 2) {
          return y >= size / 2 ? 3 : 4;
        }
        return y >= size / 2 ? 2 : 1;
      }
      onPanDown(DragDownDetails details){
        change(details);
        widget.onColorChange(color);
      }
      onPanUpdate(DragUpdateDetails details){
        change(details);
        widget.onColorChange(color);
      }
      onPanEnd(DragEndDetails details){
        widget.onColorChangeEnd(color);
      }
      change(details){
        setState(() {
          position = Offset(details.localPosition.dx, details.localPosition.dy);
        });
        double cosA;
        double x = (sqrt(pow((topPosition.dx - center.dx), 2) + pow((topPosition.dy - center.dy), 2)));
        double y = (sqrt(pow((position.dx - center.dx), 2) + pow((position.dy - center.dy), 2)));
        double z = (sqrt(pow((topPosition.dx - position.dx), 2) + pow((topPosition.dy - position.dy), 2)));
        cosA = (x * x + y * y - z * z) / (2 * x * y);
        int quadrant = getQuadrant(position.dx, position.dy, center.dx*2);
        radians = acos(cosA);
        if (quadrant == 1 || quadrant == 4) {
          radians = acos(cosA);
        } else if (quadrant == 2 || quadrant == 3) {
          radians = 2 * pi - acos(cosA);
        }
        hue = 360*radians/(2*pi);
        // print('radians:${radians} hue:${hue}');
        color = HSVColor.fromAHSV(1, hue, 1, 1).toColor();
        if(y<=center.dx){
          currentOffset = Offset(details.localPosition.dx, details.localPosition.dy);
        }else{
          double dx = position.dx - center.dx;
          double dy = position.dy - center.dy;
          double distance = sqrt(dx * dx + dy * dy);
          double ratio = radius / distance;
          currentOffset = Offset(dx * ratio + center.dx, dy * ratio + center.dy);
        }
        if(y<=center.dx/2){
          if(position.dx<widget.size/2){
            color =Color.fromRGBO(255, 225, 178, 1.0);
          }else{
            color = Color.fromRGBO(220, 244, 255, 1.0);
          }
        }
      }
    }
    
    class CircularColorPainter extends CustomPainter {
      Color color;
      double radius;
      Offset center;
      List<Color> colorList;
      CircularColorPainter({this.color,this.center,this.radius});
    
      @override
      void paint(Canvas canvas, Size size) {
        Paint _paint = Paint()
          ..style = PaintingStyle.fill
          ..strokeWidth = 1
          ..color = Colors.black;
        Paint _paint2 = Paint()
          ..style = PaintingStyle.fill
          ..strokeWidth = 1
          ..color = Colors.black;
        Paint _paint3 = Paint()
          ..style = PaintingStyle.stroke
          ..strokeWidth = 1
          ..color = Colors.black;
        Paint _paint4 = Paint()
          ..style = PaintingStyle.fill
          ..strokeWidth = 0
          ..color = Color.fromRGBO(color.red, color.green, color.blue, 0.3);
        colorList = [Color(0xFFFF0000),Color(0xFFFFFF00),Color(0xFF00FF00),Color(0xFF00FFFF),Color(0xFF0000FF),Color(0xFFFF00FF),Color(0xFFFF0000),];
        Gradient gradient = SweepGradient(
          startAngle: 0,
          endAngle: 2 * pi,
          colors: colorList.map((e) => e).toList(),
        );
        _paint4..maskFilter = MaskFilter.blur(BlurStyle.outer, 30);
        canvas.drawArc(Rect.fromLTWH(0, 0, radius * 2, radius * 2), -pi / 2, pi * 2, false, _paint4);
        var rect = Rect.fromLTWH(0, 0, radius * 2, radius * 2);
        _paint.shader = gradient.createShader(rect);
        canvas.drawCircle(center, radius, _paint);
        var rect2 = Rect.fromLTWH(radius/2, radius/2, radius, radius);
        _paint2.color = Color.fromRGBO(255, 225, 178, 1.0);
        canvas.drawArc(rect2, -pi/2, pi, true, _paint2);
        _paint2.color = Color.fromRGBO(220, 244, 255, 1.0);
        canvas.drawArc(rect2, pi/2, pi, true, _paint2);
        canvas.drawCircle(center, radius/2, _paint3);
        _paint3.color = Colors.grey;
        canvas.drawLine(Offset(radius,radius/2), Offset(radius,radius+radius/2), _paint3);
      }
    
      @override
      bool shouldRepaint(CustomPainter oldDelegate) {
        return true;
      }
    }
    
    class Thumb extends StatelessWidget {
      const Thumb({
        Key key,
        @required double top,
        @required double thumbSize,
        @required double left,
        @required Color color,
      })  : _top = top,
            _Thumbsize = thumbSize,
            _left = left,
            _color = color,
            super(key: key);
    
      final double _top;
      final double _Thumbsize;
      final double _left;
      final Color _color;
    
      @override
      Widget build(BuildContext context) {
        return Positioned(
          top: _top - _Thumbsize / 2,
          left: _left - _Thumbsize / 2,
          child: GestureDetector(
            child: Container(
              // width: 50.0,
              child: Icon(
                Icons.circle,
                color: _color == null ? Colors.white : _color,
                size: _Thumbsize,
              ),
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(300),
                boxShadow: [
                  BoxShadow(
                    blurRadius: 0.1, //阴影范围
                    spreadRadius: 0.001, //阴影浓度
                    color: Colors.white, //阴影颜色
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    
    
    展开全文
  • Qt实现不规则按钮之自绘圆盘式按钮

    千次阅读 2018-01-21 23:06:45
    在上一篇文章中我们讲述了如何实现不规则按钮( Qt简述如何实现不规则按钮),其中提到了另外一种方法就是自绘,今天就此谈一谈如何自绘实现一个圆盘式的按钮。下面先看一张效果图。 二、代码之路 其实实现很...

    一、简述

    在上一篇文章中我们讲述了如何实现不规则按钮( Qt简述如何实现不规则按钮),其中提到了另外一种方法就是自绘,今天就此谈一谈如何自绘实现一个圆盘式的按钮。下面先看一张效果图。

    这里写图片描述

    二、代码之路

    其实实现很简单,就是通过Qt的QPainterPath来实现圆弧式按钮的绘制,然后通过鼠标事件实现点击效果及点击信号的发送。因为正常QPushButton或者QToolButton是自己发送clicked或者pressed、release等信号的,既然我们是通过自绘而不是继承button,那这些信号都需要我们自己来实现了,如果不知道具体按钮的某个信号是如何发送的或者是何时发送的可以参考源码。下面直接上代码。

    CustomButton.h

    #pragma once
    
    #include <QtWidgets/QWidget>
    
    
    class CustomButton : public QWidget
    {
    	Q_OBJECT
    
    public:
    	CustomButton(QWidget* parent = NULL);
    	// 设置弧长及半径;
    	void setRadiusValue(int radius);
    	void setArcLength(int arcLength);
    private:
    	// 初始化按钮;
    	void initButton();
    	// 绘制按钮; 
    	void paintEvent(QPaintEvent *);
    	// 添加圆弧;
    	void addArc(qreal startAngle, qreal angleLength, QRgb color);
    
    	// 鼠标事件;
    	void mouseMoveEvent(QMouseEvent *event);
    	void mousePressEvent(QMouseEvent *event);
    	void mouseReleaseEvent(QMouseEvent *event);
    
    	// 鼠标离开事件;
    	void leaveEvent(QEvent *event);
    
    signals:
    	// 鼠标点击;
    	void signalButtonClicked(int buttonId);
    	// 鼠标松开;
    	void signalButtonReleased(int buttonId);
    
    private:
    	// 弧长及半径;
    	int m_radius, m_arcLength;
    	// 圆弧路径;
    	QList<QPainterPath> m_arcPathList;
    	QList<QPainterPath> m_textPathList;
    	// 圆弧颜色;
    	QList<QBrush> m_colorList;
    	// 当前鼠标按钮/进入 按钮的索引;
    	int m_pressIndex, m_enterIndex;
    	// 鼠标事件标志位;
    	bool m_isMousePressed;
    	bool m_isMouseEntered;
    	
    };
    
    

    可以自己设置颜色,文字,圆弧角度,圆弧按钮数目,圆弧长度等,也可以以此为基础进行拓展。以上就完成了不规则按钮之自绘圆盘式按钮。其他类似不规则的按钮也可以通过自绘实现,没有做不到,只有想不到。

    这里写图片描述 这里写图片描述

    加群下载源码 311750285

    参考

    Qt之图形(绘制漂亮的圆弧)

    展开全文
  • js框架jquery实现灯光圆盘抽奖程序活动特效 源代码下载地址:http://www.zuidaima.com/share/1796540618558464.htm
  • 1、纯CSS3/SVG实现的带秒针表盘圆盘复古时钟 现在的网页上圆盘时钟越来越少见了,更多的是数字时钟和数字日历。之前我们分享过一些基于jQuery和CSS3的圆盘时钟动画,比如纯CSS3 3D立体圆盘时钟动画和jQuery实现一个...
  • 前端时间公司项目要求做一个特效的滑动选择器,效果如下图的样子: 功能要求:两边的半圆形转盘可以转动... 半圆形的滚动的转盘自定义view继承viewgroup,重写滑动事件,自定义圆盘上图片的摆放角度,至于蓝色...
  • 三根杆子ABC,A上有N个穿孔圆盘圆盘尺寸由下到上依次变小,将所有圆盘移动到C盘并遵守如下规则: a每次只能移动一个圆盘; b始终保持大盘在下小盘再上。 思想: 分而治之:把一个富足的大规模问题分解成若干相似...
  • HTML5+Canvas制作的幻彩旋转圆盘特效 body {background: #000;color: #aaa;font: 100%/20px helvetica;}canvas {display: block;height: 100%;left: 0;margin: 0;padding: 0;position: absolute;top: 0;width: 100%}...
  • create_line() 需要两个起始点,若以一个定点转动写动点的坐标比较麻烦,如下图自定义一个画直线函数,以角度和长度为变量来作图。 代码如下: 同样的时间间隔,看上去Line1()比Line2()“转得快”2倍。...
  • 请不要给我长篇作业,因为这意味着我骑山地车的时间会减少...... 这个软件包主要是在 1995、1998 年的夏天编写的(因此有些 bug 已经存在 10 年了:-) 别绝望! 某些部件工作正常,图形相当不错。 我在教学(转子...
  • 边缘发光效果的两种写法

    千次阅读 2016-03-25 10:18:54
    我们可以看到很多游戏经常会有这种模型边缘发光的效果,看起来很高大上的样子。其实实现起来挺简单的,网上也有很多这样的例子分享,现在我也来分享一下两种Shader实现的代码吧。 1.Surface Shader ...
  • M个工作人员每人一张磁卡,卡上有开锁的密码特征。为了确保安全,规定至少要有N个人同时使用各自的磁卡才能将锁打开。问电子锁上至 少要有多少种特征? 每个人的磁卡上至少要有多少特征? 如果特征的编号以小写...
  • HTML5 Canvas实现3D旋转物体动画及模糊发光特效源码

    千次下载 热门讨论 2014-09-01 17:57:01
    这是一款HTML5实现的3D动画是旋转物体特效源码,并且利用CSS3的特性,物体会发出模糊的发光的动画特效,附带旋转效果,整体特效看起来炫酷十足。
  • 理论上像圆盘染色一样的递推是正确的 实际上只有50分 过分!!! 没办法;(??????‘;’) 只能强硬的矩阵乘法 随便你什么矩阵乘法 自己去研究 (我错了….代码丢给你们….各位看官相信...
  • H(n)=H(n-1)+1+H(n-1) 先将(n-1)个圆盘放到辅助柱上,再将最大的放到目标柱上,最后把辅助柱上的(n-1)个放到目标住上。(2的n次方-1) G题递归代码: 一个朋友跟我说,他并不理解递归,但是他会用,就让我很惊奇...
  • 【3】类星体是星系中心(或核)特别明亮的物体,被认为是通过将气体吸收到超大质量黑洞周围的圆盘中产生的。 然而,对实际到达吸积盘的流入的明确观察是难以捉摸的。2019年9月4日, 中国极地研究中心周宏岩 ,中国...
  • 现在看来,还不是因为自己菜,哎~~~ FY-4A数据的预处理主要也就是个几何校正和反射率数据的获取,那篇博客在我去年发现新方法后就在CSDN了,以免大家再浪费时间,经过我的验证那个方法并没有问题,而且不需要编程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,816
精华内容 726
关键字:

圆盘法