2011-01-06 22 views
1

我已经完成了静态图像(例如drawable文件夹中的图像)显示的图像库。现在我需要从本地路径动态地添加一些图像到图库列表中(对于ex.from E:?/anim.jpeg这样)我。如何能做到这一点谢谢..在android中动态添加图库图像

我的展厅代码如下所示..

public class GalleryAct extends Activity { 

private Gallery gallery; 
private ImageView imgView; 

private Integer[] Imgid = { 
     R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4, R.drawable.img5, R.drawable.img6, R.drawable.img7, 
     R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4, R.drawable.img5, R.drawable.img6, R.drawable.img7 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    imgView = (ImageView)findViewById(R.id.ImageView01);  
    imgView.setImageResource(Imgid[0]); 

    gallery = (Gallery) findViewById(R.id.examplegallery); 
    gallery.setAdapter(new AddImgAdp(this)); 

    gallery.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
      imgView.setImageResource(Imgid[position]); 
     } 
    }); 

} 

public class AddImgAdp extends BaseAdapter { 
    int GalItemBg; 
    private Context cont; 

    public AddImgAdp(Context c) { 
     cont = c; 
     TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme); 
     GalItemBg = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0); 
     typArray.recycle(); 
    } 

    public int getCount() { 
     return Imgid.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 imgView = new ImageView(cont); 

     imgView.setImageResource(Imgid[position]); 
     imgView.setLayoutParams(new Gallery.LayoutParams(80, 70)); 
     imgView.setScaleType(ImageView.ScaleType.FIT_XY); 
     imgView.setBackgroundResource(GalItemBg); 

     return imgView; 
    } 
} 

} 

回答

4

写入文件所在的路径图像保存。

Environment.getExternalStorageDirectory()给出sdcard的路径。

File f1 = new File(Environment.getExternalStorageDirectory() 
       + File.separator + "test2.png"); 


BitmapFactory.Options o = new BitmapFactory.Options(); 
o.inJustDecodeBounds = true; 
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

imgView.setImageBitmap(bitmap); 

如果你的图像比位图太大,会给出错误,所以你必须写下面的代码来调整图像大小。通过下面的函数文件

Bitmap bitmap = decodeFile(f1); 
imgView.setImageBitmap(bitmap); 

private Bitmap decodeFile(File f) { 
    try { 
     // Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

     // The new size we want to scale to 
     final int REQUIRED_SIZE = 150; 

     // Find the correct scale value. It should be the power of 2. 
     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 1; 
     while (true) { 
      if (width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE) 
       break; 
      width_tmp /= 2; 
      height_tmp /= 2; 
      scale *= 2; 
     } 

     // Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 

    } catch (FileNotFoundException e) { 
    } 
    return null; 
} 
+0

谢谢你的回复shah。 – sanjay 2011-01-06 13:20:28

3

在你的情况,你可以尝试让你的图像数组动态列表,例如:ArrayList。在新项目到来时,将其添加到列表中,并调用notifyDataSetChanged()(适配器的方法),并且您的图库列表将被刷新。

取决于你的情况,我发现最好在这里使用AsyncTask来更新列表并调用notifyDataSetChanged。

适配器类同样也会看起来这个

public class AddImgAdp extends BaseAdapter { 
    int GalItemBg; 
    ArrayList<Bitmap> bitmapList; 
    private Context cont; 

    public AddImgAdp(Context c, ArrayList<Bitmap> bitmapList) { 
     cont = c; 
     TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme); 
     GalItemBg = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0); 
     typArray.recycle(); 
     this.bitmapList = bitmapList; 
    } 

    public int getCount() { 
     return bitmapList.size(); 
    } 

    public Object getItem(int position) { 
     return bitmapList.get(position); 
    } 

    public long getItemId(int position) { 
     return bitmapList.get(position); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imgView = new ImageView(cont); 

     // imgView.setImageResource(Imgid[position]); 
     imgView.setImageBitmap(bitmapList.get(position)); 

     imgView.setLayoutParams(new Gallery.LayoutParams(80, 70)); 
     imgView.setScaleType(ImageView.ScaleType.FIT_XY); 
     imgView.setBackgroundResource(GalItemBg); 

     return imgView; 
    } 
} 

让我知道如果任何错误,我的方式取决于IDE。