Browse » Home » Resource, Tutorial » Blog article: Gallery widget with remote Images

目的:了解如何应用非本地图片资源制作Gallery widget。

Layout 源代码 (XML):

 
 
 

主程序源代码 (Java):


import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class GalleryExample extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        /* Find the gallery defined in the main.xml
         * Apply a new (custom) ImageAdapter to it. */
        ((Gallery) findViewById(R.id.gallery))
               .setAdapter(new ImageAdapter(this));
    }

    public class ImageAdapter extends BaseAdapter {
     /** The parent context */
        private Context myContext;

        /** URL-Strings to some remote images. */
        private String[] myRemoteImages = {
               "http://www.anddev.org/images/tiny_tutheaders/weather_forecast.png",
               "http://www.anddev.org/images/tiny_tutheaders/cellidtogeo.png",
               "http://www.anddev.org/images/tiny_tutheaders/droiddraw.png"
        };

        /** Simple Constructor saving the 'parent' context. */
        public ImageAdapter(Context c) { this.myContext = c; }

        /** Returns the amount of images we have defined. */
        public int getCount() { return this.myRemoteImages.length; }

        /* Use the array-Positions as unique IDs */
        public Object getItem(int position) { return position; }
        public long getItemId(int position) { return position; }

        /** Returns a new ImageView to
         * be displayed, depending on
         * the position passed. */
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(this.myContext);

            try {
                    /* Open a new URL and get the InputStream to load data from it. */
                    URL aURL = new URL(myRemoteImages[position]);
                    URLConnection conn = aURL.openConnection();
                    conn.connect();
                    InputStream is = conn.getInputStream();
                    /* Buffered is always good for a performance plus. */
                    BufferedInputStream bis = new BufferedInputStream(is);
                    /* Decode url-data to a bitmap. */
                    Bitmap bm = BitmapFactory.decodeStream(bis);
                    bis.close();
                    is.close();
                    /* Apply the Bitmap to the ImageView that will be returned. */
                    i.setImageBitmap(bm);
               } catch (IOException e) {
                    i.setImageResource(R.drawable.error);
                    Log.e("DEBUGTAG", "Remtoe Image Exception", e);
               }

            /* Image should be scaled as width/height are set. */
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            /* Set the Width/Height of the ImageView. */
            i.setLayoutParams(new Gallery.LayoutParams(150, 150));
            return i;
        }

        /** Returns the size (0.0f to 1.0f) of the views
         * depending on the 'offset' to the center. */
        public float getScale(boolean focused, int offset) {
          /* Formula: 1 / (2 ^ offset) */
            return Math.max(0, 1.0f / (float)Math.pow(2, Math.abs(offset)));
        }
    }
}

Tags: , ,

Posted in Resource, Tutorial |

Related Posts

2 Responses to “Gallery widget with remote Images”


allove June 10th, 2009 at 6:43 pm

感觉这么处理是不是有点延时?

EGGer June 10th, 2009 at 7:04 pm

延时肯定存在,任何操作都存在一定程度的延时,这么说有点抬杠的成分。根据用户所处的网络环境而定,一般情况下不会有出现明显的不良反应。



Leave a Reply

You must be logged in to post a comment.