أضف صور المعرض ديناميكيًا في Android
-
26-09-2019 - |
سؤال
لقد قمت بمعرض الصور المعروضة على المحاكي بواسطة Static (أي الصور من drawable
مجلد). الآن أحتاج إلى إضافة بعض الصور إلى قائمة المعرض ، ديناميكيًا من المسار المحلي (لـ ex.from e: /anim.jpeg مثل هذا). كيف يمكنني فعل ذلك؟ شكرا ..
يظهر رمز المعرض الخاص بي أدناه ..
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;
}
}
}
المحلول
اكتب مسار الملف حيث يتم حفظ الصورة.
البيئة.
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;
}
نصائح أخرى
في حالتك ، يمكنك محاولة جعل صفيف الصور الخاص بك قائمة ديناميكية ، على سبيل المثال: ArrayList. عند وصول العنصر الجديد ، أضفه إلى القائمة ، واتصل NotifyDatAstechanged () (طريقة المحول) ، وسيتم تحديث قائمة المعرض الخاصة بك.
يعتمد على قضيتك ، وجدت أنه من الأفضل استخدام Asynctask هنا لتحديث القائمة ، والاتصال NotifyDataStechanged.
سوف تبدو فئة المحول بشكل مشابه لهذا
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.