5

簡単な答えがうまくいかない簡単な質問。私はビットマップを持っており、onDraw() メソッド内のさまざまな DPI 画面のシステムによってディスプレイに合わせてその寸法を取得したいと考えています。bitmap.width() は、スケーリングされていない幅を正常に返します。ただし、bitmap.getScaledWidth() はゼロを返します。getScaledWidth(canvas) と getScaledWidth(canvas.getDensity()) を試しましたが、どちらも 0 を返します。実際、canvas.getDensity() はゼロを返すため、手動で計算することもできません。

私は何を間違っていますか?

もう少し詳しく。カスタムビューを使用しています。ビットマップはクラスで宣言され、コンストラクターにロードされます。

編集:

私はそれを使用して見つけました:

        DisplayMetrics metrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(metrics);

bitmap.getScaledHeight(metrics) は、bitmap.getHeight() と同じ値を返します。

bitmap.getWidth() は、スケーリングされた後に常駐ビットマップの寸法を返すように見えます。つまり、ビットマップの元の幅を取得する明らかな方法はありません。

4

2 に答える 2

5

Canvas クラスには、 drawBitmap() 関数のオーバーロードが多数あります。それらの 1 つは、非常に快適なインターフェイスを介してビットマップをスケーリング/カットすることを可能にします。

public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)

どこ

  • Bitmap bitmap - 描画したいビットマップです
  • Rect src - ビットマップからのソース rect。null でない場合は、ビットマップから (src のサイズと位置で) 部分を切り取ります。
  • RectF dst - この Rect は Rectangle を表し、Bitmap が収まります。
  • ペイントペイント- オプションのペイント

そして今、例!たとえば、ビットマップの幅1/2に縮小し、高さを元の2倍に増やしたいとします。

float startX = 0; //the left
float startY = 0; //and top corner (place it wherever you want)
float endX = startX + bitmap.getWidth() * 0.5f; //right
float endY = startY + bitmap.getHeight() * 2.0f; //and bottom corner

canvas.drawBitmap(bitmap, null, new RectF(startX, startY, endX, endY), null);

アップデート

あなたのコメントを読んだ後、あなたが達成しようとしていることはよくわかりませんが、始めるための追加情報を次に示します。

Bitmap をメモリにロードせずに元のサイズを取得します。

BitmapFactory.Options options = new BitmapFactory.Options();
bitmapOptions.inJustDecodeBounds = true; // bitmap wont be loaded into the memory

//won't load the Bitmap, but the options will contain the required information.
BitmapFactory.decodeStream(inputStream, null, options);
/*or*/ BitmapFactory.decodeFile(pathName, options);

int originalWidth = bitmapOptions.outWidth;
int originalHeight = bitmapOptions.outHeight;

別の実際の (スケーリングされBitmapた) 、またはImageViewオリジナルと比較したいものがある場合は、これを使用できます (幅と高さを取得するには、 and を使用getWidth()しますgetHeight())。

/*Get these values*/
int originalWidth, originalHeight, scaledWidth, scaledHeight; 

float scaleWidthRatio = (float)scaledWidth / originalWidth;
float scaleHeightRatio = (float)scaledHeight / originalHeight;
于 2012-08-29T22:59:54.997 に答える
1

これはどう?ビットマップを自分でスケーリングします。:-)

protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);
        Drawable drawable = getDrawable();
        if(drawable==null)
            Log.d("onDraw()","getDrawable returns null");

        Bitmap  fullSizeBitmap,scaledBitmap = null,roundBitmap = null;

        fullSizeBitmap = ((BitmapDrawable)drawable).getBitmap() ;

        //get width & height of ImageView
        int scaledWidth = getMeasuredWidth();
        int scaledHeight = getMeasuredHeight();

        //bitmap, which will receive the reference to a bitmap scaled to the bounds of the ImageView.
        if(fullSizeBitmap!=null)
        scaledBitmap= getScaledBitmap(fullSizeBitmap,scaledWidth,scaledHeight);

        //Now, draw the bitmap on the canvas
        if(roundBitmap!=null)
           canvas.drawBitmap(roundBitmap, 0,0 , null);
}
于 2012-08-31T15:15:10.083 に答える