AndroidGallery

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。 

原文地址:https://www.cnblogs.com/chenyao/p/3002470.html