<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>zengwei</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://zengwei123.github.io/"/>
  <updated>2018-08-06T13:08:46.648Z</updated>
  <id>https://zengwei123.github.io/</id>
  
  <author>
    <name>zengwei</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Api总结（持续跟新）</title>
    <link href="https://zengwei123.github.io/2017/08/06/Api/"/>
    <id>https://zengwei123.github.io/2017/08/06/Api/</id>
    <published>2017-08-06T04:46:49.000Z</published>
    <updated>2018-08-06T13:08:46.648Z</updated>
    
    <content type="html"><![CDATA[<p>这里我将一些网络上找到的Api接口总结起来，方便以后使用，这里声明：所有Api，本人皆从网络获取，并非本人抓取</p><hr><p>每日一文：<a href="https://interface.meiriyiwen.com/article/today?dev=1" target="_blank" rel="noopener">https://interface.meiriyiwen.com/article/today?dev=1</a><br>wc：字数(word count)<br>特定某天一文：<a href="https://interface.meiriyiwen.com/article/day?dev=1&amp;date=" target="_blank" rel="noopener">https://interface.meiriyiwen.com/article/day?dev=1&amp;date=</a> + 日期<br>随机一文：<a href="https://interface.meiriyiwen.com/article/random?dev=1" target="_blank" rel="noopener">https://interface.meiriyiwen.com/article/random?dev=1</a><br>解析：<br>&nbsp;&nbsp;&nbsp;&nbsp;date：日期<br>&nbsp;&nbsp;&nbsp;&nbsp;curr：今日日期，yyyyMMdd 格式<br>&nbsp;&nbsp;&nbsp;&nbsp;prev：昨日日期，yyyyMMdd 格式<br>&nbsp;&nbsp;&nbsp;&nbsp;next：明日日期，yyyyMMdd 格式<br>&nbsp;&nbsp;&nbsp;&nbsp;author：作者<br>&nbsp;&nbsp;&nbsp;&nbsp;titile：标题<br>&nbsp;&nbsp;&nbsp;&nbsp;digest：首段<br>&nbsp;&nbsp;&nbsp;&nbsp;content：正文内容</p><hr><p>金山翻译：<a href="http://fy.iciba.com/ajax.php" target="_blank" rel="noopener">http://fy.iciba.com/ajax.php</a><br>url 示例：<a href="http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=auto&amp;w=hello%20world" target="_blank" rel="noopener">http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=auto&amp;w=hello%20world</a><br>拼接参数：<br>a：固定值 fy<br>f：原文内容类型，日语取 ja，中文取 zh，英语取 en，韩语取 ko，德语取 de，西班牙语取 es，法语取 fr，自动则取 auto<br>t：译文内容类型，日语取 ja，中文取 zh，英语取 en，韩语取 ko，德语取 de，西班牙语取 es，法语取 fr，自动则取 auto<br>w：查询内容</p><p>解析：<br>&nbsp;&nbsp;&nbsp;&nbsp;status：请求成功时则取 1<br>&nbsp;&nbsp;&nbsp;&nbsp;content：内容信息<br>&nbsp;&nbsp;&nbsp;&nbsp;from：原文内容类型<br>&nbsp;&nbsp;&nbsp;&nbsp;to：译文内容类型<br>&nbsp;&nbsp;&nbsp;&nbsp;vendor：来源平台<br>&nbsp;&nbsp;&nbsp;&nbsp;out：译文内容<br>&nbsp;&nbsp;&nbsp;&nbsp;err_no：请求成功时取 0</p><hr><p>必应图片：<a href="https://www.dujin.org/sys/bing/1920.php" target="_blank" rel="noopener">https://www.dujin.org/sys/bing/1920.php</a></p><hr><p>美女图片福利：<a href="http://gank.io/api/data/福利/10/1" target="_blank" rel="noopener">http://gank.io/api/data/福利/10/1</a><br>10和1可以是其他数字，自己去试区间</p><hr><p>一言： <a href="https://v1.hitokoto.cn/c=下面中的一个" target="_blank" rel="noopener">https://v1.hitokoto.cn/c=下面中的一个</a><br>a： 动画<br>b： 漫画<br>c： 游戏<br>d： 小说<br>e： 原创<br>f： 来自网络<br>g： 其他<br>其他不存在参数    任意类型随机取得</p><p>解析<br>id：本条一言的id。<br>hitokoto：一言正文。编码方式unicode。使用utf-8。<br>type：类型。请参考第三节参数的表格。<br>from：一言的出处。<br>creator：添加者。<br>created_at：添加时间。</p><hr><p>历史上的今天：<a href="http://www.ipip5.com/today/api.php?type=json" target="_blank" rel="noopener">http://www.ipip5.com/today/api.php?type=json</a></p><hr><p>美图接口api:<a href="https://pixabay.com/api/docs/" target="_blank" rel="noopener">https://pixabay.com/api/docs/</a><br>官网：<a href="https://pixabay.com/zh/" target="_blank" rel="noopener">https://pixabay.com/zh/</a> </p><hr><p>新闻API：<a href="https://fenfa.shuwen.com" target="_blank" rel="noopener">https://fenfa.shuwen.com</a></p><hr><p>更多Api:<a href="https://github.com/jokermonn/-Api" target="_blank" rel="noopener">https://github.com/jokermonn/-Api</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;这里我将一些网络上找到的Api接口总结起来，方便以后使用，这里声明：所有Api，本人皆从网络获取，并非本人抓取&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;每日一文：&lt;a href=&quot;https://interface.meiriyiwen.com/article/today?dev=1&quot; t
      
    
    </summary>
    
      <category term="Api" scheme="https://zengwei123.github.io/categories/Api/"/>
    
    
  </entry>
  
  <entry>
    <title>js选择和java图片水印清除</title>
    <link href="https://zengwei123.github.io/2017/03/01/%E8%AE%B0%E5%BD%95-js%E9%80%89%E6%8B%A9%E5%92%8Cjava%E5%9B%BE%E7%89%87%E6%B0%B4%E5%8D%B0%E6%B8%85%E9%99%A4/"/>
    <id>https://zengwei123.github.io/2017/03/01/记录-js选择和java图片水印清除/</id>
    <published>2017-03-01T08:22:44.000Z</published>
    <updated>2018-10-15T08:26:38.809Z</updated>
    
    <content type="html"><![CDATA[<p>实现网页选中效果,能够选择div中的内容</p><p></p><p><center></center></p><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">selectText(&apos;填入id&apos;);</span><br><span class="line">function selectText(element) &#123;</span><br><span class="line">            var text = document.getElementById(element);</span><br><span class="line">            if (document.body.createTextRange) &#123;</span><br><span class="line">                var range = document.body.createTextRange();</span><br><span class="line">                range.moveToElementText(text);</span><br><span class="line">                range.select();</span><br><span class="line">            &#125; else if (window.getSelection) &#123;</span><br><span class="line">                var selection = window.getSelection();</span><br><span class="line">                var range = document.createRange();</span><br><span class="line">                range.selectNodeContents(text);</span><br><span class="line">                selection.removeAllRanges();</span><br><span class="line">                selection.addRange(range);</span><br><span class="line">            &#125; else &#123;</span><br><span class="line">                alert(&quot;none&quot;);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><p></p><blockquote><p>找到一个去除水印的东西记录一下，下面是去除前和去除后，记录下</p></blockquote><p></p><p><center></center></p><p></p><p></p><p><center></center></p><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br></pre></td><td class="code"><pre><span class="line">public class ImageConverter &#123;</span><br><span class="line">    private static List&lt;File&gt; fileList = new ArrayList&lt;File&gt;();</span><br><span class="line"></span><br><span class="line">    public static void main(String[] args) &#123;</span><br><span class="line">        System.out.println(&quot;输入需要去水印的图片所在的根目录回车（支持递归子目录）：&quot;);</span><br><span class="line">        Scanner input = new Scanner(System.in);</span><br><span class="line">        String dir =&quot;C:\\Users\\zengwei\\Desktop\\112&quot;;</span><br><span class="line">        String saveDir = &quot;C:\\Users\\zengwei\\Desktop&quot;;</span><br><span class="line">        System.out.println(&quot;输入y开始&quot;);</span><br><span class="line">        String comfrm = input.nextLine().trim();</span><br><span class="line">        if (comfrm.equals(&quot;y&quot;)) &#123;</span><br><span class="line">            convertAllImages(dir, saveDir);</span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            System.out.println(&quot;您输入的不是y程序,程序退出&quot;);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        /*String dir = &quot;E:\\data\\Desktop&quot;;</span><br><span class="line">        String saveDir = &quot;E:\\data\\Desktop-convert&quot;;*/</span><br><span class="line"></span><br><span class="line">        //replaceFolderImages(dir);</span><br><span class="line">        /*String srcFile = &quot;E:\\data\\image\\img38.png&quot;;</span><br><span class="line">        String dstFile = &quot;E:\\data\\image\\img38.png&quot;;</span><br><span class="line">        long begin = System.currentTimeMillis();</span><br><span class="line">        repleaceColor(srcFile, dstFile);</span><br><span class="line">        long time = System.currentTimeMillis() - begin;</span><br><span class="line">        System.out.println(time);*/</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    private static void convertAllImages(String dir, String saveDir) &#123;</span><br><span class="line">        File dirFile = new File(dir);</span><br><span class="line">        File saveDirFile = new File(saveDir);</span><br><span class="line">        dir = dirFile.getAbsolutePath();</span><br><span class="line">        saveDir = saveDirFile.getAbsolutePath();</span><br><span class="line">        loadImages(new File(dir));</span><br><span class="line">        for (File file : fileList) &#123;</span><br><span class="line">            String filePath = file.getAbsolutePath();</span><br><span class="line"></span><br><span class="line">            String dstPath = saveDir + filePath.substring(filePath.indexOf(dir) + dir.length(), filePath.length());</span><br><span class="line">            System.out.println(&quot;converting: &quot; + filePath);</span><br><span class="line">            replaceColor(file.getAbsolutePath(), dstPath);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public static void loadImages(File f) &#123;</span><br><span class="line">        if (f != null) &#123;</span><br><span class="line">            if (f.isDirectory()) &#123;</span><br><span class="line">                File[] fileArray = f.listFiles();</span><br><span class="line">                if (fileArray != null) &#123;</span><br><span class="line">                    for (int i = 0; i &lt; fileArray.length; i++) &#123;</span><br><span class="line">                        //递归调用</span><br><span class="line">                        loadImages(fileArray[i]);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; else &#123;</span><br><span class="line">                String name = f.getName();</span><br><span class="line">                if (name.endsWith(&quot;png&quot;) || name.endsWith(&quot;jpg&quot;)) &#123;</span><br><span class="line">                    fileList.add(f);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    private static void replaceFolderImages(String dir) &#123;</span><br><span class="line">        File dirFile = new File(dir);</span><br><span class="line">        File[] files = dirFile.listFiles(new FileFilter() &#123;</span><br><span class="line">            public boolean accept(File file) &#123;</span><br><span class="line">                String name = file.getName();</span><br><span class="line">                if (name.endsWith(&quot;png&quot;) || name.endsWith(&quot;jpg&quot;)) &#123;</span><br><span class="line">                    return true;</span><br><span class="line">                &#125;</span><br><span class="line">                return false;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">        for (File img : files) &#123;</span><br><span class="line">            replaceColor(img.getAbsolutePath(), img.getAbsolutePath());</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    private static void replaceColor(String srcFile, String dstFile) &#123;</span><br><span class="line">        try &#123;</span><br><span class="line">            Color color = new Color(255, 195, 195);</span><br><span class="line">            replaceImageColor(srcFile, dstFile, color, Color.WHITE);</span><br><span class="line">        &#125; catch (IOException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public static void replaceImageColor(String file, String dstFile, Color srcColor, Color targetColor) throws IOException &#123;</span><br><span class="line">        URL http;</span><br><span class="line">        if (file.trim().startsWith(&quot;https&quot;)) &#123;</span><br><span class="line">            http = new URL(file);</span><br><span class="line">            HttpsURLConnection conn = (HttpsURLConnection) http.openConnection();</span><br><span class="line">            conn.setRequestMethod(&quot;GET&quot;);</span><br><span class="line">        &#125; else if (file.trim().startsWith(&quot;http&quot;)) &#123;</span><br><span class="line">            http = new URL(file);</span><br><span class="line">            HttpURLConnection conn = (HttpURLConnection) http.openConnection();</span><br><span class="line">            conn.setRequestMethod(&quot;GET&quot;);</span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            http = new File(file).toURI().toURL();</span><br><span class="line">        &#125;</span><br><span class="line">        BufferedImage bi = ImageIO.read(http.openStream());</span><br><span class="line">        if(bi == null)&#123;</span><br><span class="line">            return;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        Color wColor = new Color(255, 255, 255);</span><br><span class="line">        for (int i = 0; i &lt; bi.getWidth(); i++) &#123;</span><br><span class="line">            for (int j = 0; j &lt; bi.getHeight(); j++) &#123;</span><br><span class="line">                //System.out.println(bi.getRGB(i, j));</span><br><span class="line">                int color = bi.getRGB(i, j);</span><br><span class="line">                Color oriColor = new Color(color);</span><br><span class="line">                int red = oriColor.getRed();</span><br><span class="line">                int greed = oriColor.getGreen();</span><br><span class="line">                int blue = oriColor.getBlue();</span><br><span class="line">                //粉色</span><br><span class="line">                if (greed &lt; 190 || blue &lt; 190) &#123;</span><br><span class="line"></span><br><span class="line">                &#125; else &#123;</span><br><span class="line">                    if (red == 255 &amp;&amp; greed &gt; 180 &amp;&amp; blue &gt; 180) &#123;</span><br><span class="line">                        bi.setRGB(i, j, wColor.getRGB());</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        String type = file.substring(file.lastIndexOf(&quot;.&quot;) + 1, file.length());</span><br><span class="line">        Iterator&lt;ImageWriter&gt; it = ImageIO.getImageWritersByFormatName(type);</span><br><span class="line">        ImageWriter writer = it.next();</span><br><span class="line">        File f = new File(dstFile);</span><br><span class="line">        f.getParentFile().mkdirs();</span><br><span class="line">        ImageOutputStream ios = ImageIO.createImageOutputStream(f);</span><br><span class="line">        writer.setOutput(ios);</span><br><span class="line">        writer.write(bi);</span><br><span class="line">        bi.flush();</span><br><span class="line">        ios.flush();</span><br><span class="line">        ios.close();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;实现网页选中效果,能够选择div中的内容&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;center&gt;&lt;/center&gt;&lt;/p&gt;&lt;br&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span clas
      
    
    </summary>
    
      <category term="笔记" scheme="https://zengwei123.github.io/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
  </entry>
  
  <entry>
    <title>第三方库Gson</title>
    <link href="https://zengwei123.github.io/2017/02/21/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93Gson/"/>
    <id>https://zengwei123.github.io/2017/02/21/第三方库Gson/</id>
    <published>2017-02-21T08:26:48.000Z</published>
    <updated>2018-10-12T08:29:22.424Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>JSON是一种文本形式的数据交换格式，它比XML更轻量、比二进制容易阅读和编写，调式也更加方便。而Gson就是一种解析JSON文本形式的库。</p></blockquote><p>Gson能够将javaBean转成JSON格式，也能够将JSON转成JavaBean,下面我们来看Gson怎么使用的。</p><h3 id="1-基本使用"><a href="#1-基本使用" class="headerlink" title="1.基本使用"></a>1.基本使用</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Test</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> String name;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> age;</span><br><span class="line">    <span class="keyword">private</span> String see;</span><br><span class="line">    <span class="keyword">private</span> String father;</span><br><span class="line">...</span><br><span class="line"><span class="comment">//省略其他toString、get、set、构造方法</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] s)</span></span>&#123;</span><br><span class="line"><span class="comment">/**转json**/</span></span><br><span class="line">Test test=<span class="keyword">new</span> Test(<span class="string">"大傻逼"</span>,<span class="number">11</span>,<span class="string">"男"</span>,<span class="string">"大蠢货"</span>);</span><br><span class="line"><span class="comment">//主要下下面两行</span></span><br><span class="line">    Gson gson=<span class="keyword">new</span> Gson();   </span><br><span class="line">    String jsonData = gson.toJson(test);</span><br><span class="line">    System.out.println(jsonData);</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * &#123;"name":"大傻","age":33,"see":"男","father":"大臭"&#125;</span></span><br><span class="line"><span class="comment"> * 转javaBean</span></span><br><span class="line"><span class="comment"> **/</span></span><br><span class="line">    String jsonData=<span class="string">"&#123;\"name\":\"大傻\",\"age\":33,\"see\":\"男\",\"father\":\"大臭\"&#125;"</span>;</span><br><span class="line">    Gson gson=<span class="keyword">new</span> Gson();</span><br><span class="line">    Test test = gson.fromJson(jsonData, Test.class);</span><br><span class="line">    System.out.println(test.toString());</span><br><span class="line">&#125;</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>上面就是一个普通的javaBean的序列化与反序列换功能，用到的是<strong>toJson()</strong>和<strong>fromJson()</strong>两个方法。有时候我们的对象并不是这样简单的，里面可能有集合有对象有数组，那么该如何使用？这里的化跟上面的使用方法是一样的。</p><h3 id="2-Gson注解"><a href="#2-Gson注解" class="headerlink" title="2.Gson注解"></a>2.Gson注解</h3><p>主要有两个重要的注解<strong>@SerializedName</strong>和<strong>@Expose</strong>，前者主要是用来指定该字段在JSON中对应的字段名称，后者能够指定该字段是否能够序列化或者反序列化。</p><p>1.首先来看看<strong>@SerializedName</strong>注解，这个注解可以将改变字段的名字，使用场景，比如：后台给了一串json数据，但是他的字段名跟你的字段名起的不一样，这样子就可以使用这个注解来进行解析，可以不用统一前后端的命名。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Test2</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> String occupation;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> wages;</span><br><span class="line">    <span class="keyword">private</span> String company;</span><br><span class="line">    <span class="meta">@SerializedName</span>(<span class="string">"测试"</span>) <span class="comment">//注解修改输出的字段名称</span></span><br><span class="line">    <span class="keyword">private</span> Test test;</span><br><span class="line">...</span><br><span class="line"><span class="comment">//省略其他toString、get、set、构造方法</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>下面序列化输出</p><p></p><p><center><img src="/2017/02/21/第三方库Gson/1.png"></center></p><br>下面反序列化，如果后台给的数据是上面样的，但是我们不指定字段名，反序列化输出就是这样的。<p></p><p></p><p><center><img src="/2017/02/21/第三方库Gson/2.png"></center></p><br>可以注意到test这个对象是空的，但是我们指定后呢就可以正常输出了<p></p><p></p><p><center><img src="/2017/02/21/第三方库Gson/3.png"></center></p><br>这里，为POJO字段提供备选属性名<br><strong>SerializedName</strong>注解提供了两个属性，上面用到了其中一个，别外还有一个属性alternate，接收一个String数组。<br>注：alternate需要2.4版本<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@SerializedName</span>(value=<span class="string">"测试"</span>,alternate=&#123;<span class="string">"a"</span>,<span class="string">"b"</span>&#125;)</span><br><span class="line">    <span class="keyword">private</span> Test test;</span><br></pre></td></tr></table></figure><p></p><p>当上面的三个属性(测试、a、b)都中出现任意一个时均可以得到正确的结果。当多种情况同时出时，以最后一个出现的值为准。</p><p>2.再来看看<strong>@Expose</strong>这个注解，有时候我们序列化或者反序列化的时候，有一个字段我不想看到他就可以用这个注解来指定,<strong>serialize</strong>用来指定序列化是否输出，<strong>deserialize</strong>是用来指定反序列化是否输出，true为输出，false为不输出<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Expose</span>(serialize =<span class="keyword">true</span>,deserialize =<span class="keyword">true</span>)</span><br><span class="line">    <span class="keyword">private</span> String name;</span><br><span class="line">    <span class="meta">@Expose</span>(serialize =<span class="keyword">false</span>,deserialize =<span class="keyword">false</span>)</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> age;</span><br><span class="line">    <span class="meta">@Expose</span>(serialize =<span class="keyword">true</span>,deserialize =<span class="keyword">true</span>)</span><br><span class="line">    <span class="keyword">private</span> String see;</span><br><span class="line">    <span class="meta">@Expose</span>(serialize =<span class="keyword">false</span>,deserialize =<span class="keyword">false</span>)</span><br><span class="line">    <span class="keyword">private</span> String father;</span><br><span class="line">...</span><br><span class="line"><span class="comment">//省略其他toString、get、set、构造方法</span></span><br><span class="line">&#125;</span><br><span class="line">.........................</span><br><span class="line"><span class="comment">//这种情况的话，Gson的使用方式就有点变化了</span></span><br><span class="line"> Gson gson=<span class="keyword">new</span> GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); <span class="comment">//需要这样来获取</span></span><br></pre></td></tr></table></figure></p><h3 id="3-Gson使用泛型"><a href="#3-Gson使用泛型" class="headerlink" title="3.Gson使用泛型"></a>3.Gson使用泛型</h3><p>当我们想用Gson来输出集合的时候，我们需要使用<strong>TypeToken</strong>来实现对泛型的支持<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Gson gson = <span class="keyword">new</span> Gson();</span><br><span class="line">...</span><br><span class="line">gson.toJson(arrayList, <span class="keyword">new</span> TypeToken&lt;ArrayList&lt;String&gt;&gt;() &#123;&#125;.getType());</span><br></pre></td></tr></table></figure></p><p>我们在实际开发中是不可能只有一个Model的，会有多个，但是在使用序列化和反序列化的同时候不可能给每一个Model都写一方法。知道Gson可以支持泛型，那么我们就来进行一下封装。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">TJson</span>&lt;<span class="title">T</span>&gt; </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> String state;   <span class="comment">//说明</span></span><br><span class="line">    <span class="keyword">private</span> String code;    <span class="comment">//状态码</span></span><br><span class="line">    <span class="keyword">private</span> T date;   <span class="comment">//这个就是我们实际的数据</span></span><br><span class="line">...</span><br><span class="line"><span class="comment">//省略其他toString、get、set、构造方法</span></span><br><span class="line">&#125;</span><br><span class="line">...</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] s)</span></span>&#123;</span><br><span class="line"><span class="comment">/**泛型封装**/</span></span><br><span class="line">    TJson&lt;Test&gt; testTJson=<span class="keyword">new</span> TJson&lt;Test&gt;(<span class="string">"ok_error"</span>,<span class="string">"0"</span>,<span class="keyword">new</span> Test(<span class="string">"大傻逼"</span>,<span class="number">11</span>,<span class="string">"男"</span>,<span class="string">"大蠢货"</span>));</span><br><span class="line">    Gson gson = <span class="keyword">new</span> Gson();</span><br><span class="line">    String s1=gson.toJson(testTJson, <span class="keyword">new</span> TypeToken&lt;TJson&lt;Test&gt;&gt;() &#123;&#125;.getType());</span><br><span class="line">    System.out.println(s1);</span><br><span class="line">&#125;</span><br><span class="line">...</span><br></pre></td></tr></table></figure></p><p>输出后就是下面这个样子</p><p></p><p><center><img src="/2017/02/21/第三方库Gson/4.png"></center></p><br>贴一个Gson学习的帖子:<a href="https://www.jianshu.com/p/e740196225a4" target="_blank" rel="noopener">https://www.jianshu.com/p/e740196225a4</a><p></p><p>贴一个封装<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">GsonUtil</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Gson gson = <span class="keyword">null</span>;</span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (gson == <span class="keyword">null</span>) &#123;</span><br><span class="line">            gson = <span class="keyword">new</span> Gson();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="title">GsonUtil</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 转成json</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> object</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> String <span class="title">GsonString</span><span class="params">(Object object)</span> </span>&#123;</span><br><span class="line">        String gsonString = <span class="keyword">null</span>;</span><br><span class="line">        <span class="keyword">if</span> (gson != <span class="keyword">null</span>) &#123;</span><br><span class="line">            gsonString = gson.toJson(object);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> gsonString;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 转成bean</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> gsonString</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> cls</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; <span class="function">T <span class="title">GsonToBean</span><span class="params">(String gsonString, Class&lt;T&gt; cls)</span> </span>&#123;</span><br><span class="line">        T t = <span class="keyword">null</span>;</span><br><span class="line">        <span class="keyword">if</span> (gson != <span class="keyword">null</span>) &#123;</span><br><span class="line">            t = gson.fromJson(gsonString, cls);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> t;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">   <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 转成list</span></span><br><span class="line"><span class="comment">     * 泛型在编译期类型被擦除导致报错</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> gsonString</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> cls</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; <span class="function">List&lt;T&gt; <span class="title">GsonToList</span><span class="params">(String gsonString, Class&lt;T&gt; cls)</span> </span>&#123;</span><br><span class="line">        List&lt;T&gt; list = <span class="keyword">null</span>;</span><br><span class="line">        <span class="keyword">if</span> (gson != <span class="keyword">null</span>) &#123;</span><br><span class="line">            list = gson.fromJson(gsonString, <span class="keyword">new</span> TypeToken&lt;List&lt;T&gt;&gt;() &#123;</span><br><span class="line">            &#125;.getType());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> list;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 转成list</span></span><br><span class="line"><span class="comment">     * 解决泛型问题</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> json</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> cls</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> &lt;T&gt;</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> &lt;T&gt; <span class="function">List&lt;T&gt; <span class="title">jsonToList</span><span class="params">(String json, Class&lt;T&gt; cls)</span> </span>&#123;</span><br><span class="line">        Gson gson = <span class="keyword">new</span> Gson();</span><br><span class="line">        List&lt;T&gt; list = <span class="keyword">new</span> ArrayList&lt;T&gt;();</span><br><span class="line">        JsonArray array = <span class="keyword">new</span> JsonParser().parse(json).getAsJsonArray();</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">final</span> JsonElement elem : array)&#123;</span><br><span class="line">            list.add(gson.fromJson(elem, cls));</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> list;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 转成list中有map的</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> gsonString</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; List&lt;Map&lt;String, T&gt;&gt; GsonToListMaps(String gsonString) &#123;</span><br><span class="line">        List&lt;Map&lt;String, T&gt;&gt; list = <span class="keyword">null</span>;</span><br><span class="line">        <span class="keyword">if</span> (gson != <span class="keyword">null</span>) &#123;</span><br><span class="line">            list = gson.fromJson(gsonString,</span><br><span class="line">                    <span class="keyword">new</span> TypeToken&lt;List&lt;Map&lt;String, T&gt;&gt;&gt;() &#123;</span><br><span class="line">                    &#125;.getType());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> list;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 转成map的</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> gsonString</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; <span class="function">Map&lt;String, T&gt; <span class="title">GsonToMaps</span><span class="params">(String gsonString)</span> </span>&#123;</span><br><span class="line">        Map&lt;String, T&gt; map = <span class="keyword">null</span>;</span><br><span class="line">        <span class="keyword">if</span> (gson != <span class="keyword">null</span>) &#123;</span><br><span class="line">            map = gson.fromJson(gsonString, <span class="keyword">new</span> TypeToken&lt;Map&lt;String, T&gt;&gt;() &#123;</span><br><span class="line">            &#125;.getType());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> map;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;JSON是一种文本形式的数据交换格式，它比XML更轻量、比二进制容易阅读和编写，调式也更加方便。而Gson就是一种解析JSON文本形式的库。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gson能够将javaBean转成JSON格式，也能够将JSON
      
    
    </summary>
    
      <category term="第三方库" scheme="https://zengwei123.github.io/categories/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93/"/>
    
    
  </entry>
  
  <entry>
    <title>Linux后台运行</title>
    <link href="https://zengwei123.github.io/2017/02/18/Linux%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C/"/>
    <id>https://zengwei123.github.io/2017/02/18/Linux后台运行/</id>
    <published>2017-02-18T08:32:48.000Z</published>
    <updated>2018-11-09T08:35:05.716Z</updated>
    
    <content type="html"><![CDATA[<p>当我们用远程登陆Linux的显示出的黑窗口，然后通过各种手段好不容易将程序跑起来。关闭窗口后，程序也带着关闭了。这时就需要了解一下怎么在Linux后台运行程序了，很简单你只需要几条命令，就可以做到了。</p><p>正文<br>关于Linux后台运行实现。有两种方式，下面就来看看吧</p><blockquote><p>运行环境:Centos 7.2 *64</p></blockquote><p>第一种:nohup<br>快速上手<strong> nohup 你的运行程序命令 &amp; </strong>，然后按下<strong>Enter</strong>就可以了。</p><p>比如我要运行<strong>demo.py</strong>脚本。那么我就这样:<strong>nohup python demo.py &amp;</strong>执行这条命令就已经完成了后台运行，关于程序的输出，你可以在你文件的同级目录下发现<strong>nohup.out</strong>文件，打开就是你运行程序的输出数据。</p><p>有关更多的**nohup命令使用方法可以百度学习</p><p>第二种:screen<br>使用<strong>scrren</strong>命令，更加纯粹暴力，它的原理是在后台运行一个黑窗口，这个窗口不是远程的看见的黑窗口，在它的黑窗口中，你可以运行任何你想运行的后台程序。</p><p><strong>screen -S   name </strong></p><p>创建一个新窗口，名字为name</p><p>输入这条命令后，你正常的执行你需要的运行的程序，比如我要执行demo.py。</p><p><strong>python demo.py</strong></p><p>重点来了：当你程序成功运行好后，按下：<strong>ctrl+a+d</strong></p><p>然后就完事了。</p><p>下面时是常用的screen命令:<br>screen -S name 新建窗口<br>ctrl+a+d：挂起当前窗口<br>screen -r name 重新连接name窗口<br>screen -ls 查看当前有多少个窗口在后台运行及他们的状态<br>screen -d name 挂起窗口<br>有关更多的screen命令使用方法可以百度学习</p><p>补充</p><h2 id="后台运行后可以通过ps-aux-来查看后台所有的运行程序，找到你程序的PID，然后在根据PID来停止该程序，具体的命令为-kill-s-9-你程序的PID"><a href="#后台运行后可以通过ps-aux-来查看后台所有的运行程序，找到你程序的PID，然后在根据PID来停止该程序，具体的命令为-kill-s-9-你程序的PID" class="headerlink" title="后台运行后可以通过ps -aux 来查看后台所有的运行程序，找到你程序的PID，然后在根据PID来停止该程序，具体的命令为:kill -s 9 你程序的PID"></a>后台运行后可以通过ps -aux 来查看后台所有的运行程序，找到你程序的PID，然后在根据PID来停止该程序，具体的命令为:kill -s 9 你程序的PID</h2><p>作者：Wyndem<br>来源：CSDN<br>原文：<a href="https://blog.csdn.net/qq_31403321/article/details/83575882" target="_blank" rel="noopener">https://blog.csdn.net/qq_31403321/article/details/83575882</a><br>版权声明：本文为博主原创文章，转载请附上博文链接！</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;当我们用远程登陆Linux的显示出的黑窗口，然后通过各种手段好不容易将程序跑起来。关闭窗口后，程序也带着关闭了。这时就需要了解一下怎么在Linux后台运行程序了，很简单你只需要几条命令，就可以做到了。&lt;/p&gt;
&lt;p&gt;正文&lt;br&gt;关于Linux后台运行实现。有两种方式，下面就
      
    
    </summary>
    
      <category term="工具" scheme="https://zengwei123.github.io/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
  </entry>
  
  <entry>
    <title>Android-Snackbar</title>
    <link href="https://zengwei123.github.io/2017/02/14/Android-Snackbar/"/>
    <id>https://zengwei123.github.io/2017/02/14/Android-Snackbar/</id>
    <published>2017-02-14T03:05:43.000Z</published>
    <updated>2018-09-29T03:10:41.655Z</updated>
    
    <content type="html"><![CDATA[<h4 id="Snackbar基本介绍"><a href="#Snackbar基本介绍" class="headerlink" title="Snackbar基本介绍"></a>Snackbar基本介绍</h4><p>Snackbar是Android Support Design Library库中的一个控件，可以在屏幕底部快速弹出消息，比Toast更加好用，功能类似于Toast的一种轻量级反馈消息，Snackbar是从底部弹出消息的。<br>`</p><h4 id="使用-这里的view可以填你的根布局，或者findViewById-android-R-id-content"><a href="#使用-这里的view可以填你的根布局，或者findViewById-android-R-id-content" class="headerlink" title="使用,这里的view可以填你的根布局，或者findViewById(android.R.id.content)"></a>使用,这里的view可以填你的根布局，或者<code>findViewById(android.R.id.content)</code></h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Snackbar.make(view, message_text, duration)</span><br><span class="line">   .setAction(action_text, click_listener)</span><br><span class="line">   .show();</span><br></pre></td></tr></table></figure><p></p><p><center><img src="/2017/02/14/Android-Snackbar/1.gif"></center></p><br>make()方法是生成Snackbar的。Snackbar需要一个控件容器view用来容纳，官方推荐使用CoordinatorLayout来确保Snackbar和其他组件的交互，比如滑动取消Snackbar、Snackbar出现时FloatingActionButton上移。显示时间duration有三种类型LENGTH_SHORT、LENGTH_LONG和LENGTH_INDEFINITE。<br>setAction()方法可设置Snackbar右侧按钮，增加进行交互事件。如果不使用setAction()则只显示左侧message。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Snackbar.make(coordinatorLayout,<span class="string">"这是massage"</span>, Snackbar.LENGTH_LONG).setAction(<span class="string">"这是action"</span>, <span class="keyword">new</span> View.OnClickListener() &#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>&#123;</span><br><span class="line">        Toast.makeText(MainActivity.<span class="keyword">this</span>,<span class="string">"你点击了action"</span>,Toast.LENGTH_SHORT).show();</span><br><span class="line">     &#125;</span><br><span class="line"> &#125;).show();</span><br></pre></td></tr></table></figure><p></p><h4 id="自定义Snackbar"><a href="#自定义Snackbar" class="headerlink" title="自定义Snackbar"></a>自定义Snackbar</h4><p>Snackbar和Toast的默认样式都很单一，但是有时我们希望把不同类型信息区别显示，从而使用户更容易注意到提示信息。所以使Snackbar变色是一个好主意。下面的代码就可以修改他的背景颜色，setActionTextColor()这个方法可以修改Action颜色<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">setSnackbarColor</span><span class="params">(Snackbar snackbar, <span class="keyword">int</span> messageColor, <span class="keyword">int</span> backgroundColor)</span> </span>&#123;</span><br><span class="line">    View view = snackbar.getView();<span class="comment">//获取Snackbar的view</span></span><br><span class="line">    <span class="keyword">if</span>(view!=<span class="keyword">null</span>)&#123;</span><br><span class="line">        view.setBackgroundColor(backgroundColor);<span class="comment">//修改view的背景色</span></span><br><span class="line">        ((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor);<span class="comment">//获取Snackbar的message控件，修改字体颜色</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h4 id="显示和隐藏时的回调"><a href="#显示和隐藏时的回调" class="headerlink" title="显示和隐藏时的回调"></a>显示和隐藏时的回调</h4><p>在显示Snackbar或隐藏Snackbar时需要做一些事情，这时候就要用到Callback了，通过addCallback方法,以前有个setCallback现在过时了，实现Snackbar.Callback这个抽象类，里面有onDismissed()和onShown()两个抽象方法，onShown()是显示的时候调用，onDismissed()在隐藏的时候调用。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">Snackbar.make(view, <span class="string">"我就是Snackbar!"</span>, Snackbar.LENGTH_LONG).setAction(<span class="string">"Action"</span>, <span class="keyword">new</span> View.OnClickListener() &#123;                            </span><br><span class="line"><span class="meta">@Override</span>                            </span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>&#123;                             </span><br><span class="line">&#125;                        </span><br><span class="line">&#125;)                        </span><br><span class="line">.addCallback(<span class="keyword">new</span> Snackbar.Callback()&#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDismissed</span><span class="params">(Snackbar transientBottomBar, <span class="keyword">int</span> event)</span> </span>&#123;</span><br><span class="line">                <span class="keyword">super</span>.onDismissed(transientBottomBar, event);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onShown</span><span class="params">(Snackbar sb)</span> </span>&#123;</span><br><span class="line">                <span class="keyword">super</span>.onShown(sb);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;).show();</span><br></pre></td></tr></table></figure></p><h4 id="相关属性设置"><a href="#相关属性设置" class="headerlink" title="相关属性设置"></a>相关属性设置</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">Snackbar snackbar = Snackbar.make(coordinatorLayout, <span class="string">"Action 被点击"</span>, Snackbar.LENGTH_SHORT);</span><br><span class="line">        snackbar.setText(<span class="string">"动态文本"</span>);<span class="comment">//动态设置文本显示内容</span></span><br><span class="line">        snackbar.setActionTextColor(Color.RED);<span class="comment">//动态设置Action文本的颜色</span></span><br><span class="line">        snackbar.setDuration(<span class="number">5000</span>);<span class="comment">//动态设置显示时间</span></span><br><span class="line"></span><br><span class="line">        View snackbarView = snackbar.getView();<span class="comment">//获取Snackbar显示的View对象</span></span><br><span class="line">        <span class="comment">//获取显示文本View,并设置其显示颜色</span></span><br><span class="line">        ((TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text)).setTextColor(Color.BLUE);</span><br><span class="line">        <span class="comment">//获取Action文本View，并设置其显示颜色</span></span><br><span class="line">        ((TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_action)).setTextColor(Color.BLUE);</span><br><span class="line">        <span class="comment">//设置Snackbar的背景色</span></span><br><span class="line">        snackbarView.setBackgroundColor(Color.GREEN);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//设置Snackbar显示的位置</span></span><br><span class="line">        ViewGroup.LayoutParams params = snackbarView.getLayoutParams();</span><br><span class="line">        CoordinatorLayout.LayoutParams layoutParams = <span class="keyword">new</span> CoordinatorLayout.LayoutParams(params.width, params.height);</span><br><span class="line">        layoutParams.gravity = Gravity.CENTER_VERTICAL;<span class="comment">//垂直居中</span></span><br><span class="line">        snackbarView.setLayoutParams(layoutParams);</span><br></pre></td></tr></table></figure><h4 id="Snackbar与Dialog和Toast的比较"><a href="#Snackbar与Dialog和Toast的比较" class="headerlink" title="Snackbar与Dialog和Toast的比较"></a>Snackbar与Dialog和Toast的比较</h4><p>Dialog<br>模态对话框。也就说，此刻该对话框中的内容获取了焦点，想要操作对话框以外的功能，必须先对该对话框进行响应。<br>应用场景：对于删除确认、版本更新等重要性提示信息，需要用户做出选择的情况下，使用Dialog。</p><p>Toast<br>非模态提示框。也就说提示框的显示并不影响我们对其他地方的操作，Toast无法手动控制隐藏，需要设置Toast的显示时长，一旦显示时间结束，Toast会自动消失。如果多次点击并显示Toast，就会出现Toast重复创建并显示，给用户造成一种Toast长时间不隐藏的幻觉。<br>应用场景：对于无网络提示、删除成功、发布操作完成等这类不重要的提示性信息，使用Toast；</p><p>Snackbar<br>Snackbar和Toast比较相似，但是用途更加广泛，并且它是可以和用户进行交互的。Snackbar使用一个动画效果从屏幕的底部弹出来，过一段时间后也会自动消失。<br>应用场景：删除操作时，弹出Snackbar用于确认删除操作；消息发送失败时，弹出Snackbar，用于重新发送操作；当然重要的是与MD组件相结合，用户体验效果更佳。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;Snackbar基本介绍&quot;&gt;&lt;a href=&quot;#Snackbar基本介绍&quot; class=&quot;headerlink&quot; title=&quot;Snackbar基本介绍&quot;&gt;&lt;/a&gt;Snackbar基本介绍&lt;/h4&gt;&lt;p&gt;Snackbar是Android Support Desig
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>Linux安装jdk</title>
    <link href="https://zengwei123.github.io/2017/02/13/Linux%E5%AE%89%E8%A3%85jdk/"/>
    <id>https://zengwei123.github.io/2017/02/13/Linux安装jdk/</id>
    <published>2017-02-13T07:14:35.000Z</published>
    <updated>2018-11-09T08:30:24.004Z</updated>
    
    <content type="html"><![CDATA[<p>云服务器，首先登录，再你购买的时候会需要你设置密码，如果没有设置，就到控制台去设置密码，然后重启服务器就行。<br>登录后这时候我们来安装java环境。<br>1、<strong>cd \usr</strong>到这个路径下，注意千万不要再tmp路径，再这个路径下全是临时文件，一但重启，全部gg<br>2、<strong>makdir java</strong>创建文件夹<br>3、<strong>cd java</strong>切换到这个路径下<br>4、下载jdk <strong>wget jdk下载链接</strong><br>5、解压<strong>jdk tar -zvxf jdk-8u191-linux-x64.tar.gz</strong><br>6、查看<strong>ls</strong>，会出现一个文件夹<strong>jdk1.8.0_191</strong><br>7、配置环境，输入命令<strong>vim /etc/profile</strong><br>8、分别输入：JAVA_HOME根据实际目录来<br>            JAVA_HOME=/usr/java/jdk1.8.0_191<br>            CLASSPATH=$JAVA_HOME/lib/<br>            PATH=$PATH:$JAVA_HOME/bin<br>            export PATH JAVA_HOME CLASSPATH<br>9、重启机器或执行命令<strong>source /etc/profile</strong><br>10、查看是否安装配置成功<strong>java -version</strong></p><hr><p>1.vim 编辑器操作，进入之后选择编辑模式输入E<br>2.按”I”，即切换到“插入”状态。就可以通过上下左右移动光标，或空格、退格及回车等进行编辑内容了，和WINDOWS是一样的了。</p><blockquote><p>当文本编辑结束之后，通常需要退出编辑器。退出编辑器又分为4种情况：保存退出、正常退出、不保存退出及强制退出。下面简单说下吧！<br>1.当编辑完之后，我们要按键盘左上角的”ESC”，退出编辑<br>2.保存退出  ‘:wq’,然后回车</p><ol start="3"><li>不保存退出  ‘q!’,然后回车</li></ol></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;云服务器，首先登录，再你购买的时候会需要你设置密码，如果没有设置，就到控制台去设置密码，然后重启服务器就行。&lt;br&gt;登录后这时候我们来安装java环境。&lt;br&gt;1、&lt;strong&gt;cd \usr&lt;/strong&gt;到这个路径下，注意千万不要再tmp路径，再这个路径下全是临时文
      
    
    </summary>
    
      <category term="工具" scheme="https://zengwei123.github.io/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
  </entry>
  
  <entry>
    <title>android-CoordinatorLayout之Behavior</title>
    <link href="https://zengwei123.github.io/2017/02/11/android-CoordinatorLayout%E4%B9%8BBehavior/"/>
    <id>https://zengwei123.github.io/2017/02/11/android-CoordinatorLayout之Behavior/</id>
    <published>2017-02-11T06:51:32.000Z</published>
    <updated>2018-09-28T07:03:01.229Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1-简单使用"><a href="#1-简单使用" class="headerlink" title="1. 简单使用"></a>1. 简单使用</h3><p>CoordinatorLayout作为一个中间桥梁性质的布局，协调着内部的childView。之前对CoordinatorLayout有点误解，以为需要配合AppBarLayout才有一些比较炫酷的特效，大错特错，Behavior是CoordinatorLayout能够有协调作用以及能支持各种炫酷特效的的关键因素</p><p></p><p><center><img src="/2017/02/11/android-CoordinatorLayout之Behavior/1.gif"></center></p><p></p><h3 id="1-1-布局文件中使用"><a href="#1-1-布局文件中使用" class="headerlink" title="1.1 布局文件中使用"></a>1.1 布局文件中使用</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">android.support.design.widget.CoordinatorLayout</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:app</span>=<span class="string">"http://schemas.android.com/apk/res-auto"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:tools</span>=<span class="string">"http://schemas.android.com/tools"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:background</span>=<span class="string">"#ffffff"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:id</span>=<span class="string">"@+id/title"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"50dp"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:background</span>=<span class="string">"#ff0000"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:gravity</span>=<span class="string">"center"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:text</span>=<span class="string">"Hello World"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:textColor</span>=<span class="string">"#ffffff"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:textSize</span>=<span class="string">"18sp"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">app:layout_behavior</span>=<span class="string">"@string/behavior_sample_title"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">com.example.zengwei.coord.MoveView</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:text</span>=<span class="string">"你好"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:textColor</span>=<span class="string">"#2b2b2b"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:gravity</span>=<span class="string">"center"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:background</span>=<span class="string">"#0188FB"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_marginTop</span>=<span class="string">"200dp"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"100dp"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"100dp"</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">android.support.design.widget.CoordinatorLayout</span>&gt;</span></span><br></pre></td></tr></table></figure><p>最关键的地方就在于app:layout_behavior，利用这个属性来确定的绑定的目标childView</p><p>指定绑定目标有3种方式：</p><p>1.在xml布局通过app:layout_behavior<br>2.在Java代码中，child.getLayoutParams().setBehavior()来指定<br>3.在目标childView类上，通过@DefaultBehavior来指定</p><h3 id="1-2-MoveView"><a href="#1-2-MoveView" class="headerlink" title="1.2 MoveView"></a>1.2 MoveView</h3><p>MoveView就是一个继承TextView的很简单的自定义View<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MoveView</span> <span class="keyword">extends</span> <span class="title">TextView</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">float</span> lastX, lastY;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">MoveView</span><span class="params">(Context context, AttributeSet attrs)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">super</span>(context, attrs);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onTouchEvent</span><span class="params">(MotionEvent event)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> action = event.getAction();</span><br><span class="line">        <span class="keyword">float</span> x = event.getRawX();</span><br><span class="line">        <span class="keyword">float</span> y = event.getRawY();</span><br><span class="line">        <span class="keyword">if</span> (action == MotionEvent.ACTION_MOVE) &#123;</span><br><span class="line">            CoordinatorLayout.MarginLayoutParams layoutParams = (CoordinatorLayout.MarginLayoutParams) getLayoutParams();</span><br><span class="line">            <span class="comment">//计算当前的左上角坐标</span></span><br><span class="line">            <span class="keyword">float</span> left = layoutParams.leftMargin + x - lastX;</span><br><span class="line">            <span class="keyword">float</span> top = layoutParams.topMargin + y - lastY;</span><br><span class="line">            <span class="comment">//设置坐标</span></span><br><span class="line">            layoutParams.leftMargin = (<span class="keyword">int</span>) left;</span><br><span class="line">            layoutParams.topMargin = (<span class="keyword">int</span>) top;</span><br><span class="line">            setLayoutParams(layoutParams);</span><br><span class="line">        &#125;</span><br><span class="line">        lastX = x;</span><br><span class="line">        lastY = y;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>主要就是重写onTouchEvent()来使MoveView可以根据手指滑动在屏幕改变位置</p><h3 id="1-3-一个简单的自定义Behavior"><a href="#1-3-一个简单的自定义Behavior" class="headerlink" title="1.3 一个简单的自定义Behavior"></a>1.3 一个简单的自定义Behavior</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SampleTitleBehavior</span> <span class="keyword">extends</span> <span class="title">CoordinatorLayout</span>.<span class="title">Behavior</span>&lt;<span class="title">View</span>&gt; </span>&#123;</span><br><span class="line">    <span class="comment">// 列表顶部和title底部重合时，列表的滑动距离。</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">float</span> deltaY;</span><br><span class="line">    <span class="keyword">boolean</span> aBoolean=<span class="keyword">true</span>;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">SampleTitleBehavior</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">SampleTitleBehavior</span><span class="params">(Context context, AttributeSet attrs)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">super</span>(context, attrs);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 使用该Behavior的View要监听哪个类型的View的状态变化。</span></span><br><span class="line"><span class="comment">     * 其中参数parant代表CoordinatorLayout，child代表使用该Behavior的View，dependency代表要监听的View。</span></span><br><span class="line"><span class="comment">     * 这里要监听RecyclerView</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> parent</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> child</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> dependency</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">layoutDependsOn</span><span class="params">(CoordinatorLayout parent, View child, View dependency)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> dependency <span class="keyword">instanceof</span> MoveView;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 当被监听的View状态变化时会调用该方法，参数和上一个方法一致。</span></span><br><span class="line"><span class="comment">     * 所以我们重写该方法，当MoveView的位置变化时，进而改变title的位置。</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> parent</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> child</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> dependency</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onDependentViewChanged</span><span class="params">(CoordinatorLayout parent, View child, View dependency)</span> </span>&#123;</span><br><span class="line">            <span class="keyword">if</span>(aBoolean)&#123;</span><br><span class="line">                deltaY=dependency.getY();</span><br><span class="line">                aBoolean=<span class="keyword">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        <span class="keyword">if</span>(deltaY-dependency.getY()&lt;=<span class="number">150</span>)&#123;</span><br><span class="line">            child.setY(dependency.getY()-deltaY);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>CoordinatorLayout.Behavior<textview>这里使用泛型将绑定的childView限制为了TextView，可以根据实际需求来指定类型，也可以直接指定为View</textview></p><p>注意：<br>当在布局文件中使用了Behavior后，Behavior代码中确定的交互行为便直接奏效，初始化第一次加载CoordinatorLayout时，使用了Behavior的ChildView受到onDependentViewChanged()方法的影响，第一次加载的位置也会受到影响，导致和布局文件中指定的位置不相同</p><p>官方有好几个非常好的学习资料，例如：<br>android.support.design.widget.AppBarLayout$ScrollingViewBehavior</p><p>一个依赖AppBarLayout后，处理滑动事件的Behavior，对Behavior中的属性及方法有了大概了解后，可以学习具体细节的设计和优化</p><h3 id="2-Behavior-行为"><a href="#2-Behavior-行为" class="headerlink" title="2. Behavior 行为"></a>2. Behavior 行为</h3><p>需要注意的是Behavior可以几乎包括所有的交互行为，配合ViewDragHelper应该能够实现出一些很炫酷的交互效果</p><h3 id="2-1-常用的方法"><a href="#2-1-常用的方法" class="headerlink" title="2.1 常用的方法"></a>2.1 常用的方法</h3><p>构造方法有两个：<br>默认：public Behavior() {}<br>布局：public Behavior(Context context, AttributeSet attrs) {  }<br>两个构造方法也比较容易理解，一个是默认的空参的构造方法，一个是带有布局属性AttributeSet的方法，有了这个构造方法，可以直接在布局文件中使用</p><p>根据Behavior的特性，可以将内部的方法分以下类：</p><p>测量与布局：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">测量：<span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onMeasureChild</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line">布局：<span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onLayoutChild</span><span class="params">()</span></span>&#123;&#125;</span><br></pre></td></tr></table></figure></p><p>特定状态：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//当Behavior添加到参数实例时，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onAttachedToLayoutParams</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//当Behavior与参数实例分离时，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDetachedFromLayoutParams</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//当Behavior关联的对象想要定位到特定的矩形时，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onRequestChildRectangleOnScreen</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//当一个ChildView设置为回避属性时，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">getInsetDodgeRect</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//当窗口发生改变时，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> WindowInsetsCompat <span class="title">onApplyWindowInsets</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//需要保存临时状态信息，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> Parcelable <span class="title">onSaveInstanceState</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//需要恢复临时状态信息，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onRestoreInstanceState</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//作用未知</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getScrimColor</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">//作用未知</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">float</span> <span class="title">getScrimOpacity</span><span class="params">()</span></span>&#123;&#125;</span><br></pre></td></tr></table></figure></p><p>确定依赖与绑定对象：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//根据参数来确定依赖与绑定对象</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">layoutDependsOn</span><span class="params">()</span></span>&#123;&#125;</span><br></pre></td></tr></table></figure></p><p>当依赖对象发生改变时：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//当依赖对象发生改变，包括位置，大小，颜色，进行回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onDependentViewChanged</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//当依赖对象被移除时，进行回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDependentViewRemoved</span><span class="params">()</span></span>&#123;&#125;</span><br></pre></td></tr></table></figure></p><p>事件相关：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//拦截事件，在CoordinatorLayout把事件分发到childView之前</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onInterceptTouchEvent</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//消费事件</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onTouchEvent</span><span class="params">()</span></span>&#123;&#125;</span><br></pre></td></tr></table></figure></p><p>嵌套滑动：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//CoordinatorLayout中的滑动嵌套childView开始启动一次嵌套滚动时，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onStartNestedScroll</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//嵌套滑动结束时，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onStopNestedScroll</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//当一次嵌套滑动被CoordiantorLayout识别并确定时，进行回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onNestedScrollAccepted</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//嵌套滚动正在进行中并且绑定目标childView已经开始滚动或者被CoordinatorLayout接受后试图滚动</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onNestedScroll</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//嵌套滚动正在准备更新进度，并且是在绑定目标childView已经出现滚动距离之前，回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onNestedPreScroll</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//当嵌套滚动的childView正在开始fling或者一个动作确认为fling</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onNestedFling</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//当滑动嵌套childView检测到适当的条件，马上开始一次fling事件前回调</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onNestedPreFling</span><span class="params">()</span></span>&#123;&#125;</span><br></pre></td></tr></table></figure></p><p>暂时就这么分，分类并不算合理，也无所谓，目的是以后自己回头来看时，能比较清晰能快速定位方法是干嘛的<br>转：<a href="https://www.jianshu.com/p/9fdd271541d9" target="_blank" rel="noopener">https://www.jianshu.com/p/9fdd271541d9</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;1-简单使用&quot;&gt;&lt;a href=&quot;#1-简单使用&quot; class=&quot;headerlink&quot; title=&quot;1. 简单使用&quot;&gt;&lt;/a&gt;1. 简单使用&lt;/h3&gt;&lt;p&gt;CoordinatorLayout作为一个中间桥梁性质的布局，协调着内部的childView。之前对Co
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>Android-CoordinatorLayout</title>
    <link href="https://zengwei123.github.io/2017/02/08/Android-CoordinatorLayout/"/>
    <id>https://zengwei123.github.io/2017/02/08/Android-CoordinatorLayout/</id>
    <published>2017-02-08T02:38:25.000Z</published>
    <updated>2018-09-28T07:00:23.492Z</updated>
    
    <content type="html"><![CDATA[<h3 id="CoordinatorLayout被称为联动布局，这是Design-Support-Library中最重要与最难的部分。"><a href="#CoordinatorLayout被称为联动布局，这是Design-Support-Library中最重要与最难的部分。" class="headerlink" title="CoordinatorLayout被称为联动布局，这是Design Support Library中最重要与最难的部分。"></a>CoordinatorLayout被称为联动布局，这是Design Support Library中最重要与最难的部分。</h3><p>首先我们要把<code>CoordinatorLayout</code>作为根布局,导入下面的依赖</p><blockquote><h3 id="compile-‘com-android-support-design-26-1-0’"><a href="#compile-‘com-android-support-design-26-1-0’" class="headerlink" title="compile ‘com.android.support:design:26.1.0’"></a>compile ‘com.android.support:design:26.1.0’</h3></blockquote><blockquote><h3 id="1-有时候我们会看到一个底部有一个块，然后可以拖上来成为一个布局，类似于下面这种"><a href="#1-有时候我们会看到一个底部有一个块，然后可以拖上来成为一个布局，类似于下面这种" class="headerlink" title="1.有时候我们会看到一个底部有一个块，然后可以拖上来成为一个布局，类似于下面这种"></a>1.有时候我们会看到一个底部有一个块，然后可以拖上来成为一个布局，类似于下面这种</h3></blockquote><p></p><p><center><img src="/2017/02/08/Android-CoordinatorLayout/2.gif"></center></p><br>要使用这种效果只要两个代码,第一个是设置露出的高度，第二个一定要这么写，然后你就可以拖动将布局拖出来了<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">app:behavior_peekHeight="40dp"   </span><br><span class="line">app:layout_behavior="@string/bottom_sheet_behavior"</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p></p><p>想要改变脱出后头部的样式和布局，那么你就需要再代码里面设置了<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> RelativeLayout rsb;</span><br><span class="line">    <span class="keyword">private</span> TextView text,text1;</span><br><span class="line">    <span class="keyword">private</span> BottomSheetBehavior behavior;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(@Nullable Bundle savedInstanceState)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        setContentView(R.layout.layout);</span><br><span class="line">        <span class="comment">/**根布局**/</span></span><br><span class="line">        rsb=findViewById(R.id.rsb);</span><br><span class="line">        text=findViewById(R.id.text);</span><br><span class="line">        text1=findViewById(R.id.text1);</span><br><span class="line">        behavior= BottomSheetBehavior.from(rsb);</span><br><span class="line">        behavior.setBottomSheetCallback(<span class="keyword">new</span> BottomSheetBehavior.BottomSheetCallback() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onStateChanged</span><span class="params">(@NonNull View bottomSheet, <span class="keyword">int</span> newState)</span> </span>&#123;</span><br><span class="line">                <span class="comment">/**滑动结束回调方法，BottomSheetBehavior状态的改变*/</span></span><br><span class="line">                <span class="keyword">if</span>(newState==BottomSheetBehavior.STATE_EXPANDED)&#123;</span><br><span class="line">                    <span class="comment">/**当结束后是滑动出来的**/</span></span><br><span class="line">                    text1.setVisibility(View.VISIBLE);</span><br><span class="line">                &#125;<span class="keyword">else</span> <span class="keyword">if</span>(newState==BottomSheetBehavior.STATE_COLLAPSED)&#123;</span><br><span class="line">                    <span class="comment">/**当结束后是收缩进去的**/</span></span><br><span class="line">                    text.setVisibility(View.VISIBLE);</span><br><span class="line">                    bottomSheet.setAlpha(<span class="number">1f</span>);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onSlide</span><span class="params">(@NonNull View bottomSheet, <span class="keyword">float</span> slideOffset)</span> </span>&#123;</span><br><span class="line">                <span class="comment">/**滑动回调方法，slideOffset是所占高度的比例，可以用这个来做一些动画*/</span></span><br><span class="line">                bottomSheet.setAlpha(slideOffset);</span><br><span class="line">                <span class="keyword">if</span>(text1.getVisibility()==View.GONE)&#123;</span><br><span class="line">                    <span class="comment">/**滑动开始如果 点击收缩 按钮为隐藏**/</span></span><br><span class="line">                    text.setVisibility(View.GONE);</span><br><span class="line">                &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                    <span class="comment">/**滑动开始如果 点击收缩 按钮为显示**/</span></span><br><span class="line">                    text1.setVisibility(View.GONE);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p><p>下面放出布局代码<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><br><span class="line"><span class="tag">&lt;<span class="name">android.support.design.widget.CoordinatorLayout</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:id</span>=<span class="string">"@+id/coordinator"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:background</span>=<span class="string">"#ffffff"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:app</span>=<span class="string">"http://schemas.android.com/apk/res-auto"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">RelativeLayout</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:id</span>=<span class="string">"@+id/rsb"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">app:behavior_peekHeight</span>=<span class="string">"40dp"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">app:layout_behavior</span>=<span class="string">"@string/bottom_sheet_behavior"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:id</span>=<span class="string">"@+id/text"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:text</span>=<span class="string">"拉出"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:background</span>=<span class="string">"#52D3FF"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:gravity</span>=<span class="string">"center"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_height</span>=<span class="string">"40dp"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:id</span>=<span class="string">"@+id/text1"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:text</span>=<span class="string">"点击收缩"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:gravity</span>=<span class="string">"center"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:background</span>=<span class="string">"#52D3FF"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:visibility</span>=<span class="string">"gone"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_height</span>=<span class="string">"40dp"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">RelativeLayout</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:background</span>=<span class="string">"#ff0000"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_marginTop</span>=<span class="string">"40dp"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span><span class="tag">&lt;/<span class="name">RelativeLayout</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">RelativeLayout</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">android.support.design.widget.CoordinatorLayout</span>&gt;</span></span><br></pre></td></tr></table></figure></p><blockquote><h4 id="2-看gif"><a href="#2-看gif" class="headerlink" title="2.看gif"></a>2.看gif</h4></blockquote><p></p><p><center><img src="/2017/02/08/Android-CoordinatorLayout/1.gif"></center></p><br>想要实现这种效果也很简单，将<code>FloatingActionButton</code>放在<code>CoordinatorLayout</code>里面，代码中将<code>CoordinatorLayout</code>传给<code>Snackbar</code>就行了<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">Snackbar.make(coordinatorLayout,<span class="string">"你好吗"</span>,Snackbar.LENGTH_LONG).show();</span><br><span class="line">..</span><br></pre></td></tr></table></figure><p></p><blockquote><h3 id="3-AppBarLayout子View的动作"><a href="#3-AppBarLayout子View的动作" class="headerlink" title="3.AppBarLayout子View的动作"></a>3.AppBarLayout子View的动作</h3><p>内部的子View通过在布局中加app:layout_scrollFlags设置执行的动作，那么app:layout_scrollFlags可以设置哪些动作呢？分别如下：<br>（1） scroll:值设为scroll的View会跟随滚动事件一起发生移动。<br>（2） enterAlways:值设为enterAlways的View,当ScrollView往下滚动时，该View会直接往下滚动。而不用考虑ScrollView是否在滚动。<br>（3） exitUntilCollapsed：值设为exitUntilCollapsed的View，当这个View要往上逐渐“消逝”时，会一直往上滑动，直到剩下的的高度达到它的最小高度后，再响应ScrollView的内部滑动事件。<br>（4） enterAlwaysCollapsed：是enterAlways的附加选项，一般跟enterAlways一起使用，它是指，View在往下“出现”的时候，首先是enterAlways效果，当View的高度达到最小高度时，View就暂时不去往下滚动，直到ScrollView滑动到顶部不再滑动时，View再继续往下滑动，直到滑到View的顶部结束。<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">android.support.design.widget.AppBarLayout</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:background</span>=<span class="string">"#ff0000"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"200dp"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">android.support.v7.widget.Toolbar</span></span></span><br><span class="line"><span class="tag">            <span class="attr">app:title</span>=<span class="string">"标题"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">app:layout_scrollFlags</span>=<span class="string">"scroll|enterAlwaysCollapsed|enterAlways"</span>   //改这里就行了，混合使用</span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:minHeight</span>=<span class="string">"50dp"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:gravity</span>=<span class="string">"bottom"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;/<span class="name">android.support.v7.widget.Toolbar</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">android.support.design.widget.AppBarLayout</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">android.support.v7.widget.RecyclerView</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:id</span>=<span class="string">"@+id/recyle"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">app:layout_behavior</span>=<span class="string">"@string/appbar_scrolling_view_behavior"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;/<span class="name">android.support.v7.widget.RecyclerView</span>&gt;</span></span><br></pre></td></tr></table></figure></p></blockquote><blockquote><h3 id="4-实现下面这种效果"><a href="#4-实现下面这种效果" class="headerlink" title="4.实现下面这种效果"></a>4.实现下面这种效果</h3></blockquote><p></p><p><center><img src="/2017/02/08/Android-CoordinatorLayout/3.gif"></center></p><br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">android.support.design.widget.CoordinatorLayout</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:id</span>=<span class="string">"@+id/coordinator"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:background</span>=<span class="string">"#ffffff"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:app</span>=<span class="string">"http://schemas.android.com/apk/res-auto"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">android.support.design.widget.AppBarLayout</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:id</span>=<span class="string">"@+id/avps"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:background</span>=<span class="string">"#cccccc"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"200dp"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">android.support.design.widget.CollapsingToolbarLayout</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:id</span>=<span class="string">"@+id/avps1"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">app:layout_scrollFlags</span>=<span class="string">"scroll|exitUntilCollapsed"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">RelativeLayout</span></span></span><br><span class="line"><span class="tag">                <span class="attr">app:layout_collapseMode</span>=<span class="string">"parallax"</span></span></span><br><span class="line"><span class="tag">                <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">                <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">ImageView</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:src</span>=<span class="string">"@drawable/as"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:scaleType</span>=<span class="string">"centerCrop"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">                <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:textColor</span>=<span class="string">"#ffffff"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_alignParentBottom</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_alignParentStart</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:textSize</span>=<span class="string">"30sp"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:text</span>=<span class="string">"你自己想要的布局"</span> /&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">RelativeLayout</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">android.support.v7.widget.Toolbar</span></span></span><br><span class="line"><span class="tag">                <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">                <span class="attr">app:layout_collapseMode</span>=<span class="string">"pin"</span></span></span><br><span class="line"><span class="tag">                <span class="attr">android:layout_height</span>=<span class="string">"50dp"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:textColor</span>=<span class="string">"#ffffff"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:text</span>=<span class="string">"返回"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span> /&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:textColor</span>=<span class="string">"#ffffff"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:text</span>=<span class="string">"分享"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:gravity</span>=<span class="string">"right"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:paddingRight</span>=<span class="string">"15dp"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span> /&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">android.support.v7.widget.Toolbar</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">android.support.design.widget.CollapsingToolbarLayout</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">android.support.design.widget.AppBarLayout</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">android.support.v4.widget.NestedScrollView</span></span></span><br><span class="line"><span class="tag">        <span class="attr">app:layout_behavior</span>=<span class="string">"@string/appbar_scrolling_view_behavior"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:textColor</span>=<span class="string">"#2b2b2b"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:text</span>=<span class="string">"a"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">android.support.v4.widget.NestedScrollView</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">android.support.design.widget.FloatingActionButton</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:id</span>=<span class="string">"@+id/FloatingActionButton"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">app:rippleColor</span>=<span class="string">"#cccccc"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">app:backgroundTint</span>=<span class="string">"#56abe4"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_gravity</span>=<span class="string">"right|bottom"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_marginRight</span>=<span class="string">"15dp"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_marginBottom</span>=<span class="string">"15dp"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">android.support.design.widget.CoordinatorLayout</span>&gt;</span></span><br></pre></td></tr></table></figure><p></p><h3 id="监听事件"><a href="#监听事件" class="headerlink" title="监听事件,"></a>监听事件,</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">AppBarStateChangeListener</span> <span class="keyword">implements</span> <span class="title">AppBarLayout</span>.<span class="title">OnOffsetChangedListener</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">enum</span> State &#123;</span><br><span class="line">        EXPANDED,</span><br><span class="line">        COLLAPSED,</span><br><span class="line">        IDLE</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">private</span> State mCurrentState = State.IDLE;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">void</span> <span class="title">onOffsetChanged</span><span class="params">(AppBarLayout appBarLayout, <span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (i == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (mCurrentState != State.EXPANDED) &#123;</span><br><span class="line">                onStateChanged(appBarLayout, State.EXPANDED);</span><br><span class="line">            &#125;</span><br><span class="line">            mCurrentState = State.EXPANDED;</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (Math.abs(i) &gt;= appBarLayout.getTotalScrollRange()) &#123;</span><br><span class="line">            <span class="keyword">if</span> (mCurrentState != State.COLLAPSED) &#123;</span><br><span class="line">                onStateChanged(appBarLayout, State.COLLAPSED);</span><br><span class="line">            &#125;</span><br><span class="line">            mCurrentState = State.COLLAPSED;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (mCurrentState != State.IDLE) &#123;</span><br><span class="line">                onStateChanged(appBarLayout, State.IDLE);</span><br><span class="line">            &#125;</span><br><span class="line">            mCurrentState = State.IDLE;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">onStateChanged</span><span class="params">(AppBarLayout appBarLayout, State state)</span></span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">--------------------------------------------------------------------------</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Coord3</span> <span class="keyword">extends</span> <span class="title">AppCompatActivity</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> FloatingActionButton floatingActionButton;</span><br><span class="line">    <span class="keyword">private</span> CoordinatorLayout coordinatorLayout;</span><br><span class="line">    <span class="keyword">private</span> BottomSheetBehavior behavior;</span><br><span class="line">    <span class="keyword">private</span> AppBarLayout avps;</span><br><span class="line">    <span class="keyword">private</span> CollapsingToolbarLayout avps1;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> expendedtag=<span class="number">2</span>;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(@Nullable Bundle savedInstanceState)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        setContentView(R.layout.layout3);</span><br><span class="line">        floatingActionButton=findViewById(R.id.FloatingActionButton);</span><br><span class="line">        coordinatorLayout=findViewById(R.id.coordinator);</span><br><span class="line">        floatingActionButton.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View view)</span> </span>&#123;</span><br><span class="line">                Snackbar.make(coordinatorLayout,<span class="string">"你好吗"</span>,Snackbar.LENGTH_LONG).show();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">        avps=findViewById(R.id.avps);</span><br><span class="line">        avps1=findViewById(R.id.avps1);</span><br><span class="line">        avps1.setTitle(<span class="string">"Title"</span>);</span><br><span class="line">        avps.addOnOffsetChangedListener(<span class="keyword">new</span> AppBarStateChangeListener() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onStateChanged</span><span class="params">(AppBarLayout appBarLayout, State state)</span> </span>&#123;</span><br><span class="line">                <span class="keyword">if</span>( state == State.EXPANDED ) &#123;</span><br><span class="line">                    <span class="comment">//展开状态</span></span><br><span class="line">                    Toast.makeText(Coord3.<span class="keyword">this</span>, <span class="string">"展开"</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">                &#125;<span class="keyword">else</span> <span class="keyword">if</span>(state == State.COLLAPSED)&#123;</span><br><span class="line">                    <span class="comment">//折叠状态</span></span><br><span class="line">                    Toast.makeText(Coord3.<span class="keyword">this</span>, <span class="string">"折叠"</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">                    avps1.setContentScrimColor(Color.parseColor(<span class="string">"#777777"</span>));   <span class="comment">//设置这个可以展现出那种透明的感觉</span></span><br><span class="line">                &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">                    <span class="comment">//中间状态</span></span><br><span class="line">                    Toast.makeText(Coord3.<span class="keyword">this</span>, <span class="string">"中间"</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果你希望拖动过程中状态栏是透明的，可以在CollapsingToolbarLayout中加 app:statusBarScrim=”@android:color/transparent”，并且在onCreate中调用getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)将状态栏设置为透明就好啦~</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;CoordinatorLayout被称为联动布局，这是Design-Support-Library中最重要与最难的部分。&quot;&gt;&lt;a href=&quot;#CoordinatorLayout被称为联动布局，这是Design-Support-Library中最重要与最难的部分。
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>Android对话框</title>
    <link href="https://zengwei123.github.io/2017/02/03/Android%E5%AF%B9%E8%AF%9D%E6%A1%86/"/>
    <id>https://zengwei123.github.io/2017/02/03/Android对话框/</id>
    <published>2017-02-03T01:50:14.000Z</published>
    <updated>2018-09-18T02:09:12.488Z</updated>
    
    <content type="html"><![CDATA[<h4 id="对话框是我们在开发者经常会用到的东西，他通常在进行一些不可逆操作时候用来提示用户。"><a href="#对话框是我们在开发者经常会用到的东西，他通常在进行一些不可逆操作时候用来提示用户。" class="headerlink" title="对话框是我们在开发者经常会用到的东西，他通常在进行一些不可逆操作时候用来提示用户。"></a>对话框是我们在开发者经常会用到的东西，他通常在进行一些不可逆操作时候用来提示用户。</h4><h5 id="1-普通对话框"><a href="#1-普通对话框" class="headerlink" title="1.普通对话框"></a>1.普通对话框</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">AlertDialog dialog = <span class="keyword">new</span> AlertDialog.Builder(<span class="keyword">this</span>)</span><br><span class="line">        .setIcon(R.mipmap.icon)<span class="comment">//设置标题的图片</span></span><br><span class="line">        .setTitle(<span class="string">"我是对话框"</span>)<span class="comment">//设置对话框的标题</span></span><br><span class="line">        .setMessage(<span class="string">"我是对话框的内容"</span>)<span class="comment">//设置对话框的内容</span></span><br><span class="line">        <span class="comment">//设置对话框的按钮</span></span><br><span class="line">        .setNegativeButton(<span class="string">"取消"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">                <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                    Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">"点击了取消按钮"</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">                    dialog.dismiss();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        .setPositiveButton(<span class="string">"确定"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">"点击了确定的按钮"</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">                dialog.dismiss();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;).create();</span><br><span class="line">    dialog.show();</span><br></pre></td></tr></table></figure><blockquote><p>AlertDialog类中有一个静态内部类Builder。所以可以看出对话框使用了一个建造者模式在调用函数的时候就可以一直直点点点链式调用。 需要注意的是：NegativeButton这个按钮是在对话框的左边,PositiveButton在对话框的右边;如果你还想再加一个按钮也是可以的只需要在调用.setNeutralButton(“第三个按钮”,listener)即可。</p></blockquote><p><center><img src="/2017/02/03/Android对话框/1.png"></center></p><h5 id="2-列表对话框"><a href="#2-列表对话框" class="headerlink" title="2.列表对话框"></a>2.列表对话框</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">final</span> String items[] = &#123;<span class="string">"我是Item一"</span>, <span class="string">"我是Item二"</span>, <span class="string">"我是Item三"</span>, <span class="string">"我是Item四"</span>&#125;;</span><br><span class="line">        AlertDialog dialog = <span class="keyword">new</span> AlertDialog.Builder(<span class="keyword">this</span>)</span><br><span class="line">                .setIcon(R.mipmap.icon)<span class="comment">//设置标题的图片</span></span><br><span class="line">                .setTitle(<span class="string">"列表对话框"</span>)<span class="comment">//设置对话框的标题</span></span><br><span class="line">                .setItems(items, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                        Toast.makeText(MainActivity.<span class="keyword">this</span>, items[which], Toast.LENGTH_SHORT).show();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;)</span><br><span class="line">                .setNegativeButton(<span class="string">"取消"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                        dialog.dismiss();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;)</span><br><span class="line">                .setPositiveButton(<span class="string">"确定"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                        dialog.dismiss();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;).create();</span><br><span class="line">        dialog.show();</span><br></pre></td></tr></table></figure><blockquote><p>源码已经为我们预留好了设置方法，所以我们只需要调用.setItems()即可，第一个参数即要显示item的数组,第二个参数也就是点击item后的监听事件还是so easy的。</p></blockquote><p><center><img src="/2017/02/03/Android对话框/2.png"></center></p><h5 id="3-单选列表对话框"><a href="#3-单选列表对话框" class="headerlink" title="3.单选列表对话框"></a>3.单选列表对话框</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">final</span> String items[] = &#123;<span class="string">"我是Item一"</span>, <span class="string">"我是Item二"</span>, <span class="string">"我是Item三"</span>, <span class="string">"我是Item四"</span>&#125;;</span><br><span class="line">       AlertDialog dialog = <span class="keyword">new</span> AlertDialog.Builder(<span class="keyword">this</span>)</span><br><span class="line">               .setIcon(R.mipmap.icon)<span class="comment">//设置标题的图片</span></span><br><span class="line">               .setTitle(<span class="string">"单选列表对话框"</span>)<span class="comment">//设置对话框的标题</span></span><br><span class="line">               .setSingleChoiceItems(items, <span class="number">1</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                   <span class="meta">@Override</span></span><br><span class="line">                   <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                       Toast.makeText(MainActivity.<span class="keyword">this</span>, items[which], Toast.LENGTH_SHORT).show();</span><br><span class="line">                   &#125;</span><br><span class="line">               &#125;)</span><br><span class="line">               .setNegativeButton(<span class="string">"取消"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                   <span class="meta">@Override</span></span><br><span class="line">                   <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                       dialog.dismiss();</span><br><span class="line">                   &#125;</span><br><span class="line">               &#125;)</span><br><span class="line">               .setPositiveButton(<span class="string">"确定"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                   <span class="meta">@Override</span></span><br><span class="line">                   <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                       dialog.dismiss();</span><br><span class="line">                   &#125;</span><br><span class="line">               &#125;).create();</span><br><span class="line">       dialog.show();</span><br></pre></td></tr></table></figure><blockquote><p>.setSingleChoiceItems(items, 1, listener)第一个参数:设置单选的资源数组;第二个参数:设置默认选中哪一项。</p></blockquote><p><center><img src="/2017/02/03/Android对话框/3.png"></center></p><h5 id="4-多选列表对话框"><a href="#4-多选列表对话框" class="headerlink" title="4.多选列表对话框"></a>4.多选列表对话框</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">final</span> String items[] = &#123;<span class="string">"我是Item一"</span>, <span class="string">"我是Item二"</span>, <span class="string">"我是Item三"</span>, <span class="string">"我是Item四"</span>&#125;;</span><br><span class="line">        <span class="keyword">final</span> <span class="keyword">boolean</span> checkedItems[] = &#123;<span class="keyword">true</span>, <span class="keyword">false</span>, <span class="keyword">true</span>, <span class="keyword">false</span>&#125;;</span><br><span class="line">        AlertDialog dialog = <span class="keyword">new</span> AlertDialog.Builder(<span class="keyword">this</span>)</span><br><span class="line">                .setIcon(R.mipmap.icon)<span class="comment">//设置标题的图片</span></span><br><span class="line">                .setTitle(<span class="string">"多选对话框"</span>)<span class="comment">//设置对话框的标题</span></span><br><span class="line">                .setMultiChoiceItems(items, checkedItems, <span class="keyword">new</span> DialogInterface.OnMultiChoiceClickListener() &#123;</span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which, <span class="keyword">boolean</span> isChecked)</span> </span>&#123;</span><br><span class="line">                        checkedItems[which] = isChecked;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;)</span><br><span class="line">                .setNegativeButton(<span class="string">"取消"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                        dialog.dismiss();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;)</span><br><span class="line">                .setPositiveButton(<span class="string">"确定"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; checkedItems.length; i++) &#123;</span><br><span class="line">                            <span class="keyword">if</span> (checkedItems[i]) &#123;</span><br><span class="line">                                Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">"选中了"</span> + i, Toast.LENGTH_SHORT).show();</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                        dialog.dismiss();</span><br><span class="line">                    &#125;</span><br><span class="line"></span><br><span class="line">                &#125;).create();</span><br><span class="line"></span><br><span class="line">        dialog.show();</span><br></pre></td></tr></table></figure><blockquote><p>.setMultiChoiceItems(items, checkedItems, listener)//第一个参数:设置单选的资源;第二个参数:设置默认选中哪几项（数组）;</p></blockquote><p><center><img src="/2017/02/03/Android对话框/4.png"></center></p><h5 id="5-半自定义列表对话框"><a href="#5-半自定义列表对话框" class="headerlink" title="5.半自定义列表对话框"></a>5.半自定义列表对话框</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">View view = activity.getLayoutInflater().inflate(R.layout.layout2, <span class="keyword">null</span>);</span><br><span class="line">        <span class="keyword">final</span> EditText editText = view.findViewById(R.id.editText);</span><br><span class="line">        AlertDialog dialog = <span class="keyword">new</span> AlertDialog.Builder(activity)</span><br><span class="line">                .setIcon(R.mipmap.ic_launcher)<span class="comment">//设置标题的图片</span></span><br><span class="line">                .setTitle(<span class="string">"半自定义对话框"</span>)<span class="comment">//设置对话框的标题</span></span><br><span class="line">                .setView(view)</span><br><span class="line">                .setNegativeButton(<span class="string">"取消"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                        dialog.dismiss();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;)</span><br><span class="line">                .setPositiveButton(<span class="string">"确定"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                        String content = editText.getText().toString();</span><br><span class="line">                        Toast.makeText(activity, content, Toast.LENGTH_SHORT).show();</span><br><span class="line">                        dialog.dismiss();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;).create();</span><br><span class="line">        dialog.show();</span><br></pre></td></tr></table></figure><p>布局<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">LinearLayout</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">EditText</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:id</span>=<span class="string">"@+id/editText"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_weight</span>=<span class="string">"1"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:ems</span>=<span class="string">"10"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:inputType</span>=<span class="string">"textPersonName"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:text</span>=<span class="string">"Name"</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">LinearLayout</span>&gt;</span></span><br></pre></td></tr></table></figure></p><p><center><img src="/2017/02/03/Android对话框/5.png"></center></p><h5 id="6-完全自定义列表对话框"><a href="#6-完全自定义列表对话框" class="headerlink" title="6.完全自定义列表对话框"></a>6.完全自定义列表对话框</h5><p>首先我们需要自定义Dialog的style，让他自己本有的东西全部透明，然后在设置我们自己的内容就可以达到完全自定义的效果了。<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--对话框的样式--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">name</span>=<span class="string">"NormalDialogStyle"</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="xml">        <span class="comment">&lt;!--对话框背景 --&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowBackground"</span>&gt;</span>@android:color/transparent<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="comment">&lt;!--边框 --&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowFrame"</span>&gt;</span>@null<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="comment">&lt;!--没有标题 --&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowNoTitle"</span>&gt;</span>true<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="comment">&lt;!-- 是否浮现在Activity之上 --&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowIsFloating"</span>&gt;</span>true<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="comment">&lt;!--背景透明 --&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowIsTranslucent"</span>&gt;</span>false<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="comment">&lt;!-- 是否有覆盖 --&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowContentOverlay"</span>&gt;</span>@null<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="comment">&lt;!--背景变暗--&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:backgroundDimEnabled"</span>&gt;</span>true<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="undefined">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure></p><p>代码<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">final</span> Dialog dialog = <span class="keyword">new</span> Dialog(activity, R.style.NormalDialogStyle);</span><br><span class="line">        View view = View.inflate(activity, R.layout.dialog_normal, <span class="keyword">null</span>);</span><br><span class="line">        TextView cancel =  view.findViewById(R.id.cancel);</span><br><span class="line">        TextView confirm =  view.findViewById(R.id.confirm);</span><br><span class="line">        dialog.setContentView(view);</span><br><span class="line">        <span class="comment">//使得点击对话框外部不消失对话框</span></span><br><span class="line">        dialog.setCanceledOnTouchOutside(<span class="keyword">false</span>);</span><br><span class="line">        <span class="comment">//设置对话框的大小</span></span><br><span class="line">        view.setMinimumHeight(<span class="number">300</span>);</span><br><span class="line">        Window dialogWindow = dialog.getWindow();</span><br><span class="line">        WindowManager.LayoutParams lp = dialogWindow.getAttributes();</span><br><span class="line">        lp.width = <span class="number">500</span>;</span><br><span class="line">        lp.height = <span class="number">500</span>;</span><br><span class="line"><span class="comment">//这里设置对话框的位置center是居中还可以设置bottom等</span></span><br><span class="line">        lp.gravity = Gravity.CENTER;</span><br><span class="line">        dialogWindow.setAttributes(lp);</span><br><span class="line">        cancel.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>&#123;</span><br><span class="line">                dialog.dismiss();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">        confirm.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>&#123;</span><br><span class="line">                dialog.dismiss();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">        dialog.show();</span><br></pre></td></tr></table></figure></p><p>布局文件<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">RelativeLayout</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:background</span>=<span class="string">"#ffffff"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:id</span>=<span class="string">"@+id/textView"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_alignParentTop</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_centerHorizontal</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:text</span>=<span class="string">"TextView"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">TextView</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:id</span>=<span class="string">"@+id/textView2"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_alignEnd</span>=<span class="string">"@+id/textView"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_alignRight</span>=<span class="string">"@+id/textView"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_below</span>=<span class="string">"@+id/textView"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:text</span>=<span class="string">"TextView"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">LinearLayout</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_alignParentLeft</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_alignParentStart</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:layout_below</span>=<span class="string">"@+id/textView2"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:orientation</span>=<span class="string">"horizontal"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">Button</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:id</span>=<span class="string">"@+id/cancel"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_weight</span>=<span class="string">"1"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:text</span>=<span class="string">"Button"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">Button</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:id</span>=<span class="string">"@+id/confirm"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_weight</span>=<span class="string">"1"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:text</span>=<span class="string">"Button"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">LinearLayout</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">RelativeLayout</span>&gt;</span></span><br></pre></td></tr></table></figure></p><p>计算屏幕宽高的工具类<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ScreenSizeUtils</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> ScreenSizeUtils instance = <span class="keyword">null</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> screenWidth, screenHeight;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> ScreenSizeUtils <span class="title">getInstance</span><span class="params">(Context mContext)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (instance == <span class="keyword">null</span>) &#123;</span><br><span class="line">            <span class="keyword">synchronized</span> (ScreenSizeUtils.class) &#123;</span><br><span class="line">                <span class="keyword">if</span> (instance == <span class="keyword">null</span>)</span><br><span class="line">                    instance = <span class="keyword">new</span> ScreenSizeUtils(mContext);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> instance;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="title">ScreenSizeUtils</span><span class="params">(Context mContext)</span> </span>&#123;</span><br><span class="line">        WindowManager manager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);</span><br><span class="line">        DisplayMetrics dm = <span class="keyword">new</span> DisplayMetrics();</span><br><span class="line">        manager.getDefaultDisplay().getMetrics(dm);</span><br><span class="line">        screenWidth = dm.widthPixels;<span class="comment">// 获取屏幕分辨率宽度</span></span><br><span class="line">        screenHeight = dm.heightPixels;<span class="comment">// 获取屏幕分辨率高度</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//获取屏幕宽度</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getScreenWidth</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> screenWidth;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//获取屏幕高度</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getScreenHeight</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> screenHeight;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p><center><img src="/2017/02/03/Android对话框/6.png"></center></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;对话框是我们在开发者经常会用到的东西，他通常在进行一些不可逆操作时候用来提示用户。&quot;&gt;&lt;a href=&quot;#对话框是我们在开发者经常会用到的东西，他通常在进行一些不可逆操作时候用来提示用户。&quot; class=&quot;headerlink&quot; title=&quot;对话框是我们在开发者
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>Android6.0权限管理</title>
    <link href="https://zengwei123.github.io/2017/02/01/Android6.0%E6%9D%83%E9%99%90%E7%AE%A1/"/>
    <id>https://zengwei123.github.io/2017/02/01/Android6.0权限管/</id>
    <published>2017-02-01T02:06:53.000Z</published>
    <updated>2018-09-17T02:23:26.096Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>android 6.0 对权限管理，做了重新定义，导致项目的targetSdkVersion 是23 系统就会默认使用新的权限管理，也是6.0 的权限管理。<br>如果项目的 targetSdkVersion小于23 系统还是使用旧的权限管理。<br>6.0的权限管理与5.0之前的权限有什么不同呢？就是在6.0系统中的项目需要动态获取权限，让用户做出判断，是同意还是拒绝，像拍照定位等危险权限就需要去动态申请，但是同时也要在配置文件中配置。</p></blockquote><h4 id="一般我们获取权限的步骤时这样的："><a href="#一般我们获取权限的步骤时这样的：" class="headerlink" title="一般我们获取权限的步骤时这样的："></a>一般我们获取权限的步骤时这样的：</h4><p>1.检查是否有权限<br>2.权限没有时，获取权限<br>3.用户拒绝时弹出对话框提示用户授予权限<br>4.获取权限成功进入<br><br><center></center><br><br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">....</span><br><span class="line"><span class="comment">/**权限数组，将所有所需要的权限放在这里**/</span></span><br><span class="line">String[] permissions = &#123;Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE&#125;;</span><br><span class="line"><span class="comment">/**用来判断是否有权限未授予权限**/</span></span><br><span class="line">List&lt;String&gt; mPermissionList = <span class="keyword">new</span> ArrayList&lt;&gt;();</span><br><span class="line">....</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**权限判断和申请**/</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">initPermission</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="comment">/**清空没有通过的权限**/</span></span><br><span class="line">        mPermissionList.clear();</span><br><span class="line">        <span class="comment">/**逐个判断你要的权限是否已经通过**/</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; permissions.length; i++) &#123;</span><br><span class="line"><span class="comment">/** 这一个方法主要是主要用于检测某个权限是否已经被授予，</span></span><br><span class="line"><span class="comment"> * 方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。</span></span><br><span class="line"><span class="comment"> * 当返回DENIED就需要进行申请授权了。</span></span><br><span class="line"><span class="comment"> **/</span></span><br><span class="line">            <span class="keyword">if</span> (ContextCompat.checkSelfPermission(<span class="keyword">this</span>, permissions[i]) != PackageManager.PERMISSION_GRANTED) &#123;</span><br><span class="line">                <span class="comment">/**添加还未授予的权限**/</span></span><br><span class="line">                mPermissionList.add(permissions[i]);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">/**申请权限**/</span></span><br><span class="line">        <span class="keyword">if</span> (mPermissionList.size() &gt; <span class="number">0</span>) &#123;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">*有权限没有通过，需要申请*</span></span><br><span class="line"><span class="comment">*该方法是异步的，第一个参数是Context；第二个参数是需要申请的权限的字符串数组；</span></span><br><span class="line"><span class="comment">*第三个参数为requestCode，主要用于回调的时候检测。</span></span><br><span class="line"><span class="comment">*可以从方法名requestPermissions以及第二个参数看出，是支持一次性申请多个权限的，系统会通过对话框逐一询问用户是否授权。</span></span><br><span class="line"><span class="comment">**/</span></span><br><span class="line">            ActivityCompat.requestPermissions(<span class="keyword">this</span>, permissions, <span class="number">100</span>);</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            <span class="comment">/**说明权限都已经通过，可以做你想做的事情去**/</span></span><br><span class="line">            mvpPresenter.init();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p><p>在这个方法里我们就可以知道哪些权限没用获取了，然后提示用户授予权限，在授予权限的回调方法中判断用户是否授予了权限，重写onRequestPermissionsResult方法.<br>首先验证requestCode定位到你的申请，然后验证grantResults对应于申请的结果，这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限，那么grantResults的length就为2，分别记录你两个权限的申请结果。如果申请成功，就可以做你的事情了~<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span><span class="comment">/**获取点击权限的回调**/</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onRequestPermissionsResult</span><span class="params">(<span class="keyword">int</span> requestCode,String[] permissions,<span class="keyword">int</span>[] grantResults)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">super</span>.onRequestPermissionsResult(requestCode, permissions, grantResults);</span><br><span class="line"><span class="keyword">boolean</span> hasPermissionDismiss = <span class="keyword">false</span>;<span class="comment">//有权限没有通过</span></span><br><span class="line"><span class="keyword">if</span> (<span class="number">100</span> == requestCode) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; grantResults.length; i++) &#123;</span><br><span class="line">                <span class="keyword">if</span> (grantResults[i] == -<span class="number">1</span>) &#123;</span><br><span class="line">                    hasPermissionDismiss = <span class="keyword">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//如果有权限没有被允许</span></span><br><span class="line">            <span class="keyword">if</span> (hasPermissionDismiss) &#123;</span><br><span class="line"><span class="comment">//打开提示授予权限对话框，跳转到系统设置权限页面，或者直接关闭页面，不让他继续访问</span></span><br><span class="line">                showPermissionDialog();</span><br><span class="line">            &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                <span class="comment">//全部权限通过，可以进行下一步操作。。。</span></span><br><span class="line">                mvpPresenter.init();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p><p>下面是对话框的代码<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">    * 不再提示权限时的展示对话框</span></span><br><span class="line"><span class="comment">    */</span></span><br><span class="line">   AlertDialog mPermissionDialog;</span><br><span class="line">   String mPackName = <span class="string">"com.example.zengwei.zwpushbox"</span>;</span><br><span class="line">   <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">showPermissionDialog</span><span class="params">()</span> </span>&#123;</span><br><span class="line">       <span class="keyword">if</span> (mPermissionDialog == <span class="keyword">null</span>) &#123;   </span><br><span class="line">           mPermissionDialog = <span class="keyword">new</span> AlertDialog.Builder(<span class="keyword">this</span>).setMessage(<span class="string">"已禁用权限，请手动授予"</span>)</span><br><span class="line">               .setPositiveButton(<span class="string">"设置"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                   <span class="meta">@Override</span></span><br><span class="line">                   <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line"><span class="comment">/**这里是跳转到应用的权限授予页面**/</span></span><br><span class="line">                       cancelPermissionDialog();</span><br><span class="line">                       Uri packageURI = Uri.parse(<span class="string">"package:"</span> + mPackName);</span><br><span class="line">                       Intent intent = <span class="keyword">new</span> Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);</span><br><span class="line">                       startActivity(intent);</span><br><span class="line">                   &#125;</span><br><span class="line">               &#125;)</span><br><span class="line">               .setNegativeButton(<span class="string">"取消"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                   <span class="meta">@Override</span></span><br><span class="line">                   <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                       <span class="comment">//关闭页面或者做其他操作，直接关闭可能太流氓了，可以判断一下未授予的权限是不是一定得要然后在做操作</span></span><br><span class="line">                       cancelPermissionDialog();</span><br><span class="line">                       finish();</span><br><span class="line">                   &#125;</span><br><span class="line">               &#125;)</span><br><span class="line">           .create();</span><br><span class="line">       &#125;</span><br><span class="line">       mPermissionDialog.show();</span><br><span class="line">   &#125;</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;android 6.0 对权限管理，做了重新定义，导致项目的targetSdkVersion 是23 系统就会默认使用新的权限管理，也是6.0 的权限管理。&lt;br&gt;如果项目的 targetSdkVersion小于23 系统还是使用旧的权限管理。&lt;b
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>Android6.0权限管理</title>
    <link href="https://zengwei123.github.io/2017/02/01/Android6.0%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86/"/>
    <id>https://zengwei123.github.io/2017/02/01/Android6.0权限管理/</id>
    <published>2017-02-01T02:06:53.000Z</published>
    <updated>2018-09-17T02:14:06.037Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>android 6.0 对权限管理，做了重新定义，导致项目的targetSdkVersion 是23 系统就会默认使用新的权限管理，也是6.0 的权限管理。<br>如果项目的 targetSdkVersion小于23 系统还是使用旧的权限管理。<br>6.0的权限管理与5.0之前的权限有什么不同呢？就是在6.0系统中的项目需要动态获取权限，让用户做出判断，是同意还是拒绝，像拍照定位等危险权限就需要去动态申请，但是同时也要在配置文件中配置。</p></blockquote><h4 id="一般我们获取权限的步骤时这样的："><a href="#一般我们获取权限的步骤时这样的：" class="headerlink" title="一般我们获取权限的步骤时这样的："></a>一般我们获取权限的步骤时这样的：</h4><p>1.检查是否有权限<br>2.权限没有时，获取权限<br>3.用户拒绝时弹出对话框提示用户授予权限<br>4.获取权限成功进入<br><br><center><img src="/2017/02/01/Android6.0权限管理/1.png"></center><br><br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">....</span><br><span class="line"><span class="comment">/**权限数组，将所有所需要的权限放在这里**/</span></span><br><span class="line">String[] permissions = &#123;Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE&#125;;</span><br><span class="line"><span class="comment">/**用来判断是否有权限未授予权限**/</span></span><br><span class="line">List&lt;String&gt; mPermissionList = <span class="keyword">new</span> ArrayList&lt;&gt;();</span><br><span class="line">....</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**权限判断和申请**/</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">initPermission</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="comment">/**清空没有通过的权限**/</span></span><br><span class="line">        mPermissionList.clear();</span><br><span class="line">        <span class="comment">/**逐个判断你要的权限是否已经通过**/</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; permissions.length; i++) &#123;</span><br><span class="line"><span class="comment">/** 这一个方法主要是主要用于检测某个权限是否已经被授予，</span></span><br><span class="line"><span class="comment"> * 方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。</span></span><br><span class="line"><span class="comment"> * 当返回DENIED就需要进行申请授权了。</span></span><br><span class="line"><span class="comment"> **/</span></span><br><span class="line">            <span class="keyword">if</span> (ContextCompat.checkSelfPermission(<span class="keyword">this</span>, permissions[i]) != PackageManager.PERMISSION_GRANTED) &#123;</span><br><span class="line">                <span class="comment">/**添加还未授予的权限**/</span></span><br><span class="line">                mPermissionList.add(permissions[i]);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">/**申请权限**/</span></span><br><span class="line">        <span class="keyword">if</span> (mPermissionList.size() &gt; <span class="number">0</span>) &#123;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">*有权限没有通过，需要申请*</span></span><br><span class="line"><span class="comment">*该方法是异步的，第一个参数是Context；第二个参数是需要申请的权限的字符串数组；</span></span><br><span class="line"><span class="comment">*第三个参数为requestCode，主要用于回调的时候检测。</span></span><br><span class="line"><span class="comment">*可以从方法名requestPermissions以及第二个参数看出，是支持一次性申请多个权限的，系统会通过对话框逐一询问用户是否授权。</span></span><br><span class="line"><span class="comment">**/</span></span><br><span class="line">            ActivityCompat.requestPermissions(<span class="keyword">this</span>, permissions, <span class="number">100</span>);</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            <span class="comment">/**说明权限都已经通过，可以做你想做的事情去**/</span></span><br><span class="line">            mvpPresenter.init();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p><p>在这个方法里我们就可以知道哪些权限没用获取了，然后提示用户授予权限，在授予权限的回调方法中判断用户是否授予了权限，重写onRequestPermissionsResult方法.<br>首先验证requestCode定位到你的申请，然后验证grantResults对应于申请的结果，这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限，那么grantResults的length就为2，分别记录你两个权限的申请结果。如果申请成功，就可以做你的事情了~<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span><span class="comment">/**获取点击权限的回调**/</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onRequestPermissionsResult</span><span class="params">(<span class="keyword">int</span> requestCode,String[] permissions,<span class="keyword">int</span>[] grantResults)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">super</span>.onRequestPermissionsResult(requestCode, permissions, grantResults);</span><br><span class="line"><span class="keyword">boolean</span> hasPermissionDismiss = <span class="keyword">false</span>;<span class="comment">//有权限没有通过</span></span><br><span class="line"><span class="keyword">if</span> (<span class="number">100</span> == requestCode) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; grantResults.length; i++) &#123;</span><br><span class="line">                <span class="keyword">if</span> (grantResults[i] == -<span class="number">1</span>) &#123;</span><br><span class="line">                    hasPermissionDismiss = <span class="keyword">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//如果有权限没有被允许</span></span><br><span class="line">            <span class="keyword">if</span> (hasPermissionDismiss) &#123;</span><br><span class="line"><span class="comment">//打开提示授予权限对话框，跳转到系统设置权限页面，或者直接关闭页面，不让他继续访问</span></span><br><span class="line">                showPermissionDialog();</span><br><span class="line">            &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                <span class="comment">//全部权限通过，可以进行下一步操作。。。</span></span><br><span class="line">                mvpPresenter.init();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p><p>下面是对话框的代码<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">    * 不再提示权限时的展示对话框</span></span><br><span class="line"><span class="comment">    */</span></span><br><span class="line">   AlertDialog mPermissionDialog;</span><br><span class="line">   String mPackName = <span class="string">"com.example.zengwei.zwpushbox"</span>;</span><br><span class="line">   <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">showPermissionDialog</span><span class="params">()</span> </span>&#123;</span><br><span class="line">       <span class="keyword">if</span> (mPermissionDialog == <span class="keyword">null</span>) &#123;   </span><br><span class="line">           mPermissionDialog = <span class="keyword">new</span> AlertDialog.Builder(<span class="keyword">this</span>).setMessage(<span class="string">"已禁用权限，请手动授予"</span>)</span><br><span class="line">               .setPositiveButton(<span class="string">"设置"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                   <span class="meta">@Override</span></span><br><span class="line">                   <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line"><span class="comment">/**这里是跳转到应用的权限授予页面**/</span></span><br><span class="line">                       cancelPermissionDialog();</span><br><span class="line">                       Uri packageURI = Uri.parse(<span class="string">"package:"</span> + mPackName);</span><br><span class="line">                       Intent intent = <span class="keyword">new</span> Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);</span><br><span class="line">                       startActivity(intent);</span><br><span class="line">                   &#125;</span><br><span class="line">               &#125;)</span><br><span class="line">               .setNegativeButton(<span class="string">"取消"</span>, <span class="keyword">new</span> DialogInterface.OnClickListener() &#123;</span><br><span class="line">                   <span class="meta">@Override</span></span><br><span class="line">                   <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(DialogInterface dialog, <span class="keyword">int</span> which)</span> </span>&#123;</span><br><span class="line">                       <span class="comment">//关闭页面或者做其他操作，直接关闭可能太流氓了，可以判断一下未授予的权限是不是一定得要然后在做操作</span></span><br><span class="line">                       cancelPermissionDialog();</span><br><span class="line">                       finish();</span><br><span class="line">                   &#125;</span><br><span class="line">               &#125;)</span><br><span class="line">           .create();</span><br><span class="line">       &#125;</span><br><span class="line">       mPermissionDialog.show();</span><br><span class="line">   &#125;</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;android 6.0 对权限管理，做了重新定义，导致项目的targetSdkVersion 是23 系统就会默认使用新的权限管理，也是6.0 的权限管理。&lt;br&gt;如果项目的 targetSdkVersion小于23 系统还是使用旧的权限管理。&lt;b
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>第三方库Glide</title>
    <link href="https://zengwei123.github.io/2017/01/20/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93Glide/"/>
    <id>https://zengwei123.github.io/2017/01/20/第三方库Glide/</id>
    <published>2017-01-20T03:59:53.000Z</published>
    <updated>2018-10-12T08:27:41.752Z</updated>
    
    <content type="html"><![CDATA[<h3 id="glide是一个图片加载的库"><a href="#glide是一个图片加载的库" class="headerlink" title="glide是一个图片加载的库"></a>glide是一个图片加载的库</h3><h4 id="依赖-compile-‘com-github-bumptech-glide-glide-3-7-0’"><a href="#依赖-compile-‘com-github-bumptech-glide-glide-3-7-0’" class="headerlink" title="依赖 compile ‘com.github.bumptech.glide:glide:3.7.0’"></a>依赖 compile ‘com.github.bumptech.glide:glide:3.7.0’</h4><p>使用glide很简单就是简简单单的一句<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">  .load(<span class="string">"http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg"</span>)</span><br><span class="line">  .into(image);</span><br></pre></td></tr></table></figure></p><blockquote><p><strong>with(Context context)</strong>:Context支持 Activity Context Fragment FragmentActivity中四种类型<br><strong>load()</strong>:支持网络资源、assets资源、Resources资源、File资源、Uri资源、字节数组<br><strong>into()</strong>:在哪个imageview中显示</p></blockquote><p><br><br>glide可以加载的资源类型<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>).load(<span class="string">"http://pic9/258/a2.jpg"</span>).into(iv);    <span class="comment">//网络资源</span></span><br><span class="line">Glide.with(<span class="keyword">this</span>).load(<span class="string">"file:///xxx.jpg"</span>).into(iv);     <span class="comment">//file文件</span></span><br><span class="line">Glide.with(<span class="keyword">this</span>).load(R.mipmap.ic_launcher).into(iv);        <span class="comment">//资源文件</span></span><br><span class="line">Glide.with(<span class="keyword">this</span>).load(uri).into(iv);                     <span class="comment">//uri资源</span></span><br><span class="line">Glide.with(<span class="keyword">this</span>).load(<span class="keyword">byte</span>[]).into(iv);              <span class="comment">//byte数组</span></span><br></pre></td></tr></table></figure></p><p>不仅如此glide还可以加载动静态的gif<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>).load(imageUrl).asBitmap().into(iv); <span class="comment">//静态gif  其实就是一张图片</span></span><br><span class="line">Glide.with(<span class="keyword">this</span>).load(imageUrl).asGif().into(iv);    <span class="comment">//动态gif</span></span><br></pre></td></tr></table></figure></p><p>还可以加载本地的一个视频<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">String filePath = <span class="string">"/storage/emulated/0/Pictures/example_video.mp4"</span>;  <span class="comment">//视频路径</span></span><br><span class="line">Glide.with(context).load(Uri.fromFile(<span class="keyword">new</span> File( filePath))).into(iv);</span><br></pre></td></tr></table></figure></p><p>我们有时候加载网络图片可能会失败，这时候我们可以设置一个加载失败的图片<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">  .load(<span class="string">"http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg"</span>)</span><br><span class="line">  .error(<span class="string">"R.drawable.error"</span>)        <span class="comment">//加载错误的图片</span></span><br><span class="line">  .into(image)</span><br></pre></td></tr></table></figure></p><p>当图片真在加载的时候如果什么都没有，会让用户感觉非常不好，这是我们可以设置一个正在加载时显示的图片<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">  .load(<span class="string">"http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg"</span>)</span><br><span class="line">  .error(<span class="string">"R.drawable.error"</span>)        <span class="comment">//加载错误或失败后显示的图片</span></span><br><span class="line">  .placeholder(R.drawable.load)     <span class="comment">//正在加载时试显示的图片</span></span><br><span class="line">  .into(image)</span><br></pre></td></tr></table></figure></p><p>还可以设置先加载缩略图<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">  .load(<span class="string">"http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg"</span>)</span><br><span class="line">  .error(<span class="string">"R.drawable.error"</span>)        <span class="comment">//加载错误或失败后显示的图片</span></span><br><span class="line">  .placeholder(R.drawable.load)     <span class="comment">//正在加载时试显示的图片</span></span><br><span class="line">  .thumbnail(<span class="number">0.1f</span>)                  <span class="comment">//加载缩略图</span></span><br><span class="line">  .into(image)</span><br></pre></td></tr></table></figure></p><p>我们还可以设置加载的动画，这个动画默认是淡入淡出<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">  .load(<span class="string">"http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg"</span>)</span><br><span class="line">  .error(<span class="string">"R.drawable.error"</span>)        <span class="comment">//加载错误或失败后显示的图片</span></span><br><span class="line">  .placeholder(R.drawable.load)     <span class="comment">//正在加载时试显示的图片</span></span><br><span class="line">  .thumbnail(<span class="number">0.1f</span>)<span class="comment">//加载缩略图</span></span><br><span class="line">  .crossFade(<span class="number">1000</span>) <span class="comment">// 可设置时长，默认“300ms”</span></span><br><span class="line">  <span class="comment">//.animate(R.anim.fade_in)设置自定义的动画</span></span><br><span class="line">  <span class="comment">//.dontAnimate() 可以去除动画</span></span><br><span class="line">  .into(image)</span><br></pre></td></tr></table></figure></p><p>有时候我们需要去设置图的大小,除了自己去设置，Glide还给我们提供了两种缩放方法<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">  .load(<span class="string">"http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg"</span>)</span><br><span class="line">  .error(<span class="string">"R.drawable.error"</span>)        <span class="comment">//加载错误或失败后显示的图片</span></span><br><span class="line">  .placeholder(R.drawable.load)     <span class="comment">//正在加载时试显示的图片</span></span><br><span class="line">  .thumbnail(<span class="number">0.1f</span>)<span class="comment">//加载缩略图</span></span><br><span class="line">  .override(width,height) <span class="comment">//图片显示的分辨率 ，像素值 可以转化为DP再设置</span></span><br><span class="line">  <span class="comment">//.centerCrop()  CenterCrop 即缩放图像至填充到 ImageView内,裁剪额外的部分。ImageView会完全填充，但图像可能不会显示不全</span></span><br><span class="line">  <span class="comment">//.fitCenter()  fitCenter() 图片会按照imageview长宽中最小的边界作为依据,按比例缩放图像。该图像将会完全显示，但可能不会填满整个 ImageView。</span></span><br><span class="line">  .into(image)</span><br></pre></td></tr></table></figure></p><p>Glide还给我们提供了缓存的策略<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">.load(<span class="string">"http://nm/photo/1f/1f7a.jpg"</span>)</span><br><span class="line">.skipMemoryCache(<span class="keyword">true</span>)   <span class="comment">//跳过缓存</span></span><br><span class="line">.into(iv);</span><br><span class="line"></span><br><span class="line"><span class="comment">//设置缓存</span></span><br><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">.load(<span class="string">"http://nm/photo/1f/1f7a.jpg"</span>)</span><br><span class="line">.diskCacheStrategy(DiskCacheStrategy.ALL)</span><br><span class="line">.into(iv);</span><br><span class="line"><span class="comment">//DiskCacheStrategy.ALL  缓存源资源和转换后的资源</span></span><br><span class="line"><span class="comment">//DiskCacheStrategy.NONE   不做任何磁盘缓存</span></span><br><span class="line"><span class="comment">//DiskCacheStrategy.RESULT 缓存转换后的资源</span></span><br><span class="line"><span class="comment">//DiskCacheStrategy.SOURCE 缓存源资源</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**还提供了清理缓存的方法**/</span></span><br><span class="line">Glide.get(<span class="keyword">this</span>).clearDiskCache();<span class="comment">//在子线程中进行</span></span><br><span class="line">Glide.get(<span class="keyword">this</span>).clearMemory();<span class="comment">//可以在主线程</span></span><br><span class="line"><span class="comment">//获取文件缓存的路径，拿到路径之后我们就能够加载出缓存的图片</span></span><br><span class="line">Glide.with(context).load(imgUrl).downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get();</span><br></pre></td></tr></table></figure></p><p>还可以自己设置缓存的路径<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">GlideModuleConfig</span> <span class="keyword">implements</span> <span class="title">GlideModule</span> </span>&#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">applyOptions</span><span class="params">(Context context, GlideBuilder builder)</span> </span>&#123;</span><br><span class="line"><span class="comment">//内部存储/Android/data/包名/cache/glide-images</span></span><br><span class="line">builder.setDiskCache(<span class="keyword">new</span> ExternalCacheDiskCacheFactory(context, <span class="string">"glide-images"</span>, <span class="number">2</span> * <span class="number">1024</span> * <span class="number">1024</span>));   </span><br><span class="line"><span class="comment">//将默认的RGB_565效果转换到ARGB_8888</span></span><br><span class="line"> builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">registerComponents</span><span class="params">(Context context, Glide glide)</span> </span>&#123;</span><br><span class="line">        <span class="comment">//不做处理</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>然后在配置文件中配置，application节点下<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">meta-data</span></span></span><br><span class="line"><span class="tag">     <span class="attr">android:name</span>=<span class="string">"包名.widget.GlideModuleConfig"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">android:value</span>=<span class="string">"GlideModule"</span> /&gt;</span></span><br></pre></td></tr></table></figure></p><p>同时我们还可设置图片的模糊度，像下面这样，这时我们需要在另外导入一个依赖，这是一个模糊的依赖</p><h4 id="依赖compile-‘jp-wasabeef-glide-transformations-2-0-1’"><a href="#依赖compile-‘jp-wasabeef-glide-transformations-2-0-1’" class="headerlink" title="依赖compile ‘jp.wasabeef:glide-transformations:2.0.1’"></a>依赖compile ‘jp.wasabeef:glide-transformations:2.0.1’</h4><p></p><p><center><img src="/2017/01/20/第三方库Glide/1.png"></center></p><br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">  .load(<span class="string">"http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg"</span>)</span><br><span class="line">  .error(<span class="string">"R.drawable.error"</span>)        <span class="comment">//加载错误或失败后显示的图片</span></span><br><span class="line">  .placeholder(R.drawable.load)     <span class="comment">//正在加载时试显示的图片</span></span><br><span class="line">  .thumbnail(<span class="number">0.1f</span>)</span><br><span class="line">  <span class="comment">// “23”：设置模糊度(在0.0到25.0之间)，默认”25";"4":图片缩放比例,默认“1”。</span></span><br><span class="line">  .bitmapTransform(<span class="keyword">new</span> BlurTransformation(context,<span class="number">23</span>,<span class="number">4</span>))   <span class="comment">//模糊</span></span><br><span class="line">  .into(image)</span><br></pre></td></tr></table></figure><p></p><p>利用这个库还可以进行裁剪圆角等<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//原图基础上变换设置圆形图</span></span><br><span class="line">Glide.with(context).load(url).bitmapTransform(<span class="keyword">new</span> CropCircleTransformation(<span class="keyword">this</span>)).into(iv);  </span><br><span class="line"><span class="comment">//原图基础上变换成圆图 +毛玻璃（高斯模糊）</span></span><br><span class="line">Glide.with(<span class="keyword">this</span>).load(url).bitmapTransform(<span class="keyword">new</span> BlurTransformation(<span class="keyword">this</span>, <span class="number">25</span>), <span class="keyword">new</span> CropCircleTransformation(<span class="keyword">this</span>)).into(iv);</span><br><span class="line"><span class="comment">//y圆角</span></span><br><span class="line"><span class="comment">//如果是四周已经是圆角则RoundedCornersTransformation.CornerType.ALL</span></span><br><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">                .load(url)</span><br><span class="line">                .bitmapTransform(<span class="keyword">new</span> RoundedCornersTransformation(<span class="keyword">this</span>, <span class="number">30</span>, <span class="number">0</span>, RoundedCornersTransformation.CornerType.BOTTOM))</span><br><span class="line">                .into(iv);</span><br></pre></td></tr></table></figure></p><p>同时我们还可以对加载进行监听,注意：如果需要加载完成后设置图片透明度为0，则不能设置.placeholder(R.drawable.url)，否则达不到你想要的效果。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">Glide.with(<span class="keyword">this</span>)</span><br><span class="line">  .load(<span class="string">"http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg"</span>)</span><br><span class="line">  .listener(<span class="keyword">new</span> RequestListener&lt;String, GlideDrawable&gt;() &#123;</span><br><span class="line">      <span class="meta">@Override</span></span><br><span class="line">      <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onException</span><span class="params">(Exception e, String model, Target&lt;GlideDrawable&gt; target, <span class="keyword">boolean</span> isFirstResource)</span> </span>&#123;</span><br><span class="line">          Toast.makeText(getApplicationContext(),<span class="string">"资源加载异常"</span>,Toast.LENGTH_SHORT).show();</span><br><span class="line">          <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="comment">//这个用于监听图片是否加载完成</span></span><br><span class="line">      <span class="meta">@Override</span></span><br><span class="line">      <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onResourceReady</span><span class="params">(GlideDrawable resource, String model, Target&lt;GlideDrawable&gt; target, <span class="keyword">boolean</span> isFromMemoryCache, <span class="keyword">boolean</span> isFirstResource)</span> </span>&#123;</span><br><span class="line">          Toast.makeText(getApplicationContext(),<span class="string">"图片加载完成"</span>,Toast.LENGTH_SHORT).show();</span><br><span class="line">          <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">      &#125;</span><br><span class="line">  &#125;)</span><br><span class="line">  .into(image)</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;glide是一个图片加载的库&quot;&gt;&lt;a href=&quot;#glide是一个图片加载的库&quot; class=&quot;headerlink&quot; title=&quot;glide是一个图片加载的库&quot;&gt;&lt;/a&gt;glide是一个图片加载的库&lt;/h3&gt;&lt;h4 id=&quot;依赖-compile-‘com-g
      
    
    </summary>
    
      <category term="第三方库" scheme="https://zengwei123.github.io/categories/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93/"/>
    
    
  </entry>
  
  <entry>
    <title>Git上传及命令大全</title>
    <link href="https://zengwei123.github.io/2017/01/15/Git%E4%B8%8A%E4%BC%A0%E5%8F%8A%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8/"/>
    <id>https://zengwei123.github.io/2017/01/15/Git上传及命令大全/</id>
    <published>2017-01-15T03:52:03.000Z</published>
    <updated>2018-09-08T07:12:43.519Z</updated>
    
    <content type="html"><![CDATA[<p>记录一下上传项目到github<br>首先在github上面建立一个仓库</p><p><center><img src="/2017/01/15/Git上传及命令大全/1.png"></center></p><br>然后切换到自己的项目的的路径下面<br><p><center><img src="/2017/01/15/Git上传及命令大全/2.png"></center></p><blockquote><p>1.输入<strong>git init</strong>，使Test文件夹加入git管理<br>2.输入<strong>git add .</strong>（不要漏了“.”），将Test文件夹全部内容添加到git。<br>3.输入<strong>git commit -m “你想要提交的信息”</strong><br>4.输入<strong>git remote add origin 这里填你自己项目仓库地址</strong> ，连接你的guthub仓库。<br>5.输入<strong>git push -u origin master</strong>，上传项目到Github。这里会要求输入Github的账号密码，按要求输入就可以。</p></blockquote><p>最后出现下面这样就成功上传到仓库了</p><p><center><img src="/2017/01/15/Git上传及命令大全/3.png"></center></p><p>如果出现下面这样的情况，先<strong>git pull </strong>再<strong>git push</strong></p><p><center><img src="/2017/01/15/Git上传及命令大全/4.png"></center></p><p>下面贴个命令大全：<a href="https://www.cnblogs.com/vman/articles/Git_cmds.html" target="_blank" rel="noopener">https://www.cnblogs.com/vman/articles/Git_cmds.html</a> </p><blockquote><p>查看、添加、提交、删除、找回，重置修改文件     </p></blockquote><p>git help <command> # 显示command的help</p><p>git show # 显示某次提交的内容 git show $id</p><p>git co – <file> # 抛弃工作区修改</file></p><p>git co . # 抛弃工作区修改</p><p>git add <file> # 将工作文件修改提交到本地暂存区</file></p><p>git add . # 将所有修改过的工作文件提交暂存区</p><p>git rm <file> # 从版本库中删除文件</file></p><p>git rm <file> –cached # 从版本库中删除文件，但不删除文件</file></p><p>git reset <file> # 从暂存区恢复到工作文件</file></p><p>git reset – . # 从暂存区恢复到工作文件</p><p>git reset –hard # 恢复最近一次提交过的状态，即放弃上次提交后的所有本次修改</p><p>git ci <file> git ci . git ci -a # 将git add, git rm和git ci等操作都合并在一起做git ci -am “some comments”</file></p><p>git ci –amend # 修改最后一次提交记录</p><p>git revert &lt;$id&gt; # 恢复某次提交的状态，恢复动作本身也创建次提交对象</p><p>git revert HEAD # 恢复最后一次提交的状态</p><p>查看文件diff</p><p>git diff <file> # 比较当前文件和暂存区文件差异 git diff</file></p><p>git diff <id1><id1><id2> # 比较两次提交之间的差异</id2></id1></id1></p><p>git diff <branch1>..<branch2> # 在两个分支之间比较</branch2></branch1></p><p>git diff –staged # 比较暂存区和版本库差异</p><p>git diff –cached # 比较暂存区和版本库差异</p><p>git diff –stat # 仅仅比较统计信息</p><p>查看提交记录</p><p>git log git log <file> # 查看该文件每次提交记录</file></p><p>git log -p <file> # 查看每次详细修改内容的diff</file></p><p>git log -p -2 # 查看最近两次详细修改内容的diff</p><p>git log –stat #查看提交统计信息</p><p>tig</p><p>Mac上可以使用tig代替diff和log，brew install tig</p><p>Git 本地分支管理</p><p>查看、切换、创建和删除分支</p><p>git br -r # 查看远程分支</p><p>git br &lt;new_branch&gt; # 创建新的分支</p><p>git br -v # 查看各个分支最后提交信息</p><p>git br –merged # 查看已经被合并到当前分支的分支</p><p>git br –no-merged # 查看尚未被合并到当前分支的分支</p><p>git co <branch> # 切换到某个分支</branch></p><p>git co -b &lt;new_branch&gt; # 创建新的分支，并且切换过去</p><p>git co -b &lt;new_branch&gt; <branch> # 基于branch创建新的new_branch</branch></p><p>git co $id # 把某次历史提交记录checkout出来，但无分支信息，切换到其他分支会自动删除</p><p>git co $id -b &lt;new_branch&gt; # 把某次历史提交记录checkout出来，创建成一个分支</p><p>git br -d <branch> # 删除某个分支</branch></p><p>git br -D <branch> # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)</branch></p><p> 分支合并和rebase</p><p>git merge <branch> # 将branch分支合并到当前分支</branch></p><p>git merge origin/master –no-ff # 不要Fast-Foward合并，这样可以生成merge提交</p><p>git rebase master <branch> # 将master rebase到branch，相当于： git co <branch> &amp;&amp; git rebase master &amp;&amp; git co master &amp;&amp; git merge <branch></branch></branch></branch></p><p> Git补丁管理(方便在多台机器上开发同步时用)</p><p>git diff &gt; ../sync.patch # 生成补丁</p><p>git apply ../sync.patch # 打补丁</p><p>git apply –check ../sync.patch #测试补丁能否成功</p><p> Git暂存管理</p><p>git stash # 暂存</p><p>git stash list # 列所有stash</p><p>git stash apply # 恢复暂存的内容</p><p>git stash drop # 删除暂存区</p><p>Git远程分支管理</p><p>git pull # 抓取远程仓库所有分支更新并合并到本地</p><p>git pull –no-ff # 抓取远程仓库所有分支更新并合并到本地，不要快进合并</p><p>git fetch origin # 抓取远程仓库更新</p><p>git merge origin/master # 将远程主分支合并到本地当前分支</p><p>git co –track origin/branch # 跟踪某个远程分支创建相应的本地分支</p><p>git co -b &lt;local_branch&gt; origin/&lt;remote_branch&gt; # 基于远程分支创建本地分支，功能同上</p><p>git push # push所有分支</p><p>git push origin master # 将本地主分支推到远程主分支</p><p>git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建，用于初始化远程仓库)</p><p>git push origin &lt;local_branch&gt; # 创建远程分支， origin是远程仓库名</p><p>git push origin &lt;local_branch&gt;:&lt;remote_branch&gt; # 创建远程分支</p><p>git push origin :&lt;remote_branch&gt; #先删除本地分支(git br -d <branch>)，然后再push删除远程分支</branch></p><p>Git远程仓库管理</p><p>GitHub</p><p>git remote -v # 查看远程服务器地址和仓库名称</p><p>git remote show origin # 查看远程服务器仓库状态</p><p>git remote add origin git@ github:robbin/robbin_site.git # 添加远程仓库地址</p><p>git remote set-url origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址) git remote rm <repository> # 删除远程仓库</repository></p><p>创建远程仓库</p><p>git clone –bare robbin_site robbin_site.git # 用带版本的项目创建纯版本仓库</p><p>scp -r my_project.git git@ git.csdn.net:~ # 将纯仓库上传到服务器上</p><p>mkdir robbin_site.git &amp;&amp; cd robbin_site.git &amp;&amp; git –bare init # 在服务器创建纯仓库</p><p>git remote add origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址</p><p>git push -u origin master # 客户端首次提交</p><p>git push -u origin develop # 首次将本地develop分支提交到远程develop分支，并且track</p><p>git remote set-head origin master # 设置远程仓库的HEAD指向master分支</p><p>也可以命令设置跟踪远程库和本地库</p><p>git branch –set-upstream master origin/master</p><p>git branch –set-upstream develop origin/develop</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;记录一下上传项目到github&lt;br&gt;首先在github上面建立一个仓库&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;img src=&quot;/2017/01/15/Git上传及命令大全/1.png&quot;&gt;&lt;/center&gt;&lt;/p&gt;&lt;br&gt;然后切换到自己的项目的的路径下面&lt;br&gt;&lt;p&gt;&lt;cent
      
    
    </summary>
    
      <category term="GitHub-Git" scheme="https://zengwei123.github.io/categories/GitHub-Git/"/>
    
    
  </entry>
  
  <entry>
    <title>Android截图当前界面并且保存</title>
    <link href="https://zengwei123.github.io/2017/01/11/Android%E6%88%AA%E5%9B%BE%E5%BD%93%E5%89%8D%E7%95%8C%E9%9D%A2%E5%B9%B6%E4%B8%94%E4%BF%9D%E5%AD%98/"/>
    <id>https://zengwei123.github.io/2017/01/11/Android截图当前界面并且保存/</id>
    <published>2017-01-11T06:19:47.000Z</published>
    <updated>2018-09-03T06:21:49.607Z</updated>
    
    <content type="html"><![CDATA[<p>获取屏幕保存成图片，其实就是一个截图功能，只不过这个截图是截不到状态栏的。<br>看注释，通过下面的代码我们就得到了当前界面的Bitmap。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//获取当前屏幕的大小</span></span><br><span class="line"><span class="keyword">int</span> width = activity.getWindow().getDecorView().getRootView().getWidth();</span><br><span class="line"><span class="keyword">int</span> height = activity.getWindow().getDecorView().getRootView().getHeight();</span><br><span class="line"><span class="comment">//生成相同大小的图片</span></span><br><span class="line">Bitmap temBitmap = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 );</span><br><span class="line"><span class="comment">//找到当前页面的跟布局</span></span><br><span class="line">View view =  activity.getWindow().getDecorView().getRootView();</span><br><span class="line"><span class="comment">//清除缓存</span></span><br><span class="line">view.destroyDrawingCache();</span><br><span class="line"><span class="comment">//设置缓</span></span><br><span class="line">view.setDrawingCacheEnabled(<span class="keyword">true</span>);</span><br><span class="line">view.buildDrawingCache();</span><br><span class="line"><span class="comment">//从缓存中获取当前屏幕的图片</span></span><br><span class="line">temBitmap = view.getDrawingCache();</span><br></pre></td></tr></table></figure></p><p>拿到Bitmap之后我们就可以进行一些保存操作<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line"><span class="comment">//保存路径，这个路径是项目的私有路径</span></span><br><span class="line">File file=<span class="keyword">new</span> File(context.getFilesDir().getPath()+<span class="string">"/disk.jpg"</span>);</span><br><span class="line">file.delete();</span><br><span class="line">FileOutputStream fos = <span class="keyword">new</span> FileOutputStream(file);</span><br><span class="line"><span class="comment">//图片，可以进行压缩，然后保存</span></span><br><span class="line">    temBitmap.compress(Bitmap.CompressFormat.JPEG, <span class="number">100</span>, fos);</span><br><span class="line">    <span class="comment">//清空并关闭</span></span><br><span class="line">fos.flush(); </span><br><span class="line">    fos.close();</span><br><span class="line">&#125; <span class="keyword">catch</span> (FileNotFoundException e) &#123;</span><br><span class="line">    e.printStackTrace();</span><br><span class="line">&#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">    e.printStackTrace();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;获取屏幕保存成图片，其实就是一个截图功能，只不过这个截图是截不到状态栏的。&lt;br&gt;看注释，通过下面的代码我们就得到了当前界面的Bitmap。&lt;br&gt;&lt;figure class=&quot;highlight java&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;p
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>AS模拟器root</title>
    <link href="https://zengwei123.github.io/2017/01/09/AS%E6%A8%A1%E6%8B%9F%E5%99%A8root/"/>
    <id>https://zengwei123.github.io/2017/01/09/AS模拟器root/</id>
    <published>2017-01-09T04:27:06.000Z</published>
    <updated>2018-08-31T04:30:35.205Z</updated>
    
    <content type="html"><![CDATA[<p>当我们在Android studio中打开Android device  monitor时，发现data目录不能打开，当我们去点击/data/目录时，发现什么都没有，这是怎么回事呢？</p><p>原因是我们权限不够，当前的用户没有权限访问data目录。<br>首先在sdk下找到，platform-tools目录，运行cmd，切换盘符到platform-tools目录。</p><p>1.输入<strong>adb shell</strong>命令</p><p>2.然后输入<strong>su</strong>，使得用户切换到root</p><p>3.输入<strong>chmod -R 777 /data/</strong> 这是将/data/目录的权限改为777(表示任何人都可以访问和修改)</p><p>4.刷新一下Android device monitor，发现data目录可以打开了</p><p>5.经过上面的操作已经可以打开/data/data/了，但是导出文件会出现</p><blockquote><p>transfer error: open failed: Permission denied<br>Failed to pull selection: open failed: Permission denied</p></blockquote><p>6.我们来到终端，输入<strong>adb root</strong>，一般情况下这样就可以导出文件了，但是如果遇见出现了下面这种情况，这说明有多个设备在运行。</p><blockquote><p>adb: unable to connect for root: more than one device/emulator</p></blockquote><p>7.首先要查一下，是不是真的有多个设备或模拟器。输入<strong>adb devices</strong>，发现有下面这种情况<br><br><center><img src="/2017/01/09/AS模拟器root/1.png"></center><br><br>8.那么我们就给他指定设备，运行<strong>adb -s emulator-5554 shell</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;当我们在Android studio中打开Android device  monitor时，发现data目录不能打开，当我们去点击/data/目录时，发现什么都没有，这是怎么回事呢？&lt;/p&gt;
&lt;p&gt;原因是我们权限不够，当前的用户没有权限访问data目录。&lt;br&gt;首先在sdk
      
    
    </summary>
    
      <category term="工具" scheme="https://zengwei123.github.io/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
  </entry>
  
  <entry>
    <title>Android动画2</title>
    <link href="https://zengwei123.github.io/2016/11/27/Android%E5%8A%A8%E7%94%BB2/"/>
    <id>https://zengwei123.github.io/2016/11/27/Android动画2/</id>
    <published>2016-11-27T01:16:27.000Z</published>
    <updated>2018-08-22T07:43:05.488Z</updated>
    
    <content type="html"><![CDATA[<blockquote><h4 id="安卓在5-0以后有一些新的动画："><a href="#安卓在5-0以后有一些新的动画：" class="headerlink" title="安卓在5.0以后有一些新的动画："></a>安卓在5.0以后有一些新的动画：</h4><ul><li><strong>·</strong> Touch feedback（触摸反馈）</li><li><strong>·</strong> Reveal effect（揭露效果）</li><li><strong>·</strong> Activity transitions（Activity转换效果）</li><li><strong>·</strong> Curved motion（曲线运动）</li><li><strong>·</strong> View state changes（视图状态改变）</li></ul></blockquote><p>下面一个一个的来说</p><blockquote><h3 id="1-触摸反馈"><a href="#1-触摸反馈" class="headerlink" title="1.触摸反馈"></a>1.触摸反馈</h3></blockquote><p>顾名思义，触摸的时候给你一个反馈，最典型的就是<strong>Button</strong>默认的水波纹了，当使用了Material主题之后，波纹动画会自动安装到所有的控件上面。当然，我们也可以设置了，上面的第一种是设置波纹有边界，第二种是设置波纹超出边界。第二种需要5.0以上才行。<br>这里注意：除了Button外，如果像TextView这些控件，需要给予点击事件才能够有效果。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">android:background=<span class="string">"?android:attr/selectableItemBackground"</span></span><br><span class="line">android:background=<span class="string">"?android:attr/selectableItemBackgroundBorderless"</span></span><br></pre></td></tr></table></figure></p><p><br><center><img src="/2016/11/27/Android动画2/GIF1.gif"><img src="/2016/11/27/Android动画2/GIF2.gif"></center><br><br>如果你觉得默认的颜色丑，那么你还可以自己区设置颜色，在drawable创建一个ripple的xml文件，android：background=”在这里引用就行”;<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;ripple xmlns:android=<span class="string">"http://schemas.android.com/apk/res/android"</span> android:color=<span class="string">"#ffff00"</span> android:radius=<span class="string">"200dp"</span>&gt;</span><br><span class="line"> &lt;item android:drawable="@android:color/background_light"&gt;&lt;/item&gt;   &lt;!--把这个删除掉就是第二种无边框状态--&gt;</span><br><span class="line">&lt;/ripple&gt;</span><br></pre></td></tr></table></figure></p><blockquote><h3 id="2-视图状态改变"><a href="#2-视图状态改变" class="headerlink" title="2.视图状态改变"></a>2.视图状态改变</h3></blockquote><p>除了这种水波纹之外，我们还可以定义自己的动画，使用android:stateListAnimator，这个东西，我们先看看效果：<br><br><center><img src="/2016/11/27/Android动画2/GIF3.gif"></center><br><br>像这个翻转动画就是我们自己定义的，使用这个也很简单，在animator下创建一个XML文件，看下面的代码你可会发现是一个objectAnimator，这个跟属性动画的xml编写是一样的，android:state_pressed=”true” 按下false为抬起。<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><br><span class="line"><span class="tag">&lt;<span class="name">selector</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:state_pressed</span>=<span class="string">"true"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">set</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">objectAnimator</span> <span class="attr">android:duration</span>=<span class="string">"500"</span> <span class="attr">android:propertyName</span>=<span class="string">"rotationX"</span> <span class="attr">android:valueTo</span>=<span class="string">"360"</span> <span class="attr">android:valueType</span>=<span class="string">"floatType"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">set</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:state_pressed</span>=<span class="string">"false"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">set</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">objectAnimator</span> <span class="attr">android:duration</span>=<span class="string">"500"</span> <span class="attr">android:propertyName</span>=<span class="string">"rotationX"</span> <span class="attr">android:valueTo</span>=<span class="string">"0"</span> <span class="attr">android:valueType</span>=<span class="string">"floatType"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">set</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">selector</span>&gt;</span></span><br></pre></td></tr></table></figure></p><p>我们怎么使用这个动画呢？两种方法第一代码实现，第种二配置android:stateListAnimator=”@nimator/XXX.xml“<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">StateListAnimator stateListAnimator= AnimatorInflater.loadStateListAnimator(getApplicationContext(),R.animator.asd);</span><br><span class="line">textView.setStateListAnimator(stateListAnimator);</span><br></pre></td></tr></table></figure></p><blockquote><h3 id="3-揭露效果"><a href="#3-揭露效果" class="headerlink" title="3.揭露效果"></a>3.揭露效果</h3></blockquote><p><br><center><img src="/2016/11/27/Android动画2/GIF4.gif"></center><br><br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Animator animator = ViewAnimationUtils.createCircularReveal(textView,</span><br><span class="line">                        textView.getWidth()/<span class="number">2</span>,</span><br><span class="line">                        textView.getHeight()/<span class="number">2</span>,</span><br><span class="line">                        textView.getWidth(),<span class="number">0</span>);</span><br><span class="line">                animator.setInterpolator(<span class="keyword">new</span> AccelerateDecelerateInterpolator());</span><br><span class="line">                animator.setDuration(<span class="number">5000</span>);</span><br><span class="line">                animator.start();</span><br></pre></td></tr></table></figure></p><p>方法的第一个参数是你要操作的view,第二个是原中心的X方向中点，第三个是圆Y方向的中点，第四个是原开始的半径，第五个是结束时候的半径。</p><blockquote><h3 id="4-曲线运动"><a href="#4-曲线运动" class="headerlink" title="4.曲线运动"></a>4.曲线运动</h3></blockquote><p><br><center><img src="/2016/11/27/Android动画2/GIF5.gif"></center><br><br>曲线运动很容易，就是画一个贝塞尔曲线出来，然后沿着轨迹运动，他的使用方法跟属性动画一样。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Path path = <span class="keyword">new</span> Path();</span><br><span class="line">   path.moveTo(<span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">   path.quadTo(<span class="number">200</span>, <span class="number">200</span>,<span class="number">400</span>,<span class="number">0</span>);</span><br><span class="line">   ObjectAnimator mAnimator=ObjectAnimator.ofFloat(textView, View.X, View.Y, path);</span><br><span class="line">   mAnimator.setDuration(<span class="number">2000</span>);</span><br><span class="line">   mAnimator.setEvaluator(<span class="keyword">new</span> FloatEvaluator());</span><br><span class="line">   mAnimator.setRepeatCount(-<span class="number">1</span>);</span><br><span class="line">   mAnimator.setRepeatMode(ObjectAnimator.REVERSE);</span><br><span class="line">   mAnimator.start();</span><br></pre></td></tr></table></figure></p><blockquote><h3 id="5-Activity转换效果"><a href="#5-Activity转换效果" class="headerlink" title="5.Activity转换效果"></a>5.Activity转换效果</h3></blockquote><p>在Android L之前，我们可以在startActivity之后调用overridePendingTransition来指定Activity的转场动画。现在Android L给我们带来了更绚丽的转场动画。<br>新的转场动画分为两大类，一种是普通的过渡动画，另一种是共享元素的过渡动画。 要想使用新的转场动画，可以继承Material Design主题后在style风格中指定：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">name</span>=<span class="string">"DefaultTheme"</span> <span class="attr">parent</span>=<span class="string">"android:Theme.Material"</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="xml">    <span class="comment">&lt;!-- 允许使用transitions --&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowContentTransitions"</span>&gt;</span>true<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="comment">&lt;!-- 指定进入、退出、返回、重新进入时的transitions --&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowEnterTransition"</span>&gt;</span>@transition/explode<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowExitTransition"</span>&gt;</span>@transition/explode<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowReturnTransition"</span>&gt;</span>@transition/explode<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowReenterTransition"</span>&gt;</span>@transition/explode<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="comment">&lt;!-- 指定进入、退出、返回、重新进入时的共享transitions --&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowSharedElementEnterTransition"</span>&gt;</span>@transition/change<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowSharedElementExitTransition"</span>&gt;</span>@transition/change<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowSharedElementReturnTransition"</span>&gt;</span>@transition/change<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">name</span>=<span class="string">"android:windowSharedElementReenterTransition"</span>&gt;</span>@transition/change<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span></span><br></pre></td></tr></table></figure><p>也可以在activity的oncreate方法中进行代码设置：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 允许使用transitions</span></span><br><span class="line">getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);</span><br><span class="line"><span class="comment">// 指定进入、退出、返回、重新进入时的transitions</span></span><br><span class="line">getWindow().setEnterTransition(<span class="keyword">new</span> Explode());</span><br><span class="line">getWindow().setExitTransition(<span class="keyword">new</span> Explode());</span><br><span class="line">getWindow().setEnterTransition(<span class="keyword">new</span> Explode());</span><br><span class="line">getWindow().setExitTransition(<span class="keyword">new</span> Explode());</span><br><span class="line"><span class="comment">// 指定进入、退出、返回、重新进入时的共享transitions</span></span><br><span class="line">getWindow().setSharedElementEnterTransition(<span class="keyword">new</span> ChangeTransform());</span><br><span class="line">getWindow().setSharedElementExitTransition(<span class="keyword">new</span> ChangeTransform());</span><br><span class="line">getWindow().setSharedElementReturnTransition(<span class="keyword">new</span> ChangeTransform());</span><br><span class="line">getWindow().setSharedElementReenterTransition(<span class="keyword">new</span> ChangeTransform());</span><br></pre></td></tr></table></figure></p><p>普通转场动画<br>所有继承自visibility类都可以作为进入、退出的过度动画。如果我们想自定义进入和退出时的动画效果，只需要继承Visibility，重载onAppear和onDisappear方法来定义进入喝退出的动画。系统提供了三种默认方式：</p><ul><li>explode 从屏幕中心移入或移出视图</li><li>slide 从屏幕边缘移入或移出视图</li><li>fade 改变视图的透明度<br>想在xml中指定自定义的进入、退出的过度动画需要先对动画进行定义：<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">transition</span> <span class="attr">class</span>=<span class="string">"my.app.transition.CustomTransition"</span>/&gt;</span></span><br></pre></td></tr></table></figure></li></ul><p>注意：其中CustomTransition是你自定义的动画，它必须继承自Visibility。<br>想以普通转场动画的方式启动一个Activity，必须在startActivity函数中传递一个ActivityOptions的Bundle对象：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity);  </span><br><span class="line">startActivity(intent, options.toBundle());</span><br></pre></td></tr></table></figure></p><p>如果想让返回也具备转场效果，那么在返回的Activity中不要再调用finish函数，而是应该使用finishAfterTransition来结束一个Activity，该函数会等待动画执行完毕才结束该Activity。</p><p>共享转场动画<br>当两个Activity具备某些相遇的元素时，共享转场动画将是一个非常好的选择。使用转场动画需要将相同的元素通过android:transitionName或者view.setTransitionName设置为相同的名称，这样系统才能区分出相同的元素。</p><p>共享转场动画支持以下共享元素：</p><p>changeBounds 对目标视图的大小进行动画<br>changeClipBounds 对目标视图的剪裁大小进行动画<br>changeTransform 对目标视图进行缩放、旋转、位移动画<br>changeImageTransform 对目标图片进行缩放<br>通过下面的函数启动一个共享元素动画：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity, view, <span class="string">"name"</span>);  </span><br><span class="line">startActivity(intent, options.toBundle());</span><br></pre></td></tr></table></figure></p><p>如果有多个共享元素，则可以通过Pair进行包装处理：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity,Pair.create(view1, <span class="string">"name1"</span>),Pair.create(view2, <span class="string">"name2"</span>));      </span><br><span class="line">startActivity(intent,.toBundle());</span><br></pre></td></tr></table></figure></p><p>返回时如果需要具备转场动画，那么也需要用finish函数替代finishAfterTransition来结束一个Activity。</p><p>共享转场动画通常可以根据指定的元素判断出合适的转场动画效果，不需要我们做额外的处理，也可以通过之前学习的方法进行指定共享元素转场动画效果。</p><p>组合转场动画<br>我们可以把多个转场动画进行组合，作出更具个性的转场效果，在资源文件中通过以下方式：<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">transitionSet</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">explode</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">transition</span> <span class="attr">class</span>=<span class="string">"my.app.transition.CustomTransition"</span>/&gt;</span></span><br><span class="line">    &lt;&lt;changeImageTransform/&gt; </span><br><span class="line"><span class="tag">&lt;/<span class="name">transitionSet</span>&gt;</span></span><br></pre></td></tr></table></figure></p><p>代码中我们可以通过TransitionSet类组合多个转场动画：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">TransitionSet transitionSet = <span class="keyword">new</span> TransitionSet();</span><br><span class="line">transitionSet.addTransition(<span class="keyword">new</span> Fade());</span><br><span class="line">transitionSet.addTransition(<span class="keyword">new</span> ChangeBounds());</span><br></pre></td></tr></table></figure></p><p>组合可以同时针对普通转场动画和共享元素转场动画。</p><p>转场动画也可以像普通动画一样设置持续时间，延期执行时间，速率插入器，以及动画的监听等。</p><p>转场动画通常是对整个布局起作用，如果我们想对某个特定的view实施转场动画，可以把该view设置为转场动画的target，这样转场动画将只对特定的view起作用。共享元素的动画的target需要指定为transitionName</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;h4 id=&quot;安卓在5-0以后有一些新的动画：&quot;&gt;&lt;a href=&quot;#安卓在5-0以后有一些新的动画：&quot; class=&quot;headerlink&quot; title=&quot;安卓在5.0以后有一些新的动画：&quot;&gt;&lt;/a&gt;安卓在5.0以后有一些新的动画：&lt;/h4&gt;&lt;ul&gt;
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>Android动画</title>
    <link href="https://zengwei123.github.io/2016/11/25/Android%E5%8A%A8%E7%94%BB/"/>
    <id>https://zengwei123.github.io/2016/11/25/Android动画/</id>
    <published>2016-11-25T09:20:52.000Z</published>
    <updated>2018-08-20T03:10:54.623Z</updated>
    
    <content type="html"><![CDATA[<blockquote><h4 id="安卓中的动画可以分为三种：View动画、帧动画、属性动画，下面我们来一种一种的来介绍。"><a href="#安卓中的动画可以分为三种：View动画、帧动画、属性动画，下面我们来一种一种的来介绍。" class="headerlink" title="安卓中的动画可以分为三种：View动画、帧动画、属性动画，下面我们来一种一种的来介绍。"></a>安卓中的动画可以分为三种：View动画、帧动画、属性动画，下面我们来一种一种的来介绍。</h4></blockquote><h3 id="1-View动画"><a href="#1-View动画" class="headerlink" title="1.View动画"></a>1.View动画</h3><hr><p><br><center><img src="/2016/11/25/Android动画/GIF9.gif"></center><br><br>view动画的对象是View,他有四种动画效果，这四种效果都对应着四个类</p><ul><li><strong>平移-&lt;translate>-TranslateAnimation</strong></li><li><strong>缩放-&lt;scale>-ScaleAnimation</strong></li><li><strong>旋转-&lt;rotate>-RotateAnimation</strong></li><li><strong>透明-&lt;alpha>-AlphaAnimation</strong></li></ul><p>看下面的代码，就知道怎么使用了，set是一个动画集合，他会执行你所有定义了的动画，也就是说下面的这些动画会同时执行，这个文件创建在 /res/anim/xxx.xml<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><br><span class="line"><span class="tag">&lt;<span class="name">set</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:fillAfter</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:duration</span>=<span class="string">"500"</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">        android:fillAfter="true"  //这属性说明的的动画结束后是否停留在结束位置，true为停留，false为不停留</span></span><br><span class="line"><span class="comment">        android:duration="500"    //这个是这组动画执行的事件</span></span><br><span class="line"><span class="comment">    --&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!--平移动画--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">        android:fromXDelta="500"  //X的起始位置</span></span><br><span class="line"><span class="comment">        android:fromYDelta="0"    //Y的其实位置</span></span><br><span class="line"><span class="comment">        android:toXDelta="0"     //X的结束位置</span></span><br><span class="line"><span class="comment">        android:toYDelta="0"     //Y的结束位置</span></span><br><span class="line"><span class="comment">    --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">translate</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:fromXDelta</span>=<span class="string">"500"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:fromYDelta</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:toXDelta</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:toYDelta</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag">        /&gt;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!--缩放动画--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">        android:fromXScale="1.0" //X的缩放起始值</span></span><br><span class="line"><span class="comment">        android:fromYScale="1.0"   //Y的缩放其实值</span></span><br><span class="line"><span class="comment">        android:toXScale="1.5"     //X的缩放结束值</span></span><br><span class="line"><span class="comment">        android:toYScale="1.5"     //Y的缩放结束值</span></span><br><span class="line"><span class="comment">        android:pivotX="100"     //缩放点的X轴</span></span><br><span class="line"><span class="comment">        android:pivotY="50"      //缩放点的Y轴</span></span><br><span class="line"><span class="comment">    --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">scale</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:fromXScale</span>=<span class="string">"1.0"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:fromYScale</span>=<span class="string">"1.0"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:toXScale</span>=<span class="string">"1.5"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:toYScale</span>=<span class="string">"1.5"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:pivotX</span>=<span class="string">"100"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:pivotY</span>=<span class="string">"50"</span></span></span><br><span class="line"><span class="tag">        /&gt;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!--旋转动画--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">        android:fromDegrees="50" //旋转开始的角度</span></span><br><span class="line"><span class="comment">        android:toDegrees="180"     //旋转结束的角度</span></span><br><span class="line"><span class="comment">        android:pivotX="0"        //旋转的转轴X坐标</span></span><br><span class="line"><span class="comment">        android:pivotY="0"        //旋转的转轴Y坐标</span></span><br><span class="line"><span class="comment">    --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">rotate</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:fromDegrees</span>=<span class="string">"50"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:toDegrees</span>=<span class="string">"180"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:pivotX</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:pivotY</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag">        /&gt;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!--透明动画--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">        android:fromAlpha="1" //起始透明</span></span><br><span class="line"><span class="comment">        android:toAlpha="0.2"     //结束透明度</span></span><br><span class="line"><span class="comment">    --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">alpha</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:fromAlpha</span>=<span class="string">"1"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:toAlpha</span>=<span class="string">"0.2"</span></span></span><br><span class="line"><span class="tag">        /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">set</span>&gt;</span></span><br></pre></td></tr></table></figure></p><blockquote><p>那么如何使用这个动画呢？看下面</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//获取你的动画</span><br><span class="line">Animation animation= AnimationUtils.loadAnimation(getApplicationContext(),R.anim.my);</span><br><span class="line">//使用你的动画</span><br><span class="line">button.startAnimation(animation);</span><br></pre></td></tr></table></figure><p>不仅仅只能用xml的形式来使用动画，还可以用代码的方式，嗯，代码方式难得敲了，百度找吧</p><blockquote><h4 id="1-1-layoutAnimation"><a href="#1-1-layoutAnimation" class="headerlink" title="1.1 layoutAnimation"></a>1.1 layoutAnimation</h4><p>我们有时候会看到一些列表有初始的进入动画，类似与下面这种，他使用的是LayoutAnimation,他的作用是给ViewGroup加上一个动画，这样它的子控件就都有这种效果了，使用这个东西首先你要定义一个layoutAnimation，这个文件创建在 /res/anim/xxx.xml<br><br><center><img src="/2016/11/25/Android动画/GIF11.gif"></center><br></p></blockquote><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><br><span class="line"><span class="tag">&lt;<span class="name">layoutAnimation</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:delay</span>=<span class="string">"10%"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:animationOrder</span>=<span class="string">"normal"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:animation</span>=<span class="string">"@anim/my"</span>    //这个属性是你的动画</span></span><br><span class="line"><span class="tag">    &gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">layoutAnimation</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后在ViewGroup的 android:layoutAnimation=”@anim/layout”  加上你刚刚定义的layoutAnimation，这样子你的ViewGroup就都有出场动画了，但是有一点，在列表中的时候只有看的见的控件才有动画，看不见的是没有的，加载完成后你将它滑动显示，他是没有动画的，所以说你的动画要设计的要与这些没有动画的控件看起来协调。<br><br></p><blockquote><h4 id="1-2-Activity的切换效果"><a href="#1-2-Activity的切换效果" class="headerlink" title="1.2 Activity的切换效果"></a>1.2 Activity的切换效果</h4><p>主要是通过overridePendintTransition(int enterAnim,int exitAnim)这个方法,这个方法使用在<strong>startActivity(intent)</strong>，或者<strong>finish</strong>之后。<br>enterAnim    Activity打开时调用的动画资源<br>exitAnim     Activity被暂停调用的动画资源<br><br></p></blockquote><h3 id="2-帧动画"><a href="#2-帧动画" class="headerlink" title="2.帧动画"></a>2.帧动画</h3><hr><p><br><center><img src="/2016/11/25/Android动画/GIF10.gif"></center><br><br>帧动画怎么说呢，就是一组图片，然后循环播放，它使用发放比较简单，但是比较容易引起内存泄露，所以使用帧动画应该避免过多的使用尺寸较大的图片<br><br><center><img src="/2016/11/25/Android动画/1.png"></center><br><br>xml文件的代码,duration代表的是每张图片的时间<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><br><span class="line"><span class="tag">&lt;<span class="name">animation-list</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span> <span class="attr">android:oneshot</span>=<span class="string">"false"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_01"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_02"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_03"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_04"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_05"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_06"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_07"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_08"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_09"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_10"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_11"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span> <span class="attr">android:drawable</span>=<span class="string">"@drawable/ic_loading_white_12"</span> <span class="attr">android:duration</span>=<span class="string">"100"</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">animation-list</span>&gt;</span></span><br></pre></td></tr></table></figure></p><p>然后使用它,这里是用AnimationDrawable<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">button.setBackgroundResource(R.drawable.zhen);</span><br><span class="line">AnimationDrawable animationDrawable= (AnimationDrawable) button.getBackground();</span><br><span class="line">animationDrawable.start();</span><br></pre></td></tr></table></figure></p><p><br></p><h3 id="3-属性动画"><a href="#3-属性动画" class="headerlink" title="3.属性动画"></a>3.属性动画</h3><hr><blockquote><h4 id="3-1-ObjectAnimator"><a href="#3-1-ObjectAnimator" class="headerlink" title="3.1 ObjectAnimator"></a>3.1 ObjectAnimator</h4></blockquote><p>对于View动画我们只能够对其进行平移、旋转、透明，缩放进行操作，并且View动画进行改变之后，他是没有改变View的属性的，比如，你使用平移将控件平移100,但是你去出发他的点击事件，你会发现触发不了，点击原来的位置才能够出发，这就是View动画的局限性了，所以出来了属性动画，属性动画额能够对对象的属性进行操作，所以属性动画基本上是无所能的。</p><blockquote><p>ObjiecAnimator的使用有一点很重要，就是在设置他的属性的时候必须要有set方法。因为有Set方法我们才能够对它进行属性的改变。</p></blockquote><h5 id="使用方法，"><a href="#使用方法，" class="headerlink" title="使用方法，"></a>使用方法，</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(button,<span class="string">"translationX"</span>, <span class="number">0f</span>,<span class="number">1000f</span>);</span><br><span class="line">objectAnimator.setDuration(<span class="number">2000</span>);</span><br><span class="line">objectAnimator.start();</span><br></pre></td></tr></table></figure><p>看到上面的代码是不是很简单呢，是的属性动画的使用方法非常简单，但是还是有一些其他的方法，来让我们更好的使用属性动画<br> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">objectAnimator.setEvaluator(<span class="keyword">new</span> ArgbEvaluator());    <span class="comment">//设置一个估值器，常用的有ArgbEvaluator\IntEvaluator\FloatEvaluator</span></span><br><span class="line">objectAnimator.setRepeatCount(-<span class="number">1</span>);           <span class="comment">//动画的重复次数 -1代表无限重复</span></span><br><span class="line">objectAnimator.setRepeatMode(ObjectAnimator.REVERSE);    <span class="comment">//重复模式 REVERSE逆向重复  REPEAT 连续重复</span></span><br><span class="line">objectAnimator.setDuration(<span class="number">2000</span>);             <span class="comment">//动画持续时间</span></span><br><span class="line">objectAnimator.setStartOffset(<span class="number">2000</span>);      <span class="comment">//延迟时间</span></span><br></pre></td></tr></table></figure></p><p>下面列举一些常用的属性动画<br> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">ObjectAnimator.ofInt(button,<span class="string">"backgroundColor"</span>, Color.RED,Color.YELLOW,Color.BLUE);  <span class="comment">//背景颜色的改变</span></span><br><span class="line">ObjectAnimator.ofInt(button,<span class="string">"textColor"</span>, Color.RED,Color.YELLOW,Color.BLUE);  <span class="comment">//字体颜色的改变</span></span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"textSize"</span>, <span class="number">15f</span>,<span class="number">30f</span>);    <span class="comment">//字体大小</span></span><br><span class="line"></span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"translationX"</span>, <span class="number">0f</span>,<span class="number">1000f</span>);   <span class="comment">//X（左右）轴平移</span></span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"translationY"</span>, <span class="number">0f</span>,<span class="number">1000f</span>);<span class="comment">//Y（上下）轴平移</span></span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"translationZ"</span>, <span class="number">0f</span>,<span class="number">1000f</span>);<span class="comment">//Z（高度）轴平移</span></span><br><span class="line"><span class="comment">//这里是旋转这里注意一下他可以设置旋转的轴心，原本旋转是控件的中心，你可以通过下面两个方法来设置轴心</span></span><br><span class="line">button.setPivotX(<span class="number">0</span>);</span><br><span class="line">button.setPivotY(<span class="number">0</span>);</span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"rotationX"</span>, <span class="number">0f</span>,<span class="number">1000f</span>);    <span class="comment">//沿X旋转</span></span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"rotationY"</span>, <span class="number">0f</span>,<span class="number">1000f</span>);<span class="comment">//沿Y旋转</span></span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"rotation"</span>, <span class="number">0f</span>,<span class="number">1000f</span>);    <span class="comment">//平面旋转</span></span><br><span class="line"><span class="comment">//缩放动画</span></span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"scaleY"</span>, <span class="number">1f</span>,<span class="number">2F</span>);      </span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"scaleX"</span>, <span class="number">1f</span>,<span class="number">2F</span>);</span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"textScaleX"</span>, <span class="number">1f</span>,<span class="number">2F</span>);    <span class="comment">//这个是字体的缩放</span></span><br><span class="line"></span><br><span class="line">ObjectAnimator.ofFloat(button,<span class="string">"alpha"</span>, <span class="number">1f</span>,<span class="number">0.2F</span>);       <span class="comment">//透明度</span></span><br></pre></td></tr></table></figure></p><p> <br><center><img src="/2016/11/25/Android动画/GIF1.gif"><img src="/2016/11/25/Android动画/GIF6.gif"></center><br></p><blockquote><h4 id="3-2-ValueAnimator"><a href="#3-2-ValueAnimator" class="headerlink" title="3.2 ValueAnimator"></a>3.2 ValueAnimator</h4></blockquote><p> ValueAnimator动画是ObjeecAnimator的父类，ObjeecAnimator的实现就是基于Value的，但是这两个类有什么区别呢？ObjeecAnimator主要是对属性的过渡操作，而Value则是对值的过渡操作。<br> 下面给一个ValueAnimator的例子，它实现了对Button的text的改变，还有对字体大小，宽度的改变，具体的可以看看注释。<br> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">button.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() &#123;</span><br><span class="line">           <span class="meta">@Override</span></span><br><span class="line">           <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View view)</span> </span>&#123;</span><br><span class="line">               ValueAnimator valueAnimator=ValueAnimator.ofInt(<span class="number">1</span>,<span class="number">100</span>);     <span class="comment">//一个区间</span></span><br><span class="line">               valueAnimator.addUpdateListener(<span class="keyword">new</span> ValueAnimator.AnimatorUpdateListener() &#123;</span><br><span class="line">                   IntEvaluator intEvaluator=<span class="keyword">new</span> IntEvaluator();   <span class="comment">//一个估值器</span></span><br><span class="line">                   <span class="meta">@Override</span></span><br><span class="line">                   <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onAnimationUpdate</span><span class="params">(ValueAnimator valueAnimator)</span> </span>&#123;</span><br><span class="line">                       <span class="comment">//动画过程的监听方法</span></span><br><span class="line">                       <span class="keyword">int</span> i= (<span class="keyword">int</span>) valueAnimator.getAnimatedValue();   <span class="comment">//获取动画当前的值</span></span><br><span class="line">                       <span class="keyword">float</span> f=valueAnimator.getAnimatedFraction();   <span class="comment">//获取当前整个动画所占比例</span></span><br><span class="line">                       button.getLayoutParams().width=intEvaluator.evaluate(f,<span class="number">0</span>,<span class="number">600</span>);    <span class="comment">//按照当前比例计算出所占的值   f-比例   0-初始值  600-结束值</span></span><br><span class="line">                       button.setTextSize(i);   <span class="comment">//设置字体大小</span></span><br><span class="line">                       button.setText(i+<span class="string">""</span>);    <span class="comment">//设置值</span></span><br><span class="line">                       button.requestLayout();   <span class="comment">//当view确定自身已经不再适合现有的区域时，该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。</span></span><br><span class="line">                   &#125;</span><br><span class="line">               &#125;);</span><br><span class="line">               valueAnimator.setDuration(<span class="number">3000</span>).start();   <span class="comment">//设置过渡时间  启动</span></span><br><span class="line">           &#125;</span><br><span class="line">       &#125;);</span><br></pre></td></tr></table></figure></p><p>ValueAnimator不仅仅可以作用在改变控件上面，更多的是去改变对象的值。<br> <br><center><img src="/2016/11/25/Android动画/GIF2.gif"></center><br></p><blockquote><h4 id="3-3-AnimatorSet-这是一个动画的集合，能够同时做出集中不同的动画-看下面的例子"><a href="#3-3-AnimatorSet-这是一个动画的集合，能够同时做出集中不同的动画-看下面的例子" class="headerlink" title="3.3 AnimatorSet  这是一个动画的集合，能够同时做出集中不同的动画,看下面的例子"></a>3.3 AnimatorSet  这是一个动画的集合，能够同时做出集中不同的动画,看下面的例子</h4><p> <br><center><img src="/2016/11/25/Android动画/GIF3.gif"></center><br><br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">play(Animator anim)：添加一个动画，并返回AnimatorSet.Builder </span><br><span class="line">playSequentially(List items)：添加一组动画，播放顺序为一一播放 </span><br><span class="line">playSequentially(Animator… items)：添加一组动画，播放顺序为一一播放 </span><br><span class="line">playTogether(Collection items)：添加一组动画，播放顺序为一起播放 </span><br><span class="line">playTogether(Animator… items)：添加一组动画，播放顺序为一起播放</span><br></pre></td></tr></table></figure></p></blockquote><p>很有意思。。</p><p> 最后看看需要注意的问题：<br>  <br><center><img src="/2016/11/25/Android动画/4.png"></center><br></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;h4 id=&quot;安卓中的动画可以分为三种：View动画、帧动画、属性动画，下面我们来一种一种的来介绍。&quot;&gt;&lt;a href=&quot;#安卓中的动画可以分为三种：View动画、帧动画、属性动画，下面我们来一种一种的来介绍。&quot; class=&quot;headerlink&quot; 
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>github制作远程依赖库</title>
    <link href="https://zengwei123.github.io/2016/11/17/github%E5%88%B6%E4%BD%9C%E8%BF%9C%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%BA%93/"/>
    <id>https://zengwei123.github.io/2016/11/17/github制作远程依赖库/</id>
    <published>2016-11-17T09:58:13.000Z</published>
    <updated>2018-08-18T09:27:10.275Z</updated>
    
    <content type="html"><![CDATA[<blockquote><h4 id="今天写了一个控件，然后把它弄成了一个开源库，然后记录一下制作成开源库的方法"><a href="#今天写了一个控件，然后把它弄成了一个开源库，然后记录一下制作成开源库的方法" class="headerlink" title="今天写了一个控件，然后把它弄成了一个开源库，然后记录一下制作成开源库的方法"></a>今天写了一个控件，然后把它弄成了一个开源库，然后记录一下制作成开源库的方法</h4><p>首先先创建一个库工程，注意这个库工程是建立在项目里面的<br><br><center><img src="/2016/11/17/github制作远程依赖库/1.png"></center><br><br>然后配置<br><br><center><img src="/2016/11/17/github制作远程依赖库/2.png"></center><br><br>这里将zengwei123改成你的github用户名<br>apply plugin: ‘com.github.dcendents.android-maven’<br>group=’com.github.zengwei123’<br><br><center><img src="/2016/11/17/github制作远程依赖库/3.png"></center><br><br>classpath ‘com.github.dcendents:android-maven-gradle-plugin:2.1’<br><br><center><img src="/2016/11/17/github制作远程依赖库/4.png"></center><br><br>然后将你的项目上传github,上传之后点击<br><br><center><img src="/2016/11/17/github制作远程依赖库/5.png"></center><br><br>然后<br><br><center><img src="/2016/11/17/github制作远程依赖库/6.png"></center><br><br>输入信息<br><br><center><img src="/2016/11/17/github制作远程依赖库/7.png"></center><br><br>然后发布 ；<br>发布之后，打开网址 <a href="https://jitpack.io/" target="_blank" rel="noopener">https://jitpack.io/</a><br>在下面的输入框中输入你的仓库的url：如<a href="https://github.com/zengwei123/Curve" target="_blank" rel="noopener">https://github.com/zengwei123/Curve</a><br>如果你配置错了，那么就不是绿色的Get it。<br><br><center><img src="/2016/11/17/github制作远程依赖库/8.png"></center><br><br>滑到下面，会有一个这个<br><br><center><img src="/2016/11/17/github制作远程依赖库/9.png"></center><br><br>如果你一直是这一个样子的，那么就说明没有配置成功，他应该是：com.github.你的用户名:项目名:版本号，最后成功了，就可以在其他项目使用依赖的方式使用你的项目了</p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;h4 id=&quot;今天写了一个控件，然后把它弄成了一个开源库，然后记录一下制作成开源库的方法&quot;&gt;&lt;a href=&quot;#今天写了一个控件，然后把它弄成了一个开源库，然后记录一下制作成开源库的方法&quot; class=&quot;headerlink&quot; title=&quot;今天写了一
      
    
    </summary>
    
      <category term="GitHub-Git" scheme="https://zengwei123.github.io/categories/GitHub-Git/"/>
    
    
  </entry>
  
  <entry>
    <title>Android-事件分发机制</title>
    <link href="https://zengwei123.github.io/2016/11/05/Android-%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E6%9C%BA%E5%88%B6/"/>
    <id>https://zengwei123.github.io/2016/11/05/Android-事件分发机制/</id>
    <published>2016-11-05T02:28:00.000Z</published>
    <updated>2018-08-14T07:47:55.037Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>事件分发主要分为2部分，View分发与ViewGroup，在了解事件分发的之前首先了解一下View与ViewGroup,View是没有子控件的，如Button,TextView等，但是ViewGroup是有子控件的，如ViewPager,RelativeLayout。</p></blockquote><p>首先看看View的事件分发，主要是两个方法dispatchTouchEvent和OnTouchEvent，从流程是从Activity-View，Activity的dispatchTouchEvent是事件分发的第一入口。<br><br><br>我们继承一个Button重写他的dispatchTouchEvent和OnTouchEvent<br><br><center><img src="/2016/11/05/Android-事件分发机制/2.png"></center><br><br>调用button的setOnTouchListener和setOnClickListener<br><br><center><img src="/2016/11/05/Android-事件分发机制/3.png"></center><br><br>重写activity的dispatchTouchEvent和OnTouchEvent<br><br><center><img src="/2016/11/05/Android-事件分发机制/4.png"></center><br><br>点击button,我们会看到下面这个Log打印顺序<br><br><center><img src="/2016/11/05/Android-事件分发机制/1.png"></center><br></p><blockquote><p>在这里你可能会奇怪为什么Activity的OnTouchEvent为什么没有调用，这是因为我们的Button在OnTouchEvent中已经处理了事件，最后执行的click，当我们将Button的OnTouchEvent返回值改为false,我们会看到下面的这中情况。<br>这时候Activity的OnTouchEvent就被调用了，因为我们在button的OnTouchEvent不处理事件，这样最后没人处理我们只能将事件返回给Activity，这样Activity的OnTouchEvent就会被调用</p></blockquote><p><br><center><img src="/2016/11/05/Android-事件分发机制/5.png"></center><br><br>这里我们看到最后没有执行click事件，并且UP也没有执行了，这是因为button在Down后没有处理事件，最后到了activity那里处理<br><br><center><img src="/2016/11/05/Android-事件分发机制/6.png"></center><br><br>如果我们在up的时候不处理，返回一个false<br><br><center><img src="/2016/11/05/Android-事件分发机制/7.png"></center><br><br>这样我们的Down和Up都执行但是最后的click没有执行，因为button没有处理事件，所以事件最后就到了Activity哪里，执行了OnTouchEvent<br><br><center><img src="/2016/11/05/Android-事件分发机制/8.png"></center><br><br>最后看书：<br><br><center><img src="/2016/11/05/Android-事件分发机制/9.png"></center><br><br><br><center><img src="/2016/11/05/Android-事件分发机制/10.png"></center><br><br><br><center><img src="/2016/11/05/Android-事件分发机制/11.png"></center><br></p><blockquote><p>下面来说说ViewGroup的分发事件，其实原理跟View差不多，只不过它多了一个onInterceptTouchEvent这个方法是用来控制事件是给自己消费还是分发给子控件。</p></blockquote><p><br><br>1.默认的onInterceptTouchEvent总是返回false的，就是不拦截touch事件，直接分发给了子控件。所以假如我们自定义了组合控件，譬如image+文字的组合控件，并且在activity里面注册监听期待点击它的时候会产生响应，那么我们就需要重写onInterceptTouchEvent了让它返回true，将事件拦截下来。</p><p>2.如果触摸的时候，我们只想出发ontouch监听，想屏蔽onclick监听的话，就需要在ontouch里面返回true就可以了</p><p>3.android事件分发是先传递到viewgroup，然后才传递到view的</p><p>4.子view如果将传递的事件消费处理掉，viewgroup当中是接收不到任何事件的</p><p>5.简单来讲，dispatchTouchEvent方法是为了onTouch监听的，onTouchEvent是为了onClick监听的。如果ontouch监听返回false，事件会传递到onTouchEvent当中触发onClick，如果是true的话就不会继续往下传递了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;事件分发主要分为2部分，View分发与ViewGroup，在了解事件分发的之前首先了解一下View与ViewGroup,View是没有子控件的，如Button,TextView等，但是ViewGroup是有子控件的，如ViewPager,Relat
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
  <entry>
    <title>Android常用控件-ViewPage</title>
    <link href="https://zengwei123.github.io/2016/10/29/Android%E5%B8%B8%E7%94%A8%E6%8E%A7%E4%BB%B6-ViewPage/"/>
    <id>https://zengwei123.github.io/2016/10/29/Android常用控件-ViewPage/</id>
    <published>2016-10-29T10:07:03.000Z</published>
    <updated>2018-08-13T11:52:00.909Z</updated>
    
    <content type="html"><![CDATA[<p>ViewPage是我们非常常用的控件，他的功能就是多视图的切换</p><blockquote><p>ViewPage<br>    <strong>·</strong> ViewPage他继承了ViewGroup,所以他是一个容器类，可以在其中添加其他的View。<br>    <strong>·</strong> ViewPage需要一个Adatper来给他提供数据<br>    <strong>·</strong> ViewPage经常与Fragment和TabLayout一起使用</p></blockquote><p>使用ViewPage+TabLayout<br>首先看看布局,这个就是一个最基本的ViewPage+TabLayout的布局了，可能TabLayout需要额外导入<strong>compile ‘com.android.support:design:26.1.0’</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;</span><br><span class="line">&lt;RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;    </span><br><span class="line">android:layout_width=&quot;match_parent&quot;    </span><br><span class="line">android:layout_height=&quot;match_parent&quot;&gt;    </span><br><span class="line">&lt;android.support.design.widget.TabLayout        </span><br><span class="line">android:layout_width=&quot;match_parent&quot;        </span><br><span class="line">android:layout_height=&quot;wrap_content&quot;        </span><br><span class="line">android:id=&quot;@+id/tabLayout&quot;&gt;</span><br><span class="line">&lt;/android.support.design.widget.TabLayout&gt;    </span><br><span class="line">&lt;android.support.v4.view.ViewPager        </span><br><span class="line">android:id=&quot;@+id/viewpager&quot;        </span><br><span class="line">android:layout_width=&quot;match_parent&quot;        </span><br><span class="line">android:layout_height=&quot;match_parent&quot;        </span><br><span class="line">android:layout_below=&quot;@+id/tabLayout&quot;&gt;    </span><br><span class="line">&lt;/android.support.v4.view.ViewPager&gt;</span><br><span class="line">&lt;/RelativeLayout&gt;</span><br></pre></td></tr></table></figure><p>然后看看Fragment的代码，很简单的<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyFragment</span> <span class="keyword">extends</span> <span class="title">Fragment</span> </span>&#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> View <span class="title">onCreateView</span><span class="params">(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)</span> </span>&#123;</span><br><span class="line">        View view=inflater.inflate(R.layout.activity_main,<span class="keyword">null</span>);</span><br><span class="line">        <span class="keyword">return</span> view;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>然后编写ViewPage的适配器，注意重写<strong>getPageTitle(int position)</strong>这个方法是用来设置TabLayout的title的，因为TabLayout是跟ViewPager绑定起来的<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">myViewPageAdatper</span> <span class="keyword">extends</span> <span class="title">FragmentPagerAdapter</span> </span>&#123;    </span><br><span class="line"><span class="keyword">private</span> List&lt;MyFragment&gt; myFragments;    </span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">myViewPageAdatper</span><span class="params">(FragmentManager fm, List&lt;MyFragment&gt; fragments)</span> </span>&#123;        </span><br><span class="line"><span class="keyword">super</span>(fm);        </span><br><span class="line"><span class="keyword">this</span>.myFragments=fragments;    </span><br><span class="line">&#125;    </span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span>    </span><br><span class="line"><span class="function"><span class="keyword">public</span> Fragment <span class="title">getItem</span><span class="params">(<span class="keyword">int</span> position)</span> </span>&#123;        </span><br><span class="line"><span class="keyword">return</span> myFragments.get(position);    </span><br><span class="line">&#125;   </span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span>    </span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getCount</span><span class="params">()</span> </span>&#123;        </span><br><span class="line"><span class="keyword">return</span> myFragments.size();    </span><br><span class="line">&#125;    </span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span>    </span><br><span class="line"><span class="function"><span class="keyword">public</span> CharSequence <span class="title">getPageTitle</span><span class="params">(<span class="keyword">int</span> position)</span> </span>&#123;        </span><br><span class="line"><span class="keyword">return</span> <span class="string">"标题："</span>+position;    </span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>下面是ViewPage的设置<br><br><center><img src="/2016/10/29/Android常用控件-ViewPage/1.png"></center><br><br>最后的效果<br><br><center><img src="/2016/10/29/Android常用控件-ViewPage/GIF.gif"></center><br><br>对于ViewPage我们的程序有各种各样的需求，有时候我们需要他不能够滑动<br>这是我们可以设置setOnTouchListener()返回值为true，根据事件分发机制，在onTouch中的DOWN事件时候，将事件拦截。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">viewpager.setOnTouchListener(<span class="keyword">new</span> View.OnTouchListener() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onTouch</span><span class="params">(View view, MotionEvent motionEvent)</span> </span>&#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br></pre></td></tr></table></figure></p><p>这样子是可以实现，但是如果ViewPager的Fragment里面有可以滑动的控件，比如又一个ViewPager,这样我们上面的那种办法就没有用了viewPager还是可以被拖出来，对于这种情况我们只有继承ViewPager来重新分发它的事件，禁止它的滑动<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ZwViewPage</span> <span class="keyword">extends</span> <span class="title">ViewPager</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">boolean</span> isScroll;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">ZwViewPage</span><span class="params">(Context context)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">super</span>(context);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">ZwViewPage</span><span class="params">(Context context, AttributeSet attrs)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">super</span>(context, attrs);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 1.dispatchTouchEvent一般情况不做处理</span></span><br><span class="line"><span class="comment">     *,如果修改了默认的返回值,子孩子都无法收到事件</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">dispatchTouchEvent</span><span class="params">(MotionEvent ev)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">super</span>.dispatchTouchEvent(ev);   <span class="comment">// return true;不行</span></span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 是否拦截</span></span><br><span class="line"><span class="comment">     * 拦截:会走到自己的onTouchEvent方法里面来</span></span><br><span class="line"><span class="comment">     * 不拦截:事件传递给子孩子</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onInterceptTouchEvent</span><span class="params">(MotionEvent ev)</span> </span>&#123;</span><br><span class="line">        <span class="comment">// return false;//可行,不拦截事件,</span></span><br><span class="line">        <span class="comment">// return true;//不行,孩子无法处理事件</span></span><br><span class="line">        <span class="comment">//return super.onInterceptTouchEvent(ev);//不行,会有细微移动</span></span><br><span class="line">        <span class="keyword">if</span> (isScroll)&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">super</span>.onInterceptTouchEvent(ev);</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 是否消费事件</span></span><br><span class="line"><span class="comment">     * 消费:事件就结束</span></span><br><span class="line"><span class="comment">     * 不消费:往父控件传</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onTouchEvent</span><span class="params">(MotionEvent ev)</span> </span>&#123;</span><br><span class="line">        <span class="comment">//return false;// 可行,不消费,传给父控件</span></span><br><span class="line">        <span class="comment">//return true;// 可行,消费,拦截事件</span></span><br><span class="line">        <span class="comment">//super.onTouchEvent(ev); //不行,</span></span><br><span class="line">        <span class="comment">//虽然onInterceptTouchEvent中拦截了,</span></span><br><span class="line">        <span class="comment">//但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法.</span></span><br><span class="line">        <span class="keyword">if</span> (isScroll)&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">super</span>.onTouchEvent(ev);</span><br><span class="line">        &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">true</span>;<span class="comment">// 可行,消费,拦截事件</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setScroll</span><span class="params">(<span class="keyword">boolean</span> scroll)</span> </span>&#123;</span><br><span class="line">        isScroll = scroll;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>这样子我们就实现了禁止ViewPager的滑动，下面我们来说说ViewPager的预加载。<br>ViewPager会默认加载当前页和当前页的左右两页。<br>一开始当前页是下标0，所以一开始默认加载第0页（指下标，下同）和第1页。<br>当你向右滑动，当前页为第1页时，ViewPager会加载第2页，这时一共有3页存在（第0,1,2页）。<br>再向右滑动，当前页为第2页时，会移除第0页，加载第3页，同理向左滑动当前页为第1页时，会移除第3页。<br>我们可以设置下面的这个方法来预加载多个页面。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">viewpager.setOffscreenPageLimit(<span class="keyword">int</span> i);</span><br></pre></td></tr></table></figure></p><p>但是如果我们不想要他预加呢？当每个fragment都需要去联网加载网络数据或者做一些耗时的操作，而且有其他的fragment并不是必须的，用户不一定会打开。<br>这样的话如果还预加载的话将会浪费资源，用户体验也不好。<br>虽然可以通过setOffscreenPageLimit(0)来设置不提前预加载，但这样的设置没有效果。通过研究ViewPager的源码，可以设置该类默认的DEFAULT_OFFSCREEN_PAGES = 0，来预防预加载。<br>还有一直办法就是判断fragment的位置是否为当前显示ViewPager，如果是就加载，不是的话就不给加载<br><br><br>设置ViewPager默认显示的页面,通过这个方法就可以通过代码设置页面的切换了<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ViewPager.setCurrentItem(2)</span><br></pre></td></tr></table></figure></p><p>如果想要下面这种效果<br><br><center><img src="/2016/10/29/Android常用控件-ViewPage/GIF1.gif"></center><br><br>在布局文件中色湖之<strong>ClipToPadding=“false”</strong>然后设置padding,就可以实现了</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;ViewPage是我们非常常用的控件，他的功能就是多视图的切换&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ViewPage&lt;br&gt;    &lt;strong&gt;·&lt;/strong&gt; ViewPage他继承了ViewGroup,所以他是一个容器类，可以在其中添加其他的View。&lt;br
      
    
    </summary>
    
      <category term="Android" scheme="https://zengwei123.github.io/categories/Android/"/>
    
    
  </entry>
  
</feed>
