首页 文章 精选 留言 我的

精选列表

搜索[开源工作流引擎],共10000篇文章
优秀的个人博客,低调大师

【原】Github系列之三:开源iOS下 渐变颜色的进度条WGradientProgress

概述 今天我们来实现一个iOS平台上的进度条(progress bar or progress view)。这种进度条比APPLE自带的更加漂亮,更加有“B格”。它拥有渐变的颜色,而且这种颜色是动态移动的,这里称之为WGradientProgress。 先来看看我们的目标长什么样子: WGradientProgress的使用方法很简单,主要有展示接口以及隐藏接口,目前显示的位置有两种选择: WProgressPosDown //progress is on the down border of parent view,显示在parent view的底部(主流做法,默认) WProgressPosUp //progress is on the up border of parent view,也就是显示在parent view的顶部 主要的接口有以下几个: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 + (WGradientProgress *)sharedInstance; /** * the main interface to show WGradientProgress obj, position is WProgressPosDown by default. * * @param parentView which view to be attach */ - ( void )showOnParent:(UIView *)parentView; /** * the main interface to show WGradientProgress obj * * @param parentView which view to be attach * @param pos up or down */ - ( void )showOnParent:(UIView *)parentView position:(WProgressPos)pos; /** * the main interface to hide WGradientProgress obj */ - ( void )hide; 分析 这里我们看一下,实现出这样的效果需要解决哪些技术难点: 如何实现一个静态的具有渐变颜色的色带 如何实现色带颜色循环移动 如何关联进度值与色带的宽度 (1)如何实现一个静态的具有渐变颜色的色带 这里需要使用CALayer的子类CAGradientLayer。CAGradientLayer用于实现颜色渐变,关于CAGradietnLayer的介绍请看这里。我们使用到的属性有startPoint、endPoint、colors。 我们可以这样子做出一个静态的渐变色带,你也可以修改colors数组来实现不同颜色的色带: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 if ( self .gradLayer == nil ) { self .gradLayer = [CAGradientLayer layer]; self .gradLayer.frame = self .bounds; //尺寸要与view的layer一致 } self .gradLayer.startPoint = CGPointMake(0, 0.5); self .gradLayer.endPoint = CGPointMake(1, 0.5); //create colors, important section NSMutableArray *colors = [ NSMutableArray array]; for ( NSInteger deg = 0; deg <= 360; deg += 5) { UIColor *color; color = [UIColor colorWithHue:1.0 * deg / 360.0 saturation:1.0 brightness:1.0 alpha:1.0]; [colors addObject:( id )[color CGColor]]; } [ self .gradLayer setColors:[ NSArray arrayWithArray:colors]]; (2)如何实现色带颜色循环移动 色带颜色循环向前移动,本质上是渐变图层gradientLayer的colors数组循环变化。如果理解了这点,那就很容易往下做了。我的做法是使用定时器NSTimer,让定时器的执行方法去循环地改变color数组。另外,既然要做到循环,那么应该循环地取colors数组的最后一个颜色值插到数组开始处。定时器的执行代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 /** * here I use timer to circularly move colors */ - ( void )setupTimer { CGFloat interval = 0.03; if ( self .timer == nil ) { self .timer = [ NSTimer timerWithTimeInterval:interval target: self selector: @selector (timerFunc) userInfo: nil repeats: YES ]; } [[ NSRunLoop currentRunLoop] addTimer: self .timer forMode: NSDefaultRunLoopMode ]; } /** * rearrange color array */ - ( void )timerFunc { CAGradientLayer *gradLayer = self .gradLayer; NSMutableArray *copyArray = [ NSMutableArray arrayWithArray:[gradLayer colors]]; UIColor *lastColor = [copyArray lastObject]; [copyArray removeLastObject]; if (lastColor) { [copyArray insertObject:lastColor atIndex:0]; } [ self .gradLayer setColors:copyArray]; } *强势插入: NSTimer的启动、暂停、永远停止这三个操作要分清,尤其是暂停与停止: 启动: 1 2 3 4 5 6 - ( void )startTimer { //start timer [[ NSRunLoop currentRunLoop] addTimer: self .timer forMode: NSDefaultRunLoopMode ]; [ self .timer setFireDate:[ NSDate date]]; } 暂停: 1 2 3 4 5 6 7 8 /** * here we just pause timer, rather than stopping forever. * NOTE: [timer invalidate] is not fit here. */ - ( void )pauseTimer { [ self .timer setFireDate:[ NSDate distantFuture]]; } 停止(无法再启动): 1 [ self .timer invalidate] (3)如何关联进度值与色带的宽度 这个问题看起来很简单,但实际上隐藏着一个很好用的技术:mask。mask也称为蒙版,当我们给一个layer设置了mask layer后,layer就只显示出mask layer所覆盖到的区域,其他区域不显示。用伪代码可以描述为: 1 2 3 CALayer *layer = new layer.mask = _maskLayer; layer.visualSection = _maskLayer.bounds; 因此,我们可以将在一开始时就上文的渐变图层gradientLayer大小设置为与view同尺寸,然后通过mask layer设置可见区域。这样,进度条进度值设置问题就转化为mask layer的宽度问题了。 首先,我们添加一个mask layer到gradient layer上: 1 2 3 4 5 6 7 self .mask = [CALayer layer]; [ self .mask setFrame:CGRectMake( self .gradLayer.frame.origin.x, self .gradLayer.frame.origin.y, self .progress * self .width, self .height)]; self .mask.borderColor = [[UIColor blueColor] CGColor]; self .mask.borderWidth = 2; [ self .gradLayer setMask: self .mask]; [ self .layer addSublayer: self .gradLayer]; 然后相应进度值的改变如下: 1 2 3 4 5 6 7 8 9 10 11 12 - ( void )setProgress:(CGFloat)progress { if (progress < 0) { progress = 0; } if (progress > 1) { progress = 1; } _progress = progress; CGFloat maskWidth = progress * self .width; self .mask.frame = CGRectMake(0, 0, maskWidth, self .height); } 以上就是WGradientProgress的主要技术要点,更具体的细节以及使用方法请下载我github上的代码查看,下载时别忘记随手点个Star,给我更多支持与鼓励! 本文转自编程小翁博客园博客,原文链接:http://www.cnblogs.com/wengzilin/p/4665038.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

尝试一下Apache的开源服务吧!这是由AWS提供的

Open Source Insider令人值得关注的是,Apache Software Foundation本月接受了MXNet机器学习项目(MXNet Machine Learning)作为一个开放源代码项目。 这个公告最让人惊讶的并不是ASF在众多选择中接受了这个项目,现在在软件世界里如果没有机器学习工具就很难翻身,而是MXNet的开发人员绝大部分都来自于亚马逊,他们相信ASF是相关的。 MXNet是一个开放源代码的“深度学习”框架,允许您在各种设备上定义、训练和部署所谓的神经网络。它也恰好是Amazon Web Services(AWS)上机器学习(ML)工具的选择,并且通过已经部署好的EC2实例可用。 深度学习是目前非常流行的机器学习的子集,专注于具有非线性的分层算法,这有助于在数据集中找到模式和学习陈述。说它在发现的时候学习,这是一种奇怪的说法。由于它在语音识别、自然语言理解和推荐系统(例如Siri、Alexa等)等应用程序中取得了成功,深度学习目前广受欢迎。每次当你坐在沙发上对着Alexa大喊大叫,都是在使用深度学习系统。 亚马逊声称MXNet是该公司拥有的最具扩展性的工具,这让MXNet在现在这个阶段变得非常有趣,亚马逊可是一家知道哪些东西具有扩展性而哪些东西没有扩展性的公司。 MXNet远非深度学习领域唯一的宠儿。事实上,它加入这场游戏的时候已经有点晚了。深度学习世界中的其他流行工具包括在Facebook、谷歌和NYU使用的Torch以及微软的Adam,但也许最大的直接竞争对手是谷歌的TensorFlow。TensorFlow是开放源代码的,使用Apache许可证,并在本月发布了1.0版本,客户已经开始使用了。 谷歌在AWS上使用Tensorflow已经超过一年了。谷歌已经在旗下很多谷歌服务,例如Gmail和Google Photos上使用它,而且谷歌在2015年11月针对满怀热情的测试者们提供了一个稳定的版本,比AWS收购MXNet早了整整12个月。去年六月,谷歌声称Github上有1500个存储库提到了TensorFlow,其中只有五个来自于谷歌自己。 如果你是开放源代码世界中的新人,机器学习工具和开发人员通常都是如此,那么你对于ASF缺乏真正的了解是可以被原谅的。 即使你非常熟悉ASF,你可能仍然好奇为什么像亚马逊这样一家数十亿美元的公司会对于一个全是由志愿者组成的团体采用其宠爱的项目感到如此兴奋?要知道ASF一年的运营费用才几乎不到50万美元。 答案只用一个词就够了:社区。 ASF成立于1999年,完全由捐款资助,ASF系统首先帮助Apache HTTP服务器成为网络上最受欢迎的网络服务器。这一成功公式已经被一些最新的成功重复证实,包括Hadoop、 Spark、Tomcat和Struts。在受到对OpenOffice破坏性的控制的伤害之后,Oracle将OpenOffice放到ASF中,希望以此帮助其得到更广泛的采用。 ASF孵化器的目的是帮助外部项目提高他们的代码的质量,并参与更大的社区。它是一种开放源代码项目的盖章认可,证明项目是真正开放源代码的,并使用ASF的表决程序和ASF已经开发的所有其他的准民主治理体系,也就是被神圣化地成为Apache Way的方法。 考虑到这种社区和TensorFlow社区之间的选择,ToxFlow社区虽然是开放源代码的,但却在很大程度上受到谷歌的管理,MXNet就变得看起来更具吸引力。而且它的吸引力越大,参与的开发者就会越多,而代码也会越好。如果你从机器学习的角度来思考它的话,那么ASF就是一个开发人员的学习网络。 值得注意的是,并非所有进入ASF孵化器的项目都能够“脱离父母”。但正式的项目在能够证明自己独立于任何一个贡献者或者赞助实体之前,都不能完成孵化阶段。 孵化是一个项目成为ASF正式项目的第一步,但不能保证项目在ASF的支持下最终会成功还是终止。 孵化器的成功项目包括Cassandra、CouchDB、Mesos以及其他很多项目。还有OpenOffice,另一个孵化器的“毕业生”,但是它的风头在很大程度上被LibreOffice夺走了。 现在亚马逊希望MXNet可以从ASF学到一些技巧,或许建立一个可以帮助其赶上竞争对手的社区。作为AWS人工智能的总经理,Matt Wood表示,该项目希望成为Apache孵化器的一部分的原因是“利用Apache Software Foundation的流程、管理、外延和社区活动。 简而言之,想利用ASF的影响力来吸引更多的开发者。很容易看明白亚马逊的这一举动是完全为了自己,事实上也是如此,但这只是这个故事的开始。 也许ASF的名字不再家喻户晓,但它仍然有相当的影响力,它的治理和所谓的Apache Way真的发展出了一些令人印象深刻、发展得非常好的社区项目。由于MXNet背后的原因,它打败TensorFlow和其他产品的可能性相当大。 当然,ASF可能得到的是迄今为止最好的机器学习项目。MXNet当然是最容易部署的一种,因为已经有一个AWS深度学习AMI可用了,还有大量的预编译好并已经为使用做好准备的示例代码。之前提到的服务器实例恰好与其他AWS服务密切相关,而用户可能想要投资的服务器实例也是如此。 原文发布时间为:2017年2月26日 本文作者:作者:李超 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

时间序列数据的存储和计算 - 开源时序数据库解析(三)

InfluxDB InfluxDB在DB-Engines的时序数据库类别里排名第一,实至名归,从它的功能丰富性、易用性以及底层实现来看,都有很多的亮点,值得大篇幅来分析。 首先简单归纳下它的几个比较重要的特性: 极简架构:单机版的InfluxDB只需要安装一个binary,即可运行使用,完全没有任何的外部依赖。相比来看几个反面例子,OpenTSDB底层是HBase,拖家带口就得带上ZooKeeper、HDFS等,如果你不熟悉Hadoop技术栈,一般运维起来是有一定的难度,这也是其被人抱怨最多的一个点。KairosDB稍微好点,它依赖Cassandra和ZooKeeper,单机测试可以使用H2。总的来说,依赖一个外部的分布式数据库的TSDB,在架构上会比完全自包含的TSDB复杂一点,毕竟一个成熟的分布式数据库本身就很复杂,当然这一

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册