Android應用性能優化系列視圖篇——惱人的分割線留白解決之道


        <div class="markdown_views"><p>相信很多一線的開發者都遇到過分割線,作爲視覺設計中的最常用的元素之一,雖然簡單易畫,但在佈局排版中往往卻起影響視圖層級結構的重要作用。往往由於一道小小的分割線,不僅在layout中多個數個視圖,而且容易導致佈局層級的加深,甚至還需要在Java代碼中做邏輯控制。</p>


<p>雖然<a href="http://lib.csdn.net/base/15" class="replace_word" title="undefined" target="_blank" style="color:#df3434; font-weight:bold;">Android</a>官方提供的佈局中,比如ListView、LinearLayout等對分割線都有了相應的實現,但是在處理分割線留白這種設計時常常有心無力。而在越來越多的APP中,分割線留白已經成爲了一種設計趨勢,所以,如何簡單高效地實現分割線成爲了一個值得研究的命題。</p>


<hr>


<p><font size="5"><strong>1、ListView的分割線</strong></font></p>


<p>首先,ListView是自帶分割線屬性的(而GridView並沒有,不知道android官方咋想的),一共有四個相關的屬性,<strong>divider</strong>、<strong>dividerHeight</strong>、<strong>headerDividersEnabled</strong>、<strong>footerDividersEnabled</strong>。支持定義分割線的顏色和高度等,非常實用的屬性,但在實際開發中設計師卻不喜歡按照常理出牌。</p>


<p>比如下面這些列表類型的設計圖,設計師最喜歡這種左側留白右側通欄或者兩側留白的設計方式。</p>


<p><img src="https://img-blog.csdn.net/20160812222017905" alt="這裏寫圖片描述" title="">   <img src="https://img-blog.csdn.net/20160812222035936" alt="這裏寫圖片描述" title=""></p>


<p>而官方的分割線則是左右通欄,開發者遇到這種問題,大概是有三種常規的解決方案。</p>


<hr>


<p><strong>方案1:ListView設置左右margin或者padding</strong></p>


<p>這種方式雖然能夠達到分割線留白的效果,但是有一定的侷限性,分割線左側並不總是被設計成和內容對齊。同時,缺陷很明顯,給ListView設置了左右margin或者padding,會導致Item點擊的按壓背景也被留白(效果如下圖)。當然,如果不在意這些細節,那也無可厚非。</p>


<p><img src="https://img-blog.csdn.net/20160812230144582" alt="這裏寫圖片描述" title=""></p>


<p><strong>缺陷: 按壓效果有瑕疵,另外如果分割線不與內容上下對齊,這種方式無效</strong></p>


<hr>


<p><strong>方案2:給每個Item設置帶有分割線留白的背景圖</strong></p>


<p>這是較爲常用的方案之一,分割線正常顯示,按壓效果正常顯示。看似很完美,但是不得不面對一個較大的問題,由於最後一個Item不顯示分割線,所以需要在Java代碼中控制,比如這樣:</p>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering">  <span class="hljs-annotation">@Override</span>
  <span class="hljs-keyword">public</span> View <span class="hljs-title">getView</span>(<span class="hljs-keyword">int</span> position, View convertView, ViewGroup parent) {
      ....


      <span class="hljs-keyword">if</span> (position == getCount() - <span class="hljs-number">1</span>) {
          convertView.setBackground(<span class="hljs-keyword">null</span>);
      } <span class="hljs-keyword">else</span> {
          convertView.setBackgroundResource(R.drawable.bg_line);
      }
      <span class="hljs-keyword">return</span> convertView;
  }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul></pre>


<p>在Java代碼中控制視圖樣式,無論如何都是一個相當不合理的選擇。</p>


<p>其次,這種方式不支持footer和header的分割線,footerDividersEnabled和headerDividersEnabled兩個屬性就無法使用了。</p>


<p>接着,既然使用帶有分割線的圖片做背景,那麼,如果頁面設計修改,參數調整,就需要重新切圖,所以維護起來相當喫力。</p>


<p>最後,爲了一條分割線而給整個Item視圖設置背景,基本可以認爲是出現了過度繪製的情況。</p>


<p><strong>缺陷:代碼控制視圖、footerDividersEnabled和headerDividersEnabled無用、留白距離難以維護,過度繪製</strong></p>


<hr>


<p><strong>方案3:在Item中添加一個View設置高度背景作爲分割線</strong></p>






<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">View
</span>     <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
     <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"0.5dip"</span>
     <span class="hljs-attribute">android:layout_marginLeft</span>=<span class="hljs-value">"15dip"</span>
     <span class="hljs-attribute">android:background</span>=<span class="hljs-value">"#99cccccc"</span>/&gt;</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul></pre>


<p>這是最最最常用卻最最最不合理的一個方案,然而很多人卻意識不到不合理。以上面圖爲例,Item中只有一個TextView,所以正常情況下layout中只有TextView一個視圖,但是如果以這種方式,必須在外層套上LinearLayout佈局,這樣一來,視圖層次加深,視圖冗餘。假設一個列表顯示10項,冗餘出來的佈局數就是20(分割線10+父佈局10)。</p>


<p>另外,仍然避免不了在Java中控制最後一項顯示與否,比如這樣:</p>






<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">View line = convertView<span class="hljs-preprocessor">.findViewById</span>(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.item</span>_line)<span class="hljs-comment">;</span>
if (position == getCount() - <span class="hljs-number">1</span>) {
    line<span class="hljs-preprocessor">.setVisibility</span>(View<span class="hljs-preprocessor">.INVISIBLE</span>)<span class="hljs-comment">;</span>
} else {
    line<span class="hljs-preprocessor">.setVisibility</span>(View<span class="hljs-preprocessor">.VISIBLE</span>)<span class="hljs-comment">;</span>
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul></pre>


<p>footerDividersEnabled和headerDividersEnabled兩個屬性同樣也無法使用。</p>


<p><strong>缺陷:佈局大量冗餘、代碼控制視圖、footerDividersEnabled和headerDividersEnabled無用</strong></p>


<hr>


<p><font color="red"><strong>方案4:重新定義分割線Drawable的Bounds</strong></font></p>


<p>首先,需要清楚一個事實:出現以上情況的矛盾點,是官方ListView的分割線屬性不支持左右留白。所以最佳的解決方案,就是使得官方的分割線支持這種功能,這樣既利於擴展,也利於提高性能。</p>


<p>先來簡單看一下,ListView的源碼是如何實現分割線的功能的。</p>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering">    <span class="hljs-keyword">void</span> drawDivider(Canvas canvas, Rect bounds, <span class="hljs-keyword">int</span> childIndex) {
        <span class="hljs-comment">// This widget draws the same divider for all children</span>
        <span class="hljs-keyword">final</span> Drawable divider = mDivider;


        divider.setBounds(bounds);
        divider.draw(canvas);
    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul></pre>


<p>在onDraw方法中,最終會調用到drawDivider方法。由於分割線是一個Drawable對象,上下左右的位置都是由Rect對象控制的,這個對象通過setBounds方法設置。</p>


<p>這個Rect對象的top和bottom屬性我們是不需要關心的,只需要看left和right兩個屬性,默認情況下left=paddingLeft,right=width-paddingLeft-paddingRight,即表示分割線的起點和終點貫穿ListView的左右兩側。</p>


<p>dispatchDraw方法中可以驗證這一點:</p>






<pre class="prettyprint" name="code"><code class="hljs r has-numbering"> protected void dispatchDraw(Canvas canvas) {
    <span class="hljs-keyword">...</span>
    <span class="hljs-keyword">if</span> (drawDividers || drawOverscrollHeader || drawOverscrollFooter) {
        final Rect bounds = mTempRect;
        bounds.left = mPaddingLeft;
        bounds.right = mRight - mLeft - mPaddingRight;
        <span class="hljs-keyword">...</span>
        drawDivider(canvas, bounds, i);
    }
    <span class="hljs-keyword">...</span>
 }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul></pre>


<p>如果我們能將bounds的left和right屬性的值進行修改,那麼就能實現控制分割線的左右邊距了。</p>


<p>既然需要擴展ListView,最常用的方法就是繼承重寫了。不幸的是由於drawDivider方法的訪問控制故並不能被複寫,但值得慶幸的是ListView的Divider對象具有setter和getter方法。</p>


<p>具體的實現邏輯非常簡單,核心是<strong>裝飾模式</strong>,我就不去詳細說了。</p>


<p>源碼和範例詳見:<a href="https://github.com/MegatronKing/DividerSample">https://github.com/MegatronKing/DividerSample</a></p>


<p>用法非常簡單,給ListView分割線擴充了兩個屬性:<strong>dividerPaddingLeft</strong>和<strong>dividerPaddingRight</strong>,顧名思義。這兩個屬性值既可以在xml佈局中配置也可以在代碼中設置。</p>


<p>layout示例如下:</p>






<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">&lt;<span class="hljs-keyword">com</span><span class="hljs-preprocessor">.megatronking</span><span class="hljs-preprocessor">.divider</span><span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.DividerListView</span>    
    xmlns:android=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
    xmlns:divider=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>
    android:id=<span class="hljs-string">"@+id/list"</span>
    android:layout_width=<span class="hljs-string">"match_parent"</span>
    android:layout_height=<span class="hljs-string">"wrap_content"</span>
    android:divider=<span class="hljs-string">"#99cccccc"</span>
    android:dividerHeight=<span class="hljs-string">"0.5dip"</span>
    divider:dividerPaddingLeft=<span class="hljs-string">"15dip"</span>
    divider:dividerPaddingRight=<span class="hljs-string">"15dip"</span> /&gt;</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul></pre>


<hr>


<p><font color="red"><strong>方案5:使用inset標籤定義drawable</strong></font></p>


<p>在Drawable家族中有一個特殊的存在:<strong>InsetDrawable</strong>,可以定義上下左右四個邊界的留白,InsetDrawable同樣使用了裝飾模式,和方案4的機制有異曲同工之妙。當被裝飾Drawable的Bound值變化時,重新定義Bound。另外,最強大的是可以直接使用xml定義。</p>


<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">inset</span> <span class="hljs-attribute">xmlns:android</span>=<span class="hljs-value">"http://schemas.android.com/apk/res/android"</span>
    <span class="hljs-attribute">android:insetLeft</span>=<span class="hljs-value">"15dip"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">shape</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">size</span> <span class="hljs-attribute">android:height</span>=<span class="hljs-value">"0.5dip"</span> /&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">solid</span> <span class="hljs-attribute">android:color</span>=<span class="hljs-value">"#99cccccc"</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">shape</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">inset</span>&gt;</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul></pre>


<p>通過insetLeft、insetRight、insetTop、insetRight四個屬性可以定義不同方向的留白大小,另外還支持通過android:drawable熟悉引用另外一個Drawable即被裝飾的Drawable。</p>


<hr>


<p><font size="5"><strong>2、LinearLayout的分割線</strong></font></p>


<p>LinearLayout從Android 3.0版本開始,便添加了分割線屬性。LinearLayout的分割線功能比ListView要強大一些,無論是橫向線性佈局還是縱向線性佈局,都能夠很好的支持。爲了兼容3.0以下版本,v7包中提供一個LinearLayoutCompat佈局,用法類似。</p>


<p>然而,知道這些屬性的開發者並不多,很多時候還是使用着一條線一個View的方式。這種方式無疑使用繁瑣,佈局冗餘。</p>


<p>現在先來簡單介紹下LinearLayout的分割線功能。</p>


<p>LinearLayout的提供了三個分割線相關屬性:</p>


<p><strong>1、divider</strong> 必須引用一個drawable,無法使用或引用color。drawable一般是定義成shape,通過size指定寬度或高度,solid指定顏色。另外,由於LinearLayout分爲橫向佈局和縱向佈局,所以一般會定義兩種分割線。</p>


<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">shape</span> <span class="hljs-attribute">xmlns:android</span>=<span class="hljs-value">"http://schemas.android.com/apk/res/android"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">size</span> <span class="hljs-attribute">android:height</span>=<span class="hljs-value">"0.5dip"</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">solid</span> <span class="hljs-attribute">android:color</span>=<span class="hljs-value">"#99cccccc"</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">shape</span>&gt;</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul></pre>






<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">shape</span> <span class="hljs-attribute">xmlns:android</span>=<span class="hljs-value">"http://schemas.android.com/apk/res/android"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">size</span> <span class="hljs-attribute">android:width</span>=<span class="hljs-value">"0.5dip"</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">solid</span> <span class="hljs-attribute">android:color</span>=<span class="hljs-value">"#99cccccc"</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">shape</span>&gt;</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul></pre>


<p><strong>2、dividerPadding</strong> 控制分割線的留白距離,相比於ListView分割線的通欄,這個屬性非常實用。但是卻有一個缺陷:dividerPadding無法指定左右或上下,橫向佈局中上下都會有留白,縱向佈局中,左右都會有留白。而,設計師往往喜歡左側留白右側通欄,所以這個屬性有時就非常尷尬。</p>


<p><strong>3、showDividers</strong> 這個屬性是控制分割線顯示位置的,一共有四個值:middle 在每一項中間添加分割線;end 在整體的最後一項添加分割線;beginning 在整體的最上方添加分割線;none 無;如果不設置這個屬性的值,默認就是none,即不顯示分割線。</p>


<p>雖然LinearLayout的分割線功能非常強大,但是遇到一側留白的情況,還是無能爲力。開發者還是要回到使用View作爲分割線的老路上來,比如QQ瀏覽器的這種佈局:</p>


<p><img src="https://img-blog.csdn.net/20160813132755367" alt="這裏寫圖片描述" title=""></p>


<p>分割線左側留白與文字對齊,右側通欄,dividerPadding這個屬性實在無能爲力!</p>


<p>在分析解決方案之前,來簡單看一下分割線的實現原理吧!</p>






<pre class="prettyprint" name="code"><code class="hljs scss has-numbering">    void <span class="hljs-function">drawHorizontalDivider(Canvas canvas, int top)</span> {
        mDivider<span class="hljs-class">.setBounds</span>(<span class="hljs-function">getPaddingLeft()</span> + mDividerPadding, <span class="hljs-attribute">top</span>,
                <span class="hljs-function">getWidth()</span> - <span class="hljs-function">getPaddingRight()</span> - mDividerPadding, <span class="hljs-attribute">top</span> + mDividerHeight);
        mDivider<span class="hljs-class">.draw</span>(<span class="hljs-tag">canvas</span>);
    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul></pre>






<pre class="prettyprint" name="code"><code class="hljs scss has-numbering">    void <span class="hljs-function">drawVerticalDivider(Canvas canvas, int left)</span> {
        mDivider<span class="hljs-class">.setBounds</span>(<span class="hljs-attribute">left</span>, <span class="hljs-function">getPaddingTop()</span> + mDividerPadding,
                <span class="hljs-attribute">left</span> + mDividerWidth, <span class="hljs-function">getHeight()</span> - <span class="hljs-function">getPaddingBottom()</span> - mDividerPadding);
        mDivider<span class="hljs-class">.draw</span>(<span class="hljs-tag">canvas</span>);
    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul></pre>


<p>一個水平方向的分割線,一個是垂直方向的分割線。同樣是通過setBounds方法確定分割線的位置,而且mDividerPadding屬性會同時作用於左右或上下。</p>


<p>所以,解決方案和前面所講的ListView的應該是完全一樣的:<font color="red"><strong>重新定義分割線Drawable的Bounds</strong></font></p>


<p>源碼不細說了,詳見:<a href="https://github.com/MegatronKing/DividerSample">https://github.com/MegatronKing/DividerSample</a></p>


<p>擴展LinearLayout提供了分割線的額外四個屬性:dividerPaddingLeft,dividerPaddingRight,dividerPaddingTop,dividerPaddingBottom。同樣的,既可以在layout中配置也可以在代碼中動態設置。</p>


<p>當orientation爲vertical時,dividerPaddingLeft和dividerPaddingRight兩個屬性生效;orientation爲horizontal時,dividerPaddingTop和dividerPaddingBottom兩個屬性生效。</p>


<p>layout示例如下:</p>






<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">&lt;<span class="hljs-keyword">com</span><span class="hljs-preprocessor">.megatronking</span><span class="hljs-preprocessor">.divider</span><span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.DividerLinearLayout</span>        
    xmlns:android=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
    xmlns:divider=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>
    android:layout_width=<span class="hljs-string">"match_parent"</span>
    android:layout_height=<span class="hljs-string">"wrap_content"</span>
    android:divider=<span class="hljs-string">"@drawable/line_horizontal"</span>
    android:orientation=<span class="hljs-string">"vertical"</span>
    android:showDividers=<span class="hljs-string">"middle"</span>
    divider:dividerPaddingLeft=<span class="hljs-string">"15dip"</span>/&gt;</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul></pre>


<p>當然,通過InsetDrawable方式同樣可以達到效果,原理其實差不多,不再贅述。</p>


<hr>


<p><font size="5"><strong>3、總結</strong></font></p>


<p>在常規的應用開發中,用好分割線,能夠減少視圖數量,層次結構和代碼邏輯,同時也方便後繼者修改和維護。雖然性能提升有限,但是積少成多,對於追求完美和極致的開發者,希望能夠有所幫助!</p>


<hr>


<p><font color="red">本博客不定期持續更新,歡迎關注和交流:</font></p>


<p><a href="http://blog.csdn.net/megatronkings">http://blog.csdn.net/megatronkings</a></p></div>
        <script type="text/javascript">
            $(function () {
                $('pre.prettyprint code').each(function () {
                    var lines = $(this).text().split('\n').length;
                    var $numbering = $('<ul></ul>').addClass('pre-numbering').hide();
                    $(this).addClass('has-numbering').parent().append($numbering);
                    for (i = 1; i <= lines; i++) {
                        $numbering.append($('<li></li>').text(i));
                    };
                    $numbering.fadeIn(1700);
                });
            });
        </script>
   
</div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章