Gallery-n. 大批观众;画廊,走廊;旁听席;(教堂,议院等的)边座;
main配置文件的配置:
View Code
1 <LinearLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 android:background="@drawable/white" 4 android:orientation="vertical" 5 android:layout_width="fill_parent" 6 android:layout_height="fill_parent" 7 > 8 <TextView 9 android:id="@+id/myTextView01" 10 android:layout_width="fill_parent" 11 android:layout_height="wrap_content" 12 android:text="@string/hello" 13 android:gravity="center_vertical|center_horizontal" 14 /> 15 <Gallery 16 android:id="@+id/myGallery1" 17 android:layout_width="fill_parent" 18 android:layout_height="wrap_content" 19 android:gravity="bottom" 20 /> 21 </LinearLayout>
Activity onCreate方法
1 public void onCreate(Bundle savedInstanceState) 2 { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.main); 5 mTextView01 = (TextView) findViewById(R.id.myTextView01); 6 mTextView01.setText(getString(R.string.str_txt1)); 7 mTextView01.setTextColor(Color.BLUE); 8 ((Gallery) findViewById(R.id.myGallery1)) 9 .setAdapter(new ImageAdapter(this)); 10 }
需要给Gallery设置Adapter,自定义ImageAdapter。
public class ImageAdapter extends BaseAdapter { /* 类成员 myContext为Context父类 */ private Context myContext; /* 使用android.R.drawable里的图片作为图库来源,类型为整数数组 */ private int[] myImageIds = { android.R.drawable.btn_minus, android.R.drawable.btn_radio, android.R.drawable.ic_lock_idle_low_battery, android.R.drawable.ic_menu_camera }; /* 建构子只有一个参数,即要储存的Context */ public ImageAdapter(Context c) { this.myContext = c; } /* 回传所有已定义的图片总数量 */ public int getCount() { return this.myImageIds.length; }
/* 利用getItem方法,取得目前容器中影像的数组ID */ public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } /* 取得目前欲显示的影像View,传入数组ID值使之读取与成像 */ public View getView(int position, View convertView, ViewGroup parent) { /* 建立一个ImageView对象 */ ImageView i = new ImageView(this.myContext); i.setImageResource(this.myImageIds[position]); i.setScaleType(ImageView.ScaleType.FIT_XY); /* 设定这个ImageView对象的宽高,单位为dip */ i.setLayoutParams(new Gallery.LayoutParams(120, 120)); return i; }
/* 依据距离中央的位移量 利用getScale回传views的大小(0.0f to 1.0f) */ public float getScale(boolean focused, int offset) { /* Formula: 1 / (2 ^ offset) */ return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset))); } }
在ImageAdapter类中有两个非常重要的方法:getCount和getView。其中getCount方法用于返回图像总数,要注意的是,这个总数不能大于图像的实际数(可以小于图像的实际数),否则会抛出越界异常。当Gallery组件要显示某一个图像时,就会调用getView方法,并将当前的图像索引(position参数)传入该方法。一般getView方法用于返回每一个显示图像的组件(ImageView对象)。从这一点可以看出,Gallery组件是即时显示图像的,而不是一下将所有的图像都显示出来。在getView方法中除了创建了ImageView对象,还用从resIds数组中获得了相应的图像资源ID来设置在ImageView中显示的图像。
自我理解,当要显示下一个图片时候,position会自动+1或者-1,然后先判断此时的position是否超出getCount(),如果超出就会抛出异常,如果没有就调用getView方法,如果是一直往右边,position的数量就会一直增加。 要实现循环出现图像,就需要把getCount()改成无限大,然后在getView里设置image对象要取模得到对应的图像。
疑问:重写的getItem方法的作用是什么,在底层何时调用?为什么传入的参数是position,返回的值也是position。