總網頁瀏覽量

關於我自己

我的相片
人生的必修課是接受無常,人生的選修課是放下執著。

2012年1月17日 星期二

Gallery ~ 透過TypedArray設置Gallery/ImageView的背景風格


本範例由2個Gallery及1個ImageView元件組成, 最上層的g_folder(Gallery)代表相簿, 以
setOnItemClickListener()的方法對使用者的點擊做出換相簿的動作, 呈現圖片在g_photo(下一排的Gallery). 
g_photo的onItemClick()事件中, 將使用者點選到的圖片放大到ImageView中.






Gallery_ImageView.java
package com.tsots.Gallery_ImageView;

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 Gallery_ImageView extends Activity 
{
 Gallery g_folder,g_photo;
 ImageView i1;
 Context context = Gallery_ImageView.this;
 int level = 1;
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) 
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  
  g_folder = (Gallery) findViewById(R.id.gallery_folder);
  g_photo = (Gallery) findViewById(R.id.gallery1);
  i1 = (ImageView) findViewById (R.id.imageView1);
  
  g_folder.setAdapter(new ImageAdapter(context));
  
  g_folder.setOnItemClickListener(new OnItemClickListener() 
  {
   public void onItemClick(AdapterView parent, View v, int position, long id) 
   {
    Toast.makeText(context, String.valueOf(position), Toast.LENGTH_SHORT).show();
    
    if(position == 0)
    {
     level = 11;
    }
    else if(position == 1)
    {
     level = 12;
    }
    else if(position ==2)
    {
     level = 13;
    }
    g_photo.setAdapter(new ImageAdapter(context));
    backgroundType(i1);
   }
  });
  
  g_photo.setOnItemClickListener(new OnItemClickListener() 
  {
   public void onItemClick(AdapterView parent, View v, int position, long id) 
   {
    Toast.makeText(context, String.valueOf(position), Toast.LENGTH_SHORT).show();
    if(level == 11)
    {
     i1.setImageResource(new ImageAdapter(context).ImageId1[position]);
    }
    else if (level == 12)
    {
     i1.setImageResource(new ImageAdapter(context).ImageId2[position]);
    }
    else if (level == 13)
    {
     i1.setImageResource(new ImageAdapter(context).ImageId3[position]);
    }
    backgroundType(i1);
   }
  });
 }
  
 public class ImageAdapter extends BaseAdapter 
 {
  int mGalleryItemBackground;
  private Context mContext;
    
  public ImageAdapter(Context c) 
  {
   mContext = c;   
  }

    public int getCount() 
    {
     if(level == 1)
         {
      return folderImageIds.length;
         }
     else if(level == 11)
     {
      return ImageId1.length;
     }
     else if(level == 12)
     {
      return ImageId2.length;
     }
     else
     {
      return ImageId3.length;
     }
    }
    
    public Object getItem(int position) 
    {
      return position;
    }
    
    public long getItemId(int position) 
    {
      return position;
    }
    
    public View getView(int position, View convertView, ViewGroup parent) 
    {
      ImageView i = new ImageView(mContext);
      if(level == 1)
      {
       i.setImageResource(folderImageIds[position]);
      }
      else if(level == 11)
      {
       i.setImageResource(ImageId1[position]);
      }
      else if (level == 12)
      {
       i.setImageResource(ImageId2[position]);
      }
      else if(level == 13)
      {
       i.setImageResource(ImageId3[position]);
      }
      i.setScaleType(ImageView.ScaleType.FIT_XY);
      i.setLayoutParams(new Gallery.LayoutParams(120, 120));
      backgroundType(i);
      return i;
    }
    private Integer[] folderImageIds = 
    {
        R.drawable.ic_menu_slideshow,
        R.drawable.ic_menu_slideshow,
        R.drawable.ic_menu_slideshow
    };
    private Integer[] ImageId1 = 
    {
        R.drawable.pic_01,
        R.drawable.pic_02,
        R.drawable.pic_03,
        R.drawable.pic_04,
        R.drawable.pic_05,
        R.drawable.pic_06,
        R.drawable.pic_07,
        R.drawable.pic_08,
        R.drawable.pic_09,
        R.drawable.pic_10,
        R.drawable.pic_11,
        R.drawable.pic_12
    };   
    private Integer[] ImageId2 = 
    {
        R.drawable.photo_1,
        R.drawable.photo_2,
        R.drawable.photo_3,
        R.drawable.photo_4,
        R.drawable.photo_5,
        R.drawable.photo_6,
        R.drawable.photo_7,
        R.drawable.photo_8,
        R.drawable.photo_9,
        R.drawable.photo_10
    };  
    private Integer[] ImageId3 = 
    {
        R.drawable.img_01,
        R.drawable.img_02,
        R.drawable.img_03,
        R.drawable.img_04,
        R.drawable.img_05,
        R.drawable.img_06,
        R.drawable.img_07,
        R.drawable.img_08,
        R.drawable.img_09,
        R.drawable.img_10
    }; 
  } 
 
 /*
  * 透過TypedArray設置Gallery/ImageView的背景風格
  */
 public void backgroundType(ImageView image)
 {
  int mGalleryItemBackground;
  TypedArray a = obtainStyledAttributes(R.styleable.Gallery);
  mGalleryItemBackground = a.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0);
  a.recycle();
  image.setBackgroundResource(mGalleryItemBackground);
 }
}
 
==============================補充
==============================
當載入圖片時發生java.lang.OutOfMemoryError
可能是圖檔太大,超過能使用的記憶體
試試這個方法:
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2; //以 2 的平方為佳
Bitmap bitmap = BitmapFactory.decodeFile(R.drawable.imageFile, opts);

沒有留言:

張貼留言