2017-02-18 15 views
10

Bir görüntü, özellikle "centercrop" türü ölçeklendirir, android ne olduğunu öğrenmek için çalışıyorum. Bir cevap bulmak için ImageView kaynak kodunu aradım ve here'u buldum.Imageview ölçekleme yöntemi "centercrop" kodu olarak

Yani ne denedim bu kodu şöyledir:

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

Ama bu bana aynı sonucu vermiyor. Neyi yanlış yapıyorum ?

İşte bir örnek:

Orijinal resim

enter image description here

Orjinal ImageView Centercrop

enter image description here

çalıştı Kod

enter image description here

Düzenleme: ImageView

<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> 

Yani benim ImageView XML tam ekran haline edilmektedir. Bu yüzden, onu işlemek için screenSize kullanıyorum. Ben o

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

Detaylı Açıklama uyguluyorum nasıl

Kodu: Im sadece ImageView.setScaleType(ScaleType.CENTER_CROP) aynı etkiyi almaya çalışırken. Bu yüzden kodum orijinal setScaleType yöntemiyle aynı şeyi yapmalıdır. Neden kod olarak ihtiyacım var? Çünkü benim durumumda ImageView'ımın drawingcache'ını alamıyorum ama &'u bir şekilde düzenlemem gerekiyor.

+0

Mesaj kodu? ImageView'da nasıl uyguluyorsunuz? –

+0

1) Çekilebilir orijinalin değiştirilmiş olabileceği 'ImageView' bitmap'i alıyorsunuz; 2) Hedef görünümün boyutu yerine ekranın boyutunu kullanıyorsunuz; 3) "scaleType =" matrix "' i kullanmaktan çok ölçeklenmiş bir bitmap oluşturuyorsunuz. Neyi başarmaya çalıştığınızı anlamak için daha fazla kod görmem gerekiyor, ancak bu basit bir düzeltme olmalı. Hedef görünümüne sahip XML düzeni ve çözümlemeye çalıştığınız kesin sorunun biraz daha ayrıntılı bir açıklamasıyla birlikte aktivitenizin kodunu da gönderin. –

+0

Gönderiyi bir kod ve sorunumun daha iyi bir açıklamasıyla düzenledim. Umarım bu sefer anlamaya açıktır. Yardımınız için teşekkürler. –

cevap

1

Kaynağından uyarlandım. Sizinle nasıl çalışacağınız, Matrix'e nasıl geri döndüğünüzü değiştirirsiniz. Sonra

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

Ve

kullanın: komple çekilebilir için

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