2017-02-18 4 views
10

Ich versuche herauszufinden, was Android macht, wenn es ein Bild skaliert, insbesondere die "Centerkrop" -Typ. Um eine Antwort zu finden, suchte ich den ImageView Quellcode und finde ihn here.Imageview Skalierungsmethode "Centercrop" als Code

Also, was ich versuchte, ist dieser Code:

public Bitmap buildBluredBoxBackground() { 
     int [] screenSize = Utilities.getScreenSize(mainActivityContext); //screensize[0] = x and [1] is y 
     Matrix mDrawMatrix = new Matrix(); 

     Bitmap bitmap = ((BitmapDrawable)fullscreenViewHolder.imageViewArt.getDrawable()).getBitmap(); 

     float scale; 
     float dx = 0, dy = 0; 

     if (bitmap.getWidth() * screenSize[1] > screenSize[0] * bitmap.getHeight()) { 
      scale = (float) screenSize[1]/(float) bitmap.getHeight(); 
      dx = (screenSize[0] - bitmap.getWidth() * scale) * 0.5f; 
     } else { 
      scale = (float) screenSize[0]/(float) bitmap.getWidth(); 
      dy = (screenSize[1] - bitmap.getHeight() * scale) * 0.5f; 
     } 

     mDrawMatrix.setScale(scale, scale); 
     mDrawMatrix.postTranslate(Math.round(dx), Math.round(dy)); 

     result = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),mDrawMatrix,true); 

     ... //Some processing work 

     return result; 
} 

Aber es ist nicht mir das gleiche Ergebnis. Was mache ich falsch ?

Heres ein Beispiel:

Original-Bild

enter image description here

Orginal Image Centercrop

enter image description here

Versuchte-Code

enter image description here

Edit: XML des Image

<FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true"> 

      <ImageView 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:id="@+id/imageViewFullscreenArt"/> 
      <ImageView 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:id="@+id/imageViewFullscreenArtBluredBox"/> 
</FrameLayout> 

Also mein Image ist fullscreened. Deshalb verwende ich die screenSize, um sie zu verarbeiten.

-Code, wie ich es bin Anwendung

Bitmap bluredBoxBackground = buildBluredBoxBackground(); 
imageViewBluredBox.setImageDrawable(new BitmapDrawable(getResources(),bluredBoxBackground)); 

Ausführliche Beschreibung: Im Versuch, nur die gleiche Wirkung wie ImageView.setScaleType(ScaleType.CENTER_CROP) zu bekommen. Also sollte mein Code das gleiche wie die ursprüngliche setScaleType Methode tun. Warum brauche ich es als Code? Weil ich in meiner Situation den Zeichencache meiner ImageView nicht bekommen kann, aber ich muss & bearbeiten irgendwie bearbeiten.

+0

Beitrag, den Code für die vollständige ziehbar? Wie wenden Sie es auf ImageView an? –

+0

1) Sie erhalten die Bitmap aus dem 'ImageView', wo das Zeichen möglicherweise vom Original geändert wurde; 2) Sie verwenden die Größe des Bildschirms anstelle der Größe der Zielansicht; 3) Sie erstellen eine skalierte Bitmap, anstatt nur 'scaleType =" matrix "' zu verwenden. Ich muss mehr Code sehen, um zu verstehen, was Sie erreichen wollen, aber das sollte eine einfache Lösung sein. Veröffentlichen Sie den Code für Ihre Aktivität zusammen mit dem XML-Layout mit der Zielansicht und einer etwas detaillierteren Beschreibung des genauen Problems, das Sie lösen möchten. –

+0

Ich habe meinen Beitrag mit Code und besserer Beschreibung meines Problems bearbeitet. Hoffe dieses Mal ist es klar zu verstehen. Danke für deine Hilfe –

Antwort

1

Ich habe von der Quelle angepasst. Es wird mit Ihnen arbeiten ändern Sie die Rückkehr zu Matrix, wie Sie anwenden.

public Matrix buildBluredBoxBackground() { 

    int dwidth = imageView.getDrawable().getIntrinsicWidth(); 
    int dheight = imageView.getDrawable().getIntrinsicHeight(); 

    int vwidth = imageView.getWidth() - imageView.getPaddingLeft() - imageView.getPaddingRight(); 
    int vheight = imageView.getHeight() - imageView.getPaddingTop() - imageView.getPaddingBottom(); 

    Matrix mDrawMatrix = imageView.getImageMatrix(); 
    Bitmap bMap = imageView.getDrawingCache(); 

    float scale; 
    float dx = 0, dy = 0; 

    if (dwidth * vheight > vwidth * dheight) { 
     scale = (float) vheight/(float) dheight; 
     dx = (vwidth - dwidth * scale) * 0.5f; 
    } else { 
     scale = (float) vwidth/(float) dwidth; 
     dy = (vheight - dheight * scale) * 0.5f; 
    } 
    mDrawMatrix.setScale(scale, scale); 
    mDrawMatrix.postTranslate(Math.round(dx), Math.round(dy)); 
    return mDrawMatrix; 
} 

Und dann verwenden:

Matrix bluredBoxBackground = buildBluredBoxBackground(); 
imageViewBluredBox.setImageMatrix(bluredBoxBackground)); 
imageViewBluredBox.invalidate(); 
Verwandte Themen