Android 如何在图像视图的背景中设置

Android 如何在图像视图的背景中设置,android,Android,我是Android新手,我想在背景中设置图像,这是从Url获取的。我正在使用ImageLoader类 请帮助我在后台设置图像视图 这是我的图像加载器类 public class ImageLoader { // the simplest in-memory cache implementation. This should be replaced with // something like SoftReference or BitmapOptions.inPurgeable(since 1.

我是Android新手,我想在背景中设置图像,这是从Url获取的。我正在使用ImageLoader类 请帮助我在后台设置图像视图

这是我的图像加载器类

public class ImageLoader {

// the simplest in-memory cache implementation. This should be replaced with
// something like SoftReference or BitmapOptions.inPurgeable(since 1.6)
private HashMap<String, Bitmap> cache = new HashMap<String, Bitmap>();

private File cacheDir;

static ArrayList<String> img_path = new ArrayList<String>();

static String sd_card_folder_name = "ImageLoader";

static int width;

public ImageLoader(Context context, Activity acc) {
    // Make the background thead low priority. This way it will not affect
    // the UI performance
    photoLoaderThread.setPriority(Thread.NORM_PRIORITY - 1);

    DisplayMetrics displaymetrics = new DisplayMetrics();
    acc.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    width = displaymetrics.widthPixels;
    Log.d("width", "width = " + width);

    cache.clear();

    img_path = new ArrayList<String>();

    // Find the dir to save cached images
    if (android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_MOUNTED))
        cacheDir = new File(android.os.Environment
                .getExternalStorageDirectory(), sd_card_folder_name);
    else
        cacheDir = context.getCacheDir();
    if (!cacheDir.exists())
        cacheDir.mkdirs();

}

final int stub_id = R.drawable.loader;

public void DisplayImage(String url, Activity activity, ImageView imageView) {
    try {
        String filename = String.valueOf(url.hashCode());

        File[] file_array = cacheDir.listFiles();

        for (int i = 0; i < file_array.length; i++) {
            img_path.add(file_array[i].getName());
        }

        if (img_path.contains(filename)) {
            imageView.setImageBitmap(BitmapFactory
                    .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                            + filename));
        } else {
            if (cache.containsKey(url)) {
                imageView.setImageBitmap(cache.get(url));
            } else {
                queuePhoto(url, activity, imageView, filename);
                imageView.setImageResource(stub_id);
            }
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}

private void queuePhoto(String url, Activity activity, ImageView imageView, String _name) {
    // This ImageView may be used for other images before. So there may be
    // some old tasks in the queue. We need to discard them.
    photosQueue.Clean(imageView);
    PhotoToLoad p = new PhotoToLoad(url, imageView, _name);
    synchronized (photosQueue.photosToLoad) {
        photosQueue.photosToLoad.push(p);
        photosQueue.photosToLoad.notifyAll();
    }

    // start thread if it's not started yet
    if (photoLoaderThread.getState() == Thread.State.NEW)
        photoLoaderThread.start();
}

private Bitmap getBitmap(String url) {
    // I identify images by hashcode. Not a perfect solution, good for the
    // demo.

    if (url != null && !(url.equals(""))) {
        String filename = String.valueOf(url.hashCode());
        File f = new File(cacheDir, filename);

        /*
         * // from SD cache Bitmap b = decodeFile(f); if (b != null) return
         * b;
         */
        // from web
        try {
            Bitmap bitmap = null;
            InputStream is = new URL(url).openStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, os);
            os.close();
            bitmap = decodeFile(f);
            return bitmap;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    return null;
}

// decodes image and scales it to reduce memory consumption
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);

        // Find the correct scale value. It should be the power of 2.
         final int REQUIRED_SIZE=300;
            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;
}

// Task for the queue
private class PhotoToLoad {
    public String url;
    public ImageView imageView;
    public String _name;

    public PhotoToLoad(String u, ImageView i, String n) {
        url = u;
        imageView = i;
        _name = n;
    }
}

PhotosQueue photosQueue = new PhotosQueue();

public void stopThread() {
    photoLoaderThread.interrupt();
}

// stores list of photos to download
class PhotosQueue {
    private Stack<PhotoToLoad> photosToLoad = new Stack<PhotoToLoad>();

    // removes all instances of this ImageView
    public void Clean(ImageView image) {
        for (int j = 0; j < photosToLoad.size();) {
            if (photosToLoad.get(j).imageView == image)
                photosToLoad.remove(j);
            else
                ++j;
        }
    }
}

class PhotosLoader extends Thread {
    public void run() {
        try {
            while (true) {
                // thread waits until there are any images to load in the
                // queue
                if (photosQueue.photosToLoad.size() == 0)
                    synchronized (photosQueue.photosToLoad) {
                        photosQueue.photosToLoad.wait();
                    }
                if (photosQueue.photosToLoad.size() != 0) {
                    PhotoToLoad photoToLoad;
                    synchronized (photosQueue.photosToLoad) {
                        photoToLoad = photosQueue.photosToLoad.pop();
                    }
                    Bitmap bmp = getBitmap(photoToLoad.url);
                    cache.put(photoToLoad.url, bmp);
                    Object tag = photoToLoad.imageView.getTag();
                    String FileName = photoToLoad._name;
                    if (FileName != null
                            && ((String) FileName).equals(photoToLoad._name)) {
                        BitmapDisplayer bd = new BitmapDisplayer(bmp,
                                photoToLoad.imageView, FileName);
                        Activity a = (Activity) photoToLoad.imageView
                                .getContext();
                        a.runOnUiThread(bd);
                    }
                }
                if (Thread.interrupted())
                    break;
            }
        } catch (InterruptedException e) {
            // allow thread to exit
        }
    }
}

PhotosLoader photoLoaderThread = new PhotosLoader();

// Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable {
    Bitmap bitmap;
    ImageView imageView;
    String file_name;

    public BitmapDisplayer(Bitmap b, ImageView i, String _name) {
        bitmap = b;
        imageView = i;
        file_name = _name;
    }

    public void run() {
        if (bitmap != null) {

            load_full_image(imageView, file_name, bitmap);

        } else
            imageView.setImageResource(stub_id);
    }
}

private Runnable mMyRunnable = new Runnable() {
    @Override
    public void run() {

    }
};

public void load_full_image(ImageView img, String _name, Bitmap btmp) {
    img_path = new ArrayList<String>();

    File[] file_array = cacheDir.listFiles();
    for (int i = 0; i < file_array.length; i++) {
        img_path.add(file_array[i].getName());
    }

    if (img_path.contains(_name)) {
        img.setImageBitmap(BitmapFactory
                .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                        + _name));
    } else {
        img.setImageBitmap(btmp);
    }
}

public void clearCache() {
    // clear memory cache
    cache.clear();

    // clear SD cache
    File[] files = cacheDir.listFiles();
    for (File f : files)
        f.delete();
}

您必须更改imageLoader类的load\u full\u image方法,如下所示

public class ImageLoader {
 ...
Context mContext;
...

public ImageLoader(Context context, Activity acc) {
...
mContext = context
....

}


public void load_full_image(ImageView img, String _name, Bitmap btmp) {
img_path = new ArrayList<String>();

File[] file_array = cacheDir.listFiles();
for (int i = 0; i < file_array.length; i++) {
    img_path.add(file_array[i].getName());
}

if (img_path.contains(_name)) {
    Drawable d = new BitmapDrawable(mContext.getResources(),BitmapFactory
                        .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                                + _name));
     img.setBackground(d);
} else {

    Drawable d = new BitmapDrawable(mContext.getResources(),btmp);
    img.setBackground(d);
}
}
}
公共类ImageLoader{
...
语境;
...
公共图像加载器(上下文、活动acc){
...
mContext=上下文
....
}
公共无效加载\u完整\u图像(ImageView img、字符串\u名称、位图btmp){
img_path=new ArrayList();
File[]File_array=cacheDir.listFiles();
对于(int i=0;i

请尝试此代码,它可能会工作

您已创建ImageLoader的实例,但尚未初始化ImageLoader。为此,在imageLoader=imageLoader.getInstance()之后的构造函数中添加这行代码:

init(ImageLoaderConfiguration.createDefault(ctx))

您尚未为imageLoader声明任何选项。修改DisplayImageOptions代码,如下所示:


DisplayImageOptions options=new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.image_loading)。showImageForEmptyUri(R.drawable.no_image)。showImageOnFail(R.drawable.image_failed)。cacheInMemory(true)。cacheOnDisc(true)。bitmapConfig(Bitmap.Config.RGB_565)。build()

我已经编辑了上面的代码,检查并在ContextImage loader类中添加该代码如果我更改PhotoTOLoad的PhotoTOLoad intead of photoTOLoas给我错误,则无法对非静态字段PhotoTOLoad.ImageView进行静态引用您必须在ImageLoader类中声明上下文全局,并在ImageLoader类的构造函数中设置它。之后,您可以在Imageloader classok中的任何位置使用该上下文,从代码中删除photoToLoad,然后进行检查。让我知道它是否工作?删除什么..PhotoTOLoad类..或PhotoTOLoad..如果PhotoTOLoad是我的错误。。
[Use this project aims to provide a reusable instrument for asynchronous image loading, caching and displaying.][1]

Features

1)Multithread image loading (async or sync)
2)Wide customization of ImageLoader's configuration (thread executors, downloader, decoder, 3)memory and disk cache, display image options, etc.)
4)Many customization options for every display image call (stub images, caching switch, decoding options, Bitmap processing and displaying, etc.)
5)Image caching in memory and/or on disk (device's file system or SD card)
6)Listening loading process (including downloading progress)
*****Android 2.0+ support


  [1]: https://github.com/nostra13/Android-Universal-Image-Loader
public class ImageLoader {
 ...
Context mContext;
...

public ImageLoader(Context context, Activity acc) {
...
mContext = context
....

}


public void load_full_image(ImageView img, String _name, Bitmap btmp) {
img_path = new ArrayList<String>();

File[] file_array = cacheDir.listFiles();
for (int i = 0; i < file_array.length; i++) {
    img_path.add(file_array[i].getName());
}

if (img_path.contains(_name)) {
    Drawable d = new BitmapDrawable(mContext.getResources(),BitmapFactory
                        .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                                + _name));
     img.setBackground(d);
} else {

    Drawable d = new BitmapDrawable(mContext.getResources(),btmp);
    img.setBackground(d);
}
}
}