1

線形レイアウトにイメージビューがあります。

イメージビューが保持するビットマップをスケーリングするようにしたいので、線形レイアウトで最大量のスペースを使用しますが、適切な画像スケールを維持します。

  public static void sharedUtilScaleImage(ImageView view)
  {
      Drawable drawing = view.getDrawable();
      //--
      Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
      int bitmapWidth = bitmap.getWidth();
      int bitmapHeight = bitmap.getHeight();
      int widthParent = view.getWidth();      
      int heightParent = view.getHeight();      
      //--
      float density = 1;
      if (true) {
        density = MicApp.getContext().getResources().getDisplayMetrics().density;
      }
      //--
      float xScale = ((float) widthParent * density) / bitmapWidth; 
      float yScale = ((float) heightParent * density) / bitmapHeight;
      float minScale = Math.min(xScale, yScale);  
      //-- 
      Matrix matrix = new Matrix();
      matrix.postScale(minScale, minScale);
      //--
      Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true);
      BitmapDrawable result = new BitmapDrawable(scaledBitmap);
      view.setImageDrawable(result);      
  }

参考までに、上記のコードのいくつかをここで見つけました: htttp://stackoverflow.com/questions/8114085/how-to-create-white-border-around-bitmap

ただし、上記は少し不可解です。

  • すべてのビットマップを drawable-hdpi に保存します
  • ビットマップ .getHeight/.getWidth は実際のピクセルを返します (密度が変更されたピクセルではありません)。
  • ただし、ビュー .getHeight / .getWidth は、電話での実際のピクセル使用量よりも小さいピクセルを返します。実際のピクセルを取得するには、それらに密度を掛ける必要があります。

返される値の違いはなぜですか?

ビットマップが実際のピクセル サイズを返すのが好きです。しかし、「res/drawable-nodpi」に配置する必要がある他の場所を読んだので、それは追加の矛盾のように思えますか?

参考までに、イメージビューにビットマップを配置するコードと、線形レイアウト内のイメージビューは次のようになります。

imageView.setImageResource(picIDs[position]);                       
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);        
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);        
imageView.setLayoutParams(lp);                
//--
linearLayoutInner.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
linearLayoutInner.addView(imageView);       
4

3 に答える 3

2

イメージビューを境界を自動調整するように設定したいようです: http://developer.android.com/reference/android/widget/ImageView.html#setAdjustViewBounds(boolean)とスケールタイプをFIT_CENTERに

Bitmap には getScaledWidth と getScaledHeight があり、調整された寸法が得られます (リソースからディスプレイ メトリックを渡します) ビューの getWidth と getHeight はサイズのピクセル値を与える必要がありますが、親にパディングがある場合、MATCH_PARENT / FILL_PARENT は親のサイズからパディング (またはマージン) を引いたもの。

于 2013-05-13T10:10:01.287 に答える
1

それを行うには複数の方法があります。

  1. レンダリング スクリプトを使用すると、画像が巨大な場合に非常に高速な出力が得られます
  2. Javaコードを使用 - 2のスケールでストリームを介して直接実行できます
  3. dpi の代わりにピクセル パーフェクトを取得するには、DisplayMetric を使用し、ピクセルと dpi 間の相互変換を取得してから、ビットマップ リファレンスに適用してスケーリングします。
于 2013-05-12T11:04:29.743 に答える