1

私は私を狂わせる問題を抱えています。

ビュー、ビットマップ、画面などから返される密度 (1.5) と幅/高さの値を使用して、UI を介して画像のサイズを正確に変更する 4 つの関数がありました。

これはSG IIでうまく機能しました。しかし、密度 0.75 を報告する HTC Wildfire では...一部の画像は画面上で視覚的に約 25% 小さすぎます...しかし、密度を 1.0 にオーバーライドすることにしたとき、それらの画像は突然収まり、他の画像は鮮明になりましたが、サイズが小さくなりました正しく...そしてそれは私を狂わせています...

私はリンゴとナシ (ピクセルと DIP) を比較するいくつかの場所であると結論付けることしかできませんが、テストを読んだものと一致させることができないため、いくつかのことを 100% 確実にするために:

...

ここの下にピクセルを取得しますか?またはディップ?:

int bitmapWidth = bitmap.getWidth();

下にビットマップを含むイメージビューがあるとします。ピクセルまたは DIP?

int widthParent = view.getWidth();      

その下には実際にDIPがありますよね?

getContext().getResources().getDisplayMetrics().widthPixels;

...

動作していない私のコードは次のとおりです (このコードは、100% を取る必要がある場合に視覚的に 2/3 秒の幅を取るビットマップを提供しています) コメントを確認すると、ピクセル値は明らかに正しいですが、最終結果は正しくありません:

vto.addOnGlobalLayoutListener(
  new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      mainLogo.getViewTreeObserver().removeGlobalOnLayoutListener(this);                                                                 
      mainLogo.setScaleType(ImageView.ScaleType.CENTER_INSIDE); // mainLogo = ImageView
      SharedCode.sharedUtilScaleImage_Width(mainLogo, false);              
    }
  }                        
);                                   

// ...

public static void sharedUtilScaleImage_Width(ImageView view, boolean tryBackground)
  {
    Drawable drawing = null;
    boolean useBackground = false;         
    if (drawing == null) {    
      drawing = view.getDrawable();
    }          
    if (drawing == null) {    
      if (tryBackground) {
        drawing = view.getBackground();
        useBackground = true;
      }
    }      
    if (drawing == null) {
      return; 
    }        
    if (!(drawing instanceof BitmapDrawable)) {
      return; 
    }                      
    Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
    if (bitmap == null) {
      return;
    }
    //--                               
    int bitmapWidth = bitmap.getWidth(); // returns 770 (which is correct checking on disk)
    int bitmapHeight = bitmap.getHeight();                
    // float density = 1;
    // density = MicApp.getContext().getResources().getDisplayMetrics().density; // 1.5          
    float widthScreen = MicApp.getContext().getResources().getDisplayMetrics().widthPixels; // returns 480              
    int widthParent = view.getWidth(); // returns 480, should be same as screen      
    //--
    float xScale = ( (float) widthParent / (float) bitmapWidth); 
    Matrix matrix = new Matrix();
    matrix.postScale(xScale, xScale);
    //--
    Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true);
    int bitmapWidth2 = scaledBitmap.getWidth(); // 480
    int bitmapHeight2 = scaledBitmap.getHeight();      
    //--          
    BitmapDrawable result = new BitmapDrawable(scaledBitmap);          
    //--          
    if (useBackground) {
      LayoutParams layoutparams = new LayoutParams(bitmapWidth, bitmapHeight);
      view.setLayoutParams(layoutparams);
      view.setBackgroundDrawable(result);
    }
    else {
      view.setImageDrawable(result);
    }            
  }
4

1 に答える 1