2012-07-28 26 views
13

हाय मैं वर्तमान में परीक्षण हूँ एंड्रॉयड coverflow मैं यूआरएल से छवियों को मिलता है और coverflow में प्रदर्शित करने की कोशिश की मैं सफलतापूर्वक छवियों को डाउनलोड किया है, लेकिन में डाल सकते बिटमैप यहाँ कोड है जो मैं करने की कोशिश की ...coverflow एंड्रॉयड: कैसे coverflow में एक यूआरएल से छवियों को प्राप्त करने के लिए

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[]>();

यहाँ मैं मान लेते हैं कि कुल आ छवियों AsyncTask में 10

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

+0

कोई भी पुनर्नवीनीकरण? लेकिन मेरी परियोजना में जो ठीक काम कर रहा है ... कृपया मुझे सुझाव दें –

+0

आप स्मृति त्रुटि से बाहर निकल सकते हैं, और यह आइटम की एक बड़ी सूची पर भी लग सकता है – Blundell

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))); 
     } 
    } 
} 

और यूआरएल और Constants.mIsFeaturedTrueImage.get (स्थिति) से लोड छवियों के लिए imageLoader क्लास का उपयोग चित्र URL की एक सरणी-सूची है।

+1

एडाप्टर के getView में जीसी को कॉल करना अच्छा विचार नहीं है – Hruskozrout

+0

ऐसा लगता है कि उसे ओओएम अपवाद मिल रहा है, उसे बिटमैप्स को दोहराने की जरूरत है ..google: // resample bitmap getView – brux

0

मैं इस समस्या को लागू करने के लिए एक डेमो लिखता हूं, मैं गैलरी प्रवाह और सार्वभौमिक छवि लोड को संयोजित करता हूं, आप इसे आजमा सकते हैं, धन्यवाद! डेमो आप इसे इस वेबसाइट से डाउनलोड कर सकते हैं: https://github.com/Jonguo/galleryflow