最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ListView實(shí)現(xiàn)頂部和底部?jī)?nèi)容指示器的方法

 更新時(shí)間:2015年09月06日 09:30:20   作者:arthor  
這篇文章主要介紹了ListView實(shí)現(xiàn)頂部和底部?jī)?nèi)容指示器的方法,需要的朋友可以參考下

頂部指示器?
這是什么?
好吧,我承認(rèn)這是我自己想出來(lái)的詞,因?yàn)槲也恢浪惺裁磳W(xué)名,究竟是什么呢?看下這個(gè)圖就知道了。

頂部指示器示例

這是我們的美工MM畫的,偶的神吶,這雖然很漂亮,不過(guò)也讓人頭疼,這個(gè)箭頭應(yīng)該在滾到頂部的時(shí)候消失,滾下來(lái)的時(shí)候(即有條目隱藏的時(shí)候)才顯示,類似的底部指示器也要有這樣的效果。事實(shí)上默認(rèn)的ListView和ScrollView都已經(jīng)有了類似的效果,在頂部或底部還有更多內(nèi)容時(shí),會(huì)有部分漸變虛化的效果,不過(guò)美工已經(jīng)設(shè)計(jì)了這樣的效果,那么我們就來(lái)做吧。
出于省事的目的,本教程中的例子會(huì)基于上一篇教程來(lái)修改,主要是添加1個(gè)繼承自ListView的類,以及修改布局定義文件。
ArrowListView控件的編寫

package net.learningandroid.lib.view;
 
import net.learningandroid.lib.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
 
/**
 * 支持上下箭頭的ListView
 *
 * <a class="referer"  target="_blank">@author</a> Mr. Lu
 */
public class ArrowListView extends ListView {
 
  private final float scale = getContext().getResources().getDisplayMetrics().density;
  private float topArrowPadding;
  private float bottomArrowPadding;
 
  private static float DEFAULT_TOP_PADDING_DP = 2.0f;
  private static float DEFAULT_BOTTOM_PADDING_DP = 2.0f;
 
  public ArrowListView(Context context, AttributeSet attrs) {
    super(context, attrs);
 
    String strTopArrowPadding = attrs.getAttributeValue(null,
        "topArrowPadding");
    String strBottomArrowPadding = attrs.getAttributeValue(null,
        "bottomArrowPadding");
 
    topArrowPadding = convertDisplayUom(strTopArrowPadding,
        DEFAULT_TOP_PADDING_DP);
    bottomArrowPadding = convertDisplayUom(strBottomArrowPadding,
        DEFAULT_BOTTOM_PADDING_DP);
 
    Log.v("ArrowListView", String.valueOf(topArrowPadding));
  }
 
  /**
   * 單位轉(zhuǎn)換
   */
  private float convertDisplayUom(String sour, float defaultValue) {
    try {
      if (sour.toLowerCase().endsWith("px")) {
        return Float.parseFloat(sour.toLowerCase().replace("px", ""));
      } else if (sour.toLowerCase().endsWith("dp")) {
        return Integer.parseInt(sour.toLowerCase().replace("dp",
            ""))
            * scale + 0.5f;
      }
    } catch (Exception e) {
    }
 
    return (defaultValue * scale + 0.5f);
  }
 
  /**
   * onDraw方法,根據(jù)ListView滾動(dòng)位置繪出箭頭.
   */
  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();
 
    // 取得箭頭的圖片,此處是固定圖片,其實(shí)上可以做成配置方式
    Bitmap topPic = ((BitmapDrawable) getResources().getDrawable(
        R.drawable.arrow_up)).getBitmap();
    Bitmap bottomPic = ((BitmapDrawable) getResources().getDrawable(
        R.drawable.arrow_down)).getBitmap();
 
    // 取得ListView的繪制區(qū)域大小
    Rect r = new Rect();
    this.getDrawingRect(r);
 
    // 計(jì)算箭頭的繪制位置
    float top = r.top + topArrowPadding;
    float bottom = r.bottom - bottomArrowPadding - bottomPic.getHeight();
    float left = r.left + (r.right - r.left - topPic.getWidth()) / 2;
 
    // 計(jì)算是否需要繪制
    boolean drawTop = false;
    boolean drawBottom = false;
 
    if (this.getChildCount() > 0) {
      Rect rTop = new Rect();
      this.getChildAt(0).getLocalVisibleRect(rTop);
      Rect rBottom = new Rect();
      View lastChild = this.getChildAt(this.getChildCount() - 1);
      lastChild.getLocalVisibleRect(rBottom);
 
      drawTop = (this.getFirstVisiblePosition() > 0 || this
              .getFirstVisiblePosition() == 0
              && rTop.top > 0);
      drawBottom = (this.getLastVisiblePosition() < this.getAdapter()
              .getCount() - 1 || this.getLastVisiblePosition() == this
              .getAdapter().getCount() - 1
              && rBottom.bottom < lastChild.getHeight());
    }
    // 繪出箭頭
    if (drawTop) {
      canvas.drawBitmap(topPic, left, top, paint);
    }
 
    if (drawBottom) {
      canvas.drawBitmap(bottomPic, left, bottom, paint);
    }
  }
}

就要點(diǎn)解釋一下上面這段代碼:
注意構(gòu)造方法,我們必須繼承public ArrowListView(Context context, AttributeSet attrs),這樣才可以讓這個(gè)類在xml定義文件中使用。
還要注意到,這里用了attrs.getAttributeValue來(lái)讀取XML定義文件中的屬性,其實(shí)有更好的方法,容我下次再講解,這里先偷個(gè)懶。
convertDisplayUom方法是用來(lái)將dp轉(zhuǎn)換成px的,可以看到由于我們用了getAttributeValue的方式,所以需要手動(dòng)將String轉(zhuǎn)成Float,很麻煩。
最后就是onDraw啦,計(jì)算出畫箭頭的位置,畫出來(lái)就行了。
接下來(lái)就是布局文件的編寫了

ArrowListView在XML文件中的使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="fill_parent"
 
  android:orientation="vertical"
  >
  <TextView
    android:text="Arrow List View Sample"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
 
  />
  <net.learningandroid.lib.view.ArrowListView
    android:id="@+id/arrowListView"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:paddingTop="15dp" android:paddingBottom="20dp"
 
    android:layout_margin="10dp"
    android:background="@drawable/float_panel"
    android:layout_weight="1"
    android:cacheColorHint="#FFEDEDED" android:divider="#00EDEDED"
 
    topArrowPadding="5dp" bottomArrowPadding="10dp"
  />
</LinearLayout>

這里需要注意的是自定義控件和其中的屬性的寫法,不再是ListView了,而是你自己編寫的控件類的類名。其它的內(nèi)容就是定義padding,background,以及取消了分隔線的顯示。
用這個(gè)布局文件替代上一篇教程中的布局文件,但Adapter的定義不變,因?yàn)锳rrowListView是繼承自ListView的,所以原先的Adapter的使用是一樣的。

最后我們來(lái)看下效果:

帶內(nèi)容指示器的ListView最終效果圖

如何?只需要小心的調(diào)整ListView的Padding和ArrowPadding的值就可以控制箭頭出現(xiàn)的位置,如果需要控制更多,比如更換圖片,或者當(dāng)頂部無(wú)內(nèi)容時(shí)讓箭頭變暗、有內(nèi)容時(shí)變亮,都可以用同樣的方法。
并且,如果修改了Attribute的讀取方法之后,還可以通過(guò)xml文件來(lái)指定箭頭的圖片。

相關(guān)文章

  • Android編程實(shí)現(xiàn)Listview點(diǎn)擊展開和隱藏的方法

    Android編程實(shí)現(xiàn)Listview點(diǎn)擊展開和隱藏的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)Listview點(diǎn)擊展開和隱藏的方法,涉及Android中Listview的響應(yīng)點(diǎn)擊與樣式變換相關(guān)操作技巧,需要的朋友可以參考下
    2015-12-12
  • Android的VSYNC機(jī)制和UI刷新流程示例詳解

    Android的VSYNC機(jī)制和UI刷新流程示例詳解

    這篇文章主要為大家介紹了Android的VSYNC機(jī)制和UI刷新流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Kotlin Service實(shí)現(xiàn)消息推送通知過(guò)程

    Kotlin Service實(shí)現(xiàn)消息推送通知過(guò)程

    這幾天分析了一下的啟動(dòng)過(guò)程,于是乎,今天寫一下Service使用; 給我的感覺(jué)是它并不復(fù)雜,千萬(wàn)不要被一坨一坨的代碼嚇住了,雖然彎彎繞繞不少,重載函數(shù)一個(gè)接著一個(gè),就向走迷宮一樣,但只要抓住主線閱讀,很快就能找到出口
    2022-12-12
  • flutter中使用流式布局示例詳解

    flutter中使用流式布局示例詳解

    這篇文章主要為大家介紹了flutter中使用流式布局示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Android繪制雙折線圖的方法

    Android繪制雙折線圖的方法

    這篇文章主要為大家詳細(xì)介紹了Android繪制雙折線圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Android布局之GridLayout網(wǎng)格布局

    Android布局之GridLayout網(wǎng)格布局

    網(wǎng)格布局標(biāo)簽是GridLayout。這個(gè)布局是android4.0新增的布局。這個(gè)布局只有4.0之后的版本才能使用。本文給大家介紹Android布局之GridLayout網(wǎng)格布局相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • Android Studio中的Gradle依賴深入講解

    Android Studio中的Gradle依賴深入講解

    Android Studio由于使用了gradle的進(jìn)行項(xiàng)目構(gòu)建,使我們開發(fā)app方便很多,下面這篇文章主要給大家介紹了關(guān)于Android Studio中Gradle依賴的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • 淺談Android Studio3.6 更新功能

    淺談Android Studio3.6 更新功能

    這篇文章主要介紹了Android Studio3.6 更新功能的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Android使用ViewPager實(shí)現(xiàn)翻頁(yè)效果

    Android使用ViewPager實(shí)現(xiàn)翻頁(yè)效果

    這篇文章主要為大家詳細(xì)介紹了Android使用ViewPager實(shí)現(xiàn)翻頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 基于startActivityForResult方法處理兩個(gè)Activity之間數(shù)據(jù)傳遞問(wèn)題

    基于startActivityForResult方法處理兩個(gè)Activity之間數(shù)據(jù)傳遞問(wèn)題

    這篇文章主要介紹了基于startActivityForResult方法處理兩個(gè)Activity之間數(shù)據(jù)傳遞問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

梁河县| 荥阳市| 庆城县| 丰都县| 区。| 文水县| 新巴尔虎左旗| 万宁市| 甘南县| 景宁| 泸溪县| 梁平县| 石河子市| 井研县| 开原市| 琼海市| 肇源县| 巴塘县| 耿马| 靖安县| 南木林县| 吴江市| 贵州省| 四平市| 修武县| 黎平县| 任丘市| 汝南县| 福贡县| 苍山县| 蓬溪县| 华坪县| 广州市| 望江县| 仙居县| 平邑县| 昌平区| 灯塔市| 克东县| 布拖县| 杭州市|