Android应用性能优化系列视图篇——恼人的分割线留白解决之道

<div id="article_content" class="article_content">
        <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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
Android性能优化是为了提高Android应用程序的运行效率和响应速度,以提升用户体验。有多个方面需要考虑和优化,如布局优化、绘制优化、网络优化、安装包优化、内存优化、卡顿优化、耗电优化、列表和图片优化、数据库优化、启动优化、数据结构优化和稳定性优化等。 在布局优化方面,可以通过减少布局层次、使用ConstraintLayout等来提高布局效率。绘制优化可以通过使用ViewStub延迟加载视图、使用ViewHolder模式优化列表视图等来加快绘制速度。网络优化可以通过合理使用缓存、减少网络请求次数等来提高网络传输效率。安装包优化可以通过混淆代码、删除无用资源等来减小APK大小。 内存优化可以通过及时释放不再使用的资源、避免内存泄漏等措施来减少内存占用。卡顿优化可以通过使用异步加载、优化耗时操作等来提高应用的流畅度。耗电优化可以通过合理管理后台任务、优化网络请求等来降低电量消耗。 列表和图片优化可以通过使用分页加载、缓存图片等方式来提高列表和图片的加载速度和效率。数据库优化可以通过使用合适的索引、批量操作等来提高数据库的查询和写入性能。启动优化可以通过延迟初始化、减少启动时的资源加载等来加快应用的启动速度。数据结构优化可以通过选择合适的数据结构来提高数据的存储和检索效率。稳定性优化则需要通过全面的测试和错误处理来保证应用的稳定性。 综上所述,Android性能优化是一个多方面的工作,需要从各个方面入手,以提高应用程序的性能和用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值