2011-04-18 3 views
4

Je souhaite avoir une galerie android qui hébergera des images de différents formats. ce que je voudrais, c'est quelque chose comme CENTER_CROP pour les images de la galerie. Cependant, lorsque je définis le type d'échelle de l'image, les images dépassent la limite de l'image de la galerie.Galerie android avec des proportions arbitraires

bien sûr, FIT_XY donne des images écrasées/aplaties. CENTRE produit un espace noir horizontal ou vertical à l'intérieur de la bordure de l'image de la galerie.

des idées pour y parvenir? chaque exemple que je peux trouver utilise FIT_XY avec des images de taille fixe. Je suppose que je pourrais recadrer les images moi-même mais je préfère ne pas.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView iv = (ImageView) convertView; 
    if (iv == null) { 
     iv = new ImageView(context); 
     iv.setScaleType(ImageView.ScaleType.FIT_XY); 
     iv.setBackgroundResource(galleryItemBackground); 
     iv.setLayoutParams(new Gallery.LayoutParams(200, 200)); 
    } 

    InputStream is; 
    try { 
     is = getInputStream(position); 
    } catch (IOException ioe) { 
     // TODO? 
     throw new RuntimeException(ioe); 
    } 
    Bitmap bm = BitmapFactory.decodeStream(is); 
    iv.setImageBitmap(bm); 



    /* 
    * if (bitmaps[position] != null) { bitmaps[position].recycle(); 
    * bitmaps[position] = null; } bitmaps[position] = bm; 
    */ 

    return iv; 
} 

Répondre

0

puisque personne d'autre réponse, je fini par couper juste le bitmap à un carré moi-même, comme,

Bitmap bm = BitmapFactory.decodeStream(is); 

// make it square 

int w = bm.getWidth(); 
int h = bm.getHeight(); 
if (w > h) { 
    // trim width 
    bm = Bitmap.createBitmap(bm, (w - h)/2, 0, h, h); 
} else { 
    bm = Bitmap.createBitmap(bm, 0, (h - w)/2, w, w); 
} 
+0

Cette solution n'était pas valide pour moi car j'avais besoin d'une image entière pour pouvoir la faire défiler dans le conteneur ImageView. –

0

J'ai eu le même problème que vous et regarder la documentation scaleType je l'ai trouvé pourrait être fait en utilisant ScaleType.MATRIX, par exemple:

int w = 1000; 
    int h = 1000; 

    Paint p = new Paint(); 
    p.setShader(new LinearGradient(0, 0, w, h, Color.BLACK, Color.RED, Shader.TileMode.CLAMP)); 

    Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    Canvas g = new Canvas(bmp);  
    g.drawRect(new Rect(0, 0, w, h), p); 

    ImageView i3 = new ImageView(context); 
    i3.setImageBitmap(bmp); 
    i3.setScaleType(ScaleType.MATRIX); 

    int viewWidth = 300; 
    int viewHeight = 300; 

    Matrix matrix = new Matrix(); 
    matrix.postScale(bmp.getWidth()/viewWidth, bmp.getHeight()/viewHeight, bmp.getWidth()/2, bmp.getHeight()/2); 
    i3.setImageMatrix(matrix); 

    LayoutParams lp2 = new LayoutParams(viewWidth, viewHeight); 
    lp2.leftMargin = 100; 
    lp2.topMargin = 400; 
    lp2.gravity = 0; 

    this.addView(i3, lp2); 

Cette solution complique les choses un peu trop bien. Si vous souhaitez faire défiler et agrandir l'image, vous devez également utiliser la mise à l'échelle de la matrice. Donc, je serais intéressé à connaître une alternative possible.

0

Pour ce genre de tâches, j'utilise cette classe simple. Il adapte la hauteur ou la largeur en redimensionnant l'image correctement (cela dépend de quelle est la plus petite dimension). Après cette opération, il centre l'image dans les limites ImageView.

public class FixedCenterCrop extends ImageView { 


    public FixedCenterCrop(Context context) { 
     super(context); 
     setScaleType(ScaleType.MATRIX); 
    } 

    public FixedCenterCrop(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setScaleType(ScaleType.MATRIX); 
    } 

    public FixedCenterCrop(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     setScaleType(ScaleType.MATRIX); 
    } 


    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 
     recomputeImgMatrix(); 
    } 

    @Override 
    protected boolean setFrame(int l, int t, int r, int b) { 
     recomputeImgMatrix(); 
     return super.setFrame(l, t, r, b); 
    } 

    private void recomputeImgMatrix() { 
     final Matrix matrix = getImageMatrix(); 

     float scale; 
     final int viewWidth = getWidth() - getPaddingLeft() - getPaddingRight(); 
     final int viewHeight = getHeight() - getPaddingTop() - getPaddingBottom(); 
     final int drawableWidth = getDrawable().getIntrinsicWidth(); 
     final int drawableHeight = getDrawable().getIntrinsicHeight(); 

     if (drawableWidth * viewHeight > drawableHeight * viewWidth) { 
      scale = (float) viewHeight/(float) drawableHeight; 
     } else { 
      scale = (float) viewWidth/(float) drawableWidth; 
     } 

     matrix.setScale(scale, scale); 
     matrix.postTranslate((viewWidth - drawableWidth * scale)/2, (viewHeight - drawableHeight*scale)/2); 
     setImageMatrix(matrix); 
    } 
} 
Questions connexes