<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>finalshares (finalshares)</title>
    <link>https://ruby-china.org/finalshares</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>蓝灯 Android 版 出来啦！   可以科学上网</title>
      <description>&lt;p&gt;Lantern 是一款开源软件，任何人都可以查看 源代码来获知其工作机制，自己做出判断。我们非常欢迎安全专家来审计，你也可以自己编译出软件包的哦！ &lt;/p&gt;

&lt;p&gt;关于蓝灯的 Q&amp;amp;A: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;谁开发了 Lantern？ 
Lantern 由 Brave New Software Project, Inc 开发。这是一个 501(c)3 的非赢利机构，专注于用软件解决艰巨的全球性问题。Brave New Software 的创始人，也是 Lantern 的首席开发者，Adam Fisk，曾是 P2P 文件共享服务 LimeWire 和 LittleShoot 的主力程序员。在搭建 P2P 架构的过程中，他发现同样的架构也能用于提供不受限制的互联网访问。 &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;上图：
&lt;img src="https://l.ruby-china.com/photo/2016/4064ad68b3aa43dcdab7f2568580cc7a.png" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/d39ba6e2d6aba3712906b9872dbba32f.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;界面非常干净&lt;/p&gt;

&lt;p&gt;#&lt;a href="http://finalshares.com/read-1026?ruby-china-44908" rel="nofollow" target="_blank" title=""&gt;下载地址&lt;/a&gt;#&lt;/p&gt;</description>
      <author>finalshares</author>
      <pubDate>Wed, 24 Feb 2016 12:25:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/29078</link>
      <guid>https://ruby-china.org/topics/29078</guid>
    </item>
    <item>
      <title>一个绚丽的 loading 动效分析与实现！</title>
      <description>&lt;p&gt;前两天我们这边的头儿给我说，有个 gif 动效很不错，可以考虑用来做项目里的 loading，问我能不能实现，看了下效果确实不错，也还比较有新意，复杂度也不是非常高，所以就花时间给做了，我们先一起看下原 gif 图效果： &lt;/p&gt;
&lt;h2 id="源码下载"&gt;&lt;a href="http://finalshares.com/read-6767?ruby-5426" rel="nofollow" target="_blank" title=""&gt;源码下载&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://finalshares.cn/attachment/1601/thread/81_15_e6ca53883925a24.gif" title="" alt="Alt text"&gt;&lt;/p&gt;

&lt;p&gt;从效果上看，我们需要考虑以下几个问题： 
1.叶子的随机产生； 
2.叶子随着一条正余弦曲线移动； 
3.叶子在移动的时候旋转，旋转方向随机，正时针或逆时针； 
4.叶子遇到进度条，似乎是融合进入； 
5.叶子不能超出最左边的弧角； 
7.叶子飘出时的角度不是一致，走的曲线的振幅也有差别，否则太有规律性，缺乏美感； &lt;/p&gt;

&lt;p&gt;总的看起来，需要注意和麻烦的地方主要是以上几点，当然还有一些细节问题，比如最左边是圆弧等等； 
那接下来我们将效果进行分解，然后逐个击破： 
整个效果来说，我们需要的图主要是飞动的小叶子和右边旋转的风扇，其他的部分都可以用色值进行绘制，当然我们为了方便，就连底部框一起切了； 
先从 gif 图里把飞动的小叶子和右边旋转的风扇、底部框抠出来，小叶子图如下： &lt;/p&gt;

&lt;p&gt;我们需要处理的主要有两个部分： &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;随着进度往前绘制的进度条； &lt;/li&gt;
&lt;li&gt;不断飞出来的小叶片； &lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="复制代码"&gt;&lt;a href="http://finalshares.com/read-6767?ruby-5426" rel="nofollow" target="_blank" title=""&gt;复制代码&lt;/a&gt;&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;mProgressWidth为进度条的宽度&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;根据当前进度算出进度条的位置&lt;/span&gt;  
&lt;span class="n"&gt;mCurrentProgressPosition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mProgressWidth&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mProgress&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="no"&gt;TOTAL_PROGRESS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;即当前位置在图中所示1范围内&lt;/span&gt;  
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mCurrentProgressPosition&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;mArcRadius&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="no"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"mProgress = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mProgress&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"---mCurrentProgressPosition = "&lt;/span&gt;  
            &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mCurrentProgressPosition&lt;/span&gt;  
            &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"--mArcProgressWidth"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mArcRadius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制白色ARC&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;绘制orange&lt;/span&gt; &lt;span class="no"&gt;ARC&lt;/span&gt;  
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制白色矩形&lt;/span&gt;  

    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制白色ARC&lt;/span&gt;  
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawArc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mArcRectF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mWhitePaint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制白色矩形&lt;/span&gt;  
    &lt;span class="n"&gt;mWhiteRectF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mArcRightLocation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mWhiteRectF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mWhitePaint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制棕色&lt;/span&gt; &lt;span class="no"&gt;ARC&lt;/span&gt;  
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;单边角度&lt;/span&gt;  
    &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toDegrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;acos&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;mArcRadius&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mCurrentProgressPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
            &lt;span class="sr"&gt;/ (float) mArcRadius));  
    /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;起始的位置&lt;/span&gt;  
    &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;startAngle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;扫过的角度&lt;/span&gt;  
    &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sweepAngle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="no"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"startAngle = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;startAngle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawArc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mArcRectF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;startAngle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sweepAngle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mOrangePaint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="no"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"mProgress = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mProgress&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"---transfer-----mCurrentProgressPosition = "&lt;/span&gt;  
            &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mCurrentProgressPosition&lt;/span&gt;  
            &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"--mArcProgressWidth"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mArcRadius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制white&lt;/span&gt; &lt;span class="no"&gt;RECT&lt;/span&gt;  
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制Orange&lt;/span&gt; &lt;span class="no"&gt;ARC&lt;/span&gt;  
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制orange&lt;/span&gt; &lt;span class="no"&gt;RECT&lt;/span&gt;  

    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制white&lt;/span&gt; &lt;span class="no"&gt;RECT&lt;/span&gt;  
    &lt;span class="n"&gt;mWhiteRectF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mCurrentProgressPosition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mWhiteRectF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mWhitePaint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制Orange&lt;/span&gt; &lt;span class="no"&gt;ARC&lt;/span&gt;  
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawArc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mArcRectF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mOrangePaint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;绘制orange&lt;/span&gt; &lt;span class="no"&gt;RECT&lt;/span&gt;  
    &lt;span class="n"&gt;mOrangeRectF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mArcRightLocation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="n"&gt;mOrangeRectF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mCurrentProgressPosition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mOrangeRectF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mOrangePaint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;——————————————————————————————————————————————————————————————————————————————————————————————&lt;/p&gt;
&lt;h2 id="源码下载"&gt;&lt;a href="http://finalshares.com/read-6767?ruby-5426" rel="nofollow" target="_blank" title=""&gt;源码下载&lt;/a&gt;&lt;/h2&gt;</description>
      <author>finalshares</author>
      <pubDate>Fri, 19 Feb 2016 16:49:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/29036</link>
      <guid>https://ruby-china.org/topics/29036</guid>
    </item>
  </channel>
</rss>
