2012-07-28 96 views
13

嗨,我現在正在測試android coverflow 我試圖從url中獲取圖像並將其顯示在coverflow中 我已成功下載圖像,但無法放入位圖。 這裏是代碼我試圖...coverflow android:如何從coverflow中的url中獲取圖片

package com.example.coverflow; 

import java.io.FileInputStream; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.LinearGradient; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.PorterDuff.Mode; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Shader.TileMode; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.Toast; 
import android.widget.ImageView.ScaleType; 

import com.example.coverflow.CoverAdapterView.OnItemClickListener; 

public class CoverFlowExample extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     CoverFlow coverFlow; 
     coverFlow = new CoverFlow(this); 

     coverFlow.setAdapter(new ImageAdapter(this)); 

     ImageAdapter coverImageAdapter = new ImageAdapter(this); 

     coverImageAdapter.createReflectedImages(); 

     coverFlow.setAdapter(coverImageAdapter); 

     coverFlow.setSpacing(-15); 
     coverFlow.setSelection(8, true); 



     setContentView(coverFlow); 
     coverFlow.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(CoverAdapterView<?> parent, View view, 
        int position, long id) { 
       // TODO Auto-generated method stub 
       Log.v("possition ", " this position :"+position); 
       Toast.makeText(getApplicationContext(), "position "+position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     // Use this if you want to use XML layout file 
     // setContentView(R.layout.main); 
     // coverFlow = (CoverFlow) findViewById(R.id.coverflow); 

    } 

    public class ImageAdapter extends BaseAdapter { 
     int mGalleryItemBackground; 
     private Context mContext; 

     private FileInputStream fis; 
     //public Integer[] mImageIds ; 

     private Integer[] mImageIds ={1,2,3,4,5}; 
     /*private Integer[] mImageIds = { R.drawable.kasabian_kasabian, 

     R.drawable.killers_day_and_age, R.drawable.garbage_bleed_like_me, 
       R.drawable.death_cub_for_cutie_the_photo_album, 
       R.drawable.kasabian_kasabian, R.drawable.kasabian_kasabian, 
       R.drawable.killers_day_and_age, 
       R.drawable.garbage_bleed_like_me, 
       R.drawable.massive_attack_collected, 
       R.drawable.kasabian_kasabian, R.drawable.kasabian_kasabian, 
       R.drawable.kasabian_kasabian 

     };*/ 



     public int getCount2() 
     { 
      for(int i=0;i<5;i++) 
      { 
       ImageView imageView = new ImageView(mContext); 
       URL url; 
       try { 
        url = new URL("http://www.psdgraphics.com/file/retro-tv-icon.jpg"); 

       Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 

       imageView.setImageBitmap(bmp); 
       imageView.setId(i); 
       //mImageIds[i]=i; 

       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      return mImageIds.length; 
     } 

     private ImageView[] mImages; 

     public ImageAdapter(Context c) { 
      mContext = c; 
      mImages = new ImageView[getCount2()]; 
     } 

     public boolean createReflectedImages() { 
      // The gap we want between the reflection and the original image 
      final int reflectionGap = 4; 

      int index = 0; 
      for (final int imageId : mImageIds) { 
//    Bitmap originalImage = BitmapFactory.decodeResource(
//      getResources(), imageId); 
       URL url; 
       Bitmap originalImage= null; 
       try { 
       url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464"); 

       originalImage = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       int width = originalImage.getWidth(); 
       int height = originalImage.getHeight(); 
       Log.v("width:",""+width+","+height); 

       // This will not scale but will flip on the Y axis 
       Matrix matrix = new Matrix(); 
       matrix.preScale(1, -1); 

       Log.v("errer her", "aftr originalImage"); 
       // Create a Bitmap with the flip matrix applied to it. 
       // We only want the bottom half of the image 
       Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, 
         height/2, width, height/2, matrix, false); 

       // Create a new bitmap with same width but taller to fit 
       // reflection 
       Bitmap bitmapWithReflection = Bitmap.createBitmap(width, 
         (height + height/2), Config.ARGB_8888); 

       // Create a new Canvas with the bitmap that's big enough for 
       // the image plus gap plus reflection 
       Canvas canvas = new Canvas(bitmapWithReflection); 
       // Draw in the original image 
       canvas.drawBitmap(originalImage, 0, 0, null); 
       // Draw in the gap 
       Paint deafaultPaint = new Paint(); 
       canvas.drawRect(0, height, width, height + reflectionGap, 
         deafaultPaint); 
       // Draw in the reflection 
       canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, 
         null); 
       Log.v("errer her", "aftr reflectionImage"); 
       // Create a shader that is a linear gradient that covers the 
       // reflection 
       Paint paint = new Paint(); 
       LinearGradient shader = new LinearGradient(0, 
         originalImage.getHeight(), 0, 
         bitmapWithReflection.getHeight() + reflectionGap, 
         0x70ffffff, 0x00ffffff, TileMode.CLAMP); 
       // Set the paint to use this shader (linear gradient) 
       paint.setShader(shader); 
       // Set the Transfer mode to be porter duff and destination in 
       paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
       // Draw a rectangle using the paint with our linear gradient 
       canvas.drawRect(0, height, width, 
         bitmapWithReflection.getHeight() + reflectionGap, paint); 
       Log.v("errer her", "aftr drawrect"); 
       ImageView imageView = new ImageView(mContext); 
       imageView.setImageBitmap(bitmapWithReflection); 
       imageView.setLayoutParams(new CoverFlow.LayoutParams(120, 180)); 
       imageView.setScaleType(ScaleType.MATRIX); 
       mImages[index++] = imageView; 

      } 
      return true; 
     } 

     public int getCount() { 
      // Log.v("getCoutn(int count)", "" + mImageIds.length); 
      return mImageIds.length; 
     } 

     public Object getItem(int position) { 
      // Log.v("getItem(int position)", "" + position); 
      return position; 
     } 

     public long getItemId(int position) { 
      // Log.v("getItemID(int position)", "" + position); 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 

      // Use this code if you want to load from resources 
      // ImageView i = new ImageView(mContext); 
      // i.setImageResource(mImageIds[position]); 
      // i.setLayoutParams(new CoverFlow.LayoutParams(130, 130)); 
      // i.setScaleType(ImageView.ScaleType.MATRIX); 
      // return i; 

      // Log.v("getview int position mImages", ""+position); 
      ImageView imageView = new ImageView(mContext); 
      URL url; 
      try { 
       url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464"); 

      Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
      imageView.setImageBitmap(bmp); 
      imageView.setId(position); 

      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return imageView; 
      //return mImages[position]; 
     } 

     /** 
     * 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) */ 
      Log.v("getScale float ", " " + focused + " " + offset); 
      return Math.max(0, 1.0f/(float) Math.pow(2, Math.abs(offset))); 
     } 

    // View v=getView(position, convertView, parent); 




    } 



} 

回答

11

1.創建ImageAdater.java爲downloadimages

public static byte[] getLogoImage(String url){ 
     try { 
      URL imageUrl = new URL(url); 
      URLConnection ucon = imageUrl.openConnection(); 

      InputStream is = ucon.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 

      ByteArrayBuffer baf = new ByteArrayBuffer(500); 
      int current = 0; 
      while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
      } 

      return baf.toByteArray(); 
     } catch (Exception e) { 
      Log.d("ImageManager", "Error: " + e.toString()); 
     } 
     return null; 
    } 

3.Declare一個

package com.sample.Adapters; 

import java.util.ArrayList; 
import android.app.Activity; 
import android.graphics.BitmapFactory; 
import android.graphics.drawable.BitmapDrawable; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
public class ImageAdapter extends BaseAdapter { 
    int mGalleryItemBackground; 
    private Activity mContext; 
    ArrayList<byte[]> imgarray ; 
    public ImageAdapter(Activity c,ArrayList<byte[]> array) { 
     mContext = c; 
     this.imgarray = array ; 
    } 
    public int getCount() { 
     return imgarray.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 
    public long getItemId(int position) { 
     return position; 
    } 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(mContext); 
     i.setImageBitmap(BitmapFactory.decodeByteArray(imgarray.get(position), 0, imgarray.get(position).length)); 
     i.setLayoutParams(new com.sample.custom.CoverFlow.LayoutParams(LayoutParams.WRAP_CONTENT-20, LayoutParams.WRAP_CONTENT-20)); 
     i.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
     BitmapDrawable drawable = (BitmapDrawable) i.getDrawable(); 
     drawable.setAntiAlias(true); 
     return i; 
    } 
     public float getScale(boolean focused, int offset) { 
     /* Formula: 1/(2^offset) */ 
      return Math.max(0, 1.0f/(float)Math.pow(2, Math.abs(offset))); 
     } 

} 

2. 方法ArrayList<byte[]> arraylistgallery = new ArrayList<byte[]>();

在這裏,我認爲未來總的圖像將會在10個的AsyncTask

for(int i=0 ; i<10 ; i++){ 
arraylistgallery.add(i,getLogoImage("http://www.psdgraphics.com/file/retro-tv-icon.jpg")); 
} 

downloadImages和保存arraylistgallery ArrayList 又通如下面這段代碼

 coverFlow.setVisibility(View.VISIBLE); 
     coverFlow.setAdapter(new ImageAdapter(this,arraylistgallery)); 
     coverFlow.setSpacing(5); 
     coverFlow.setSelection(arraylistgallery.size()-1, true); 
     coverFlow.setAnimationDuration(1000); 
+0

你不應該在'getView'中解碼圖像,或者做一次然後緩存它。 – Blundell 2012-07-30 12:46:48

+0

任何resoan?但在我的項目,工作正常... PLZ給我的建議 – 2012-07-30 12:49:28

+0

你可能會得到一個內存不足的錯誤,也可能看起來落後於一個大的項目列表 – Blundell 2012-07-30 17:48:55

0

使用了點。

coverFlow = new CoverFlow(this); 
ImageAdapter coverImageAdapter = new ImageAdapter(this); 
coverFlow.setAdapter(coverImageAdapter); 
coverFlow.setSpacing(0); 
coverFlow.setSelection(0, true); 
coverFlow.setLayoutParams(params); 
coverFlow.setOnItemClickListener(this); 

coverFlow.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(CoverAdapterView<?> parent, View view, int position, long id){ 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onNothingSelected(CoverAdapterView<?> parent) { 
     // TODO Auto-generated method stub 
    } 
}); 

ImageAdapter.java

public class ImageAdapter extends BaseAdapter { 
    public ImageLoader imageLoader; 
    public ImageAdapter(Context c) { 
     Constants.ctx = c; 
     imageLoader = new ImageLoader(Constants.ctx.getApplicationContext()); 
     } 

     public int getCount() { 
      return Constants.mIsFeaturedTrueImage.size(); 
     } 

     public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      System.gc(); 
      ImageView i = new ImageView(Constants.ctx); 
      if (Constants.mIsFeaturedTrueImage.get(position).equals("null") || Constants.mIsFeaturedTrueImage.get(position).equals("")) { 
       System.out.println("Hello if"); 
       i.setImageResource(R.drawable.icon); 
      } else { 
       System.out.println("Hello else if"); 
       imageLoader.DisplayImage(Constants.mIsFeaturedTrueImage.get(position), i); 
      } 

      i.setLayoutParams(new CoverFlow.LayoutParams(
      mConstant.mImageWidth + 28, mConstant.mImageHeight + 28)); 
      i.setScaleType(ImageView.ScaleType.MATRIX); 
      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))); 
     } 
    } 
} 

和使用從URL和Constants.mIsFeaturedTrueImage.get(位置)負載圖像ImageLoader的類是圖像URL的數組列表。

+1

在適配器的getView中調用GC不是個好主意 – Hruskozrout 2013-01-31 08:10:00

+0

看起來他可能已經獲得OOM異常,他需要重新採樣到位圖。google:// resample位圖getView – brux 2013-05-03 13:59:39