天天看點

可循環顯示圖像的Android Gallery元件

http://www.cnblogs.com/nokiaguy/archive/2010/08/23/1806870.html

gallery元件主要用于橫向顯示圖像清單,不過按正常做法。gallery元件隻能有限地顯示指定的圖像。也就是說,如果為gallery元件指定了10張圖像,那麼當gallery元件顯示到第10張時,就不會再繼續顯示了。這雖然在大多數時候沒有什麼關系,但在某些情況下,我們希望圖像顯示到最後一張時再重第1張開始顯示,也就是循環顯示。要實作這種風格的gallery元件,就需要對gallery的adapter對象進行一番改進。

gallery元件的傳統用法

<!--[endif]-->

     在實作可循環顯示圖像的gallery元件之前先來回顧一下gallery元件的傳統用法。gallery元件可以橫向顯示一個圖像清單,當單擊目前圖像的後一個圖像時,這個圖像清單會向左移動一格,當單擊目前圖像的前一個圖像時,這個圖像清單會向右移動一樣。也可以通過拖動的方式來向左和向右移動圖像清單。目前顯示的是第1個圖像的效果如圖1所示。gallery元件顯示到最後一個圖像的效果如圖2所示。

可循環顯示圖像的Android Gallery元件
可循環顯示圖像的Android Gallery元件

從圖2可以看出,當顯示到最後一個圖像時,清單後面就沒有圖像的,這也是gallery元件的基本顯示效果。在本文後面的部分将詳細介紹如何使gallery元件顯示到最後一個圖像時會從第1個圖像開始顯示。

好了,現在我們來看一下圖1和圖2的效果是如何做出來的吧。gallery既然用于顯示圖像,那第1步就必須要有一些圖像檔案用來顯示。現在可以随意準備一些圖像。在本文的例子中準備了15個jpg檔案(item1.jpg至item15.jpg)。将這些檔案都放在res\drawable目錄中。

下面将這些圖像的資源id都儲存在int數組中,代碼如下:

 private int[] resids = new int[]

    { r.drawable.item1, r.drawable.item2, r.drawable.item3,        

      r.drawable.item4, r.drawable.item5, r.drawable.item6,      

      r.drawable.item7, r.drawable.item8, r.drawable.item9, 

      r.drawable.item10, r.drawable.item11, r.drawable.item12,

      r.drawable.item13, r.drawable.item14, r.drawable.item15 };

在本例的main.xml檔案中配置了一個gallery元件,代碼如下:

可循環顯示圖像的Android Gallery元件
可循環顯示圖像的Android Gallery元件

代碼

<?xml version="1.0" encoding="utf-8"?>

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical" android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <gallery android:id="@+id/gallery" android:layout_width="fill_parent"

        android:layout_height="wrap_content" android:layout_margintop="30dp" />

</linearlayout>

現在在oncreate方法中裝載這個元件,代碼如下:

public void oncreate(bundle savedinstancestate)

    {

        super.oncreate(savedinstancestate);

        setcontentview(r.layout.main);

        // 裝載gallery元件

        gallery gallery = (gallery) findviewbyid(r.id.gallery);

        // 建立用于描述圖像資料的imageadapter對象

        imageadapter imageadapter = new imageadapter(this);

         // 設定gallery元件的adapter對象

        gallery.setadapter(imageadapter);

    }

    在上面的代碼中涉及到一個非常重要的類:imageadapter。該類是android.widget.baseadapter的子類,用于描述圖像資訊。下面先看一下這個類的完整代碼。

public class imageadapter extends baseadapter

        int mgalleryitembackground;

        private context mcontext;

        public imageadapter(context context)

        {

            mcontext = context;

              // 獲得gallery元件的屬性

            typedarray typedarray = obtainstyledattributes(r.styleable.gallery);

            mgalleryitembackground = typedarray.getresourceid(

                    r.styleable.gallery_android_galleryitembackground, 0);                        

        }

         // 傳回圖像總數

        public int getcount()

            return resids.length;

        public object getitem(int position)

            return position;

        public long getitemid(int position)

         // 傳回具體位置的imageview對象

        public view getview(int position, view convertview, viewgroup parent)

            imageview imageview = new imageview(mcontext);

             // 設定目前圖像的圖像(position為目前圖像清單的位置)

            imageview.setimageresource(resids[position]);

            imageview.setscaletype(imageview.scaletype.fit_xy);

            imageview.setlayoutparams(new gallery.layoutparams(163, 106));

            // 設定gallery元件的背景風格

            imageview.setbackgroundresource(mgalleryitembackground);

            return imageview;

在編寫imageadapter類時應注意的兩點:

1. 在imageadapter類的構造方法中獲得了gallery元件的屬性資訊。這些資訊被定義在res\values\attrs.xml檔案中,代碼如下:

繼續閱讀