循環顯示圖像的原理java
循環顯示有些相似於循環鏈表,最後一個結點的下一個結點又是第1個結點。循環顯示圖像也能夠模擬這一點。android
也許細心的讀者從上一節實現的ImageAdapter類中會發現些什麼。對!就是getView方法中的position參數和getCount方法的關係。position參數的值是不可能超過getCount方法返回的值的,也就是說,position參數值的範圍是0至getCount() - 1。數組
若是這時Gallery組件正好顯示到最後一個圖像,position參數值正好爲getCount() - 1。那麼咱們如何再讓Gallery顯示下一個圖像呢?也就是說讓position參數值再增1,對!將getCount()方法的返回值也增1。app
那麼這裏還有一個問題,若是position參數值無限地增長,就意味着myImageIds數組要不斷地增大,這樣會大大消耗系統的資源。想到這,就須要解決兩個問題:既要position不斷地增長,又讓resIds數組中保存的圖像資源ID是有限的,該怎麼作呢?對於getCount()方法很是好解決,能夠讓getCount方法返回一個很大的數,例如,*Integer.MAX_VALUE。這時position參數值就能夠隨着Gallery組件的圖像不斷向前移動而增大。如今myImageIds數組只有6個元素,若是position的值超過數組邊界,要想繼續循環取得數組中的元素(也就是說,當position的值是6時,取myImageIds數組的第0個元素,是6時取第1個元素)*,最簡單的方法就是取餘,代碼以下:ide
package irdc.EX04_10; import android.app.Activity; import android.os.Bundle; import android.content.Context; import android.content.res.TypedArray; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class EX04_10 extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Gallery g = (Gallery) findViewById(R.id.mygallery); g.setAdapter(new ImageAdapter(this)); setTitle("Gallery 實現循環瀏覽圖片"); g.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { Toast.makeText(EX04_10.this, getString(R.string.my_gallery_text_pre) + position + getString(R.string.my_gallery_text_post), Toast.LENGTH_SHORT).show(); } }); } public class ImageAdapter extends BaseAdapter { int mGalleryItemBackground; private Context mContext; private int[] myImageIds = {R.drawable.photo1, R.drawable.photo2, R.drawable.photo3, R.drawable.photo4, R.drawable.photo5, R.drawable.photo6,}; public ImageAdapter(Context c) { mContext = c; TypedArray a = obtainStyledAttributes(R.styleable.Gallery); mGalleryItemBackground = a.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0); a.recycle(); } public int getCount() { //return myImageIds.length; return Integer.MAX_VALUE; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { // if (position == getCount()) // { // position = 0; // } ImageView i = new ImageView(mContext); i.setImageResource(myImageIds[position%myImageIds.length]); i.setScaleType(ImageView.ScaleType.FIT_XY); i.setLayoutParams(new Gallery.LayoutParams(136, 88)); i.setBackgroundResource(mGalleryItemBackground); return i; } } }