2017-02-18 9 views
10

画像を拡大縮小するときにアンドロイドが何をしているかを調べようとしています。具体的には "centercrop"タイプです。答えを見つけるために、私はImageViewのソースコードを検索し、hereを見つけました。画像ビューのスケーリング方法 "centercrop" as 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; 
} 

しかし、それは私に同じ結果を与えていません。私は間違って何をしていますか?

相続人例:

オリジナルピクチャー

enter image description here

Orginal ImageViewのCentercrop

enter image description here

しようとしたコード

enter image description here

編集: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> 

だから私のImageViewのの XMLをfullscreenedされます。それはなぜscreenSizeを使って処理しているのですか?私はそれを

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

詳細な説明を適用していますか

コード: イムは、ちょうどImageView.setScaleType(ScaleType.CENTER_CROP)と同じ効果を取得しようとしています。だから私のコードは元のsetScaleTypeメソッドのように同じことをする必要があります。なぜ私はそれをコードとして必要としますか?私の状況では私のImageViewのdrawingcacheを取得することはできませんが、私は&何とかそれを編集する必要があります。

+0

は、完全な描画可能のコードを投稿しますか?あなたはImageViewでそれをどのように適用していますか? –

+0

1)Drawableが元のものから変更されている可能性のある「ImageView」からビットマップを取得しています。 2)ターゲットビューのサイズの代わりに画面のサイズを使用しています。 3)scaleType = "matrix"を使用するのではなく、スケーリングされたビットマップを作成しています。あなたが達成しようとしていることを理解するためにもっとコードを見る必要がありますが、これは簡単な修正でなければなりません。解決しようとしている正確な問題の詳細な説明と一緒に、ターゲット・ビューを持つXMLレイアウトとともに活動のコードを投稿してください。 –

+0

私はいくつかのコードと私の問題のより良い説明と私のポストを編集しました。今度は理解してもらいたいと思っています。あなたの助けをありがとう –

答えて

1

私はソースから適合しました。 Matrixへのリターンを適用する方法を変更しても動作します。

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

そして使用:

Matrix bluredBoxBackground = buildBluredBoxBackground(); 
imageViewBluredBox.setImageMatrix(bluredBoxBackground)); 
imageViewBluredBox.invalidate(); 
関連する問題