画像ビューに表示される画像の実際のサイズを取得しようとしています。実際、私の画像は画面よりも大きく、imageviewはそれを表示するために画像のサイズを変更しています。この新しいサイズを探しています。
カスタムビューでImageViewのonDrawメソッドをオーバーライドしようとしましたが、正しい高さと幅が得られません...
public class LandImageView extends ImageView
{
public LandImageView( Context context )
{
super( context );
}
public LandImageView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public LandImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onDraw( Canvas canvas )
{
super.onDraw( canvas );
int test = this.getWidth();
int test2 = this.getHeight();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
}
}
手がかりはありますか?
ここの答えはどれも実際に質問に答えません:
Bitmap
で表示される任意のサイズのImageView
から、寸法ではなく表示される画像の実際の寸法を見つけます。提供されたBitmap
。
すなわち:
ImageView.getDrawable().getInstrinsicWidth()
とgetIntrinsicHeight()
を使用すると、両方とも元の寸法が返されます。Drawable
をImageView.getDrawable()
から取得してBitmapDrawable
にキャストし、BitmapDrawable.getBitmap().getWidth()
およびgetHeight()
を使用しても元の画像が返されます。およびその寸法。表示された画像の実際の寸法を取得する唯一の方法は、画像を表示どおりに表示するために使用される変換Matrix
を抽出して使用することです。これは測定段階の後に行う必要があり、ここの例は、カスタムOverride
のImageView
of onMeasure()
で呼び出されることを示しています。
_public class SizeAwareImageView extends ImageView {
public SizeAwareImageView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// Get image matrix values and place them in an array
float[] f = new float[9];
getImageMatrix().getValues(f);
// Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
final float scaleX = f[Matrix.MSCALE_X];
final float scaleY = f[Matrix.MSCALE_Y];
// Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
final Drawable d = getDrawable();
final int origW = d.getIntrinsicWidth();
final int origH = d.getIntrinsicHeight();
// Calculate the actual dimensions
final int actW = Math.round(origW * scaleX);
final int actH = Math.round(origH * scaleY);
Log.e("DBG", "["+origW+","+origH+"] -> ["+actW+","+actH+"] & scales: x="+scaleX+" y="+scaleY);
}
}
_
注:一般的なコードから画像変換Matrix
を取得するには(Activity
のように)、関数はImageView.getImageMatrix()
です。 myImageView.getImageMatrix()
B Tの答えを拡張して静的メソッドを生成し、ImageViewに画像の左と上の位置を含めました:
/**
* Returns the bitmap position inside an imageView.
* @param imageView source ImageView
* @return 0: left, 1: top, 2: width, 3: height
*/
public static int[] getBitmapPositionInsideImageView(ImageView imageView) {
int[] ret = new int[4];
if (imageView == null || imageView.getDrawable() == null)
return ret;
// Get image dimensions
// Get image matrix values and place them in an array
float[] f = new float[9];
imageView.getImageMatrix().getValues(f);
// Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
final float scaleX = f[Matrix.MSCALE_X];
final float scaleY = f[Matrix.MSCALE_Y];
// Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
final Drawable d = imageView.getDrawable();
final int origW = d.getIntrinsicWidth();
final int origH = d.getIntrinsicHeight();
// Calculate the actual dimensions
final int actW = Math.round(origW * scaleX);
final int actH = Math.round(origH * scaleY);
ret[2] = actW;
ret[3] = actH;
// Get image position
// We assume that the image is centered into ImageView
int imgViewW = imageView.getWidth();
int imgViewH = imageView.getHeight();
int top = (int) (imgViewH - actH)/2;
int left = (int) (imgViewW - actW)/2;
ret[0] = left;
ret[1] = top;
return ret;
}
WarrenFaithのsetAdjustViewBoundsの使用に関する提案は機能しましたが、ImageViewのlayout_width/layout_heightを 'wrap_content'に変更する必要がありました( 'match_parent'ではsetAdjustViewBoundsは何もしませんでした)。私が欲しかった高さ/幅/重力の挙動を得るために、FrameLayoutでImageViewをラップしなければなりませんでした:
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
>
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:scaleType="fitCenter"
Android:adjustViewBounds="true"
/>
</FrameLayout>
これを行った後、ImageViewの寸法(getWidth()およびgetHeight()によって返される)は、画像の表示サイズと一致しました。
試して
ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()
私はただ通り過ぎていますが、それがまだあなたがimageViewのビットマップについて話しているという仮定の下で行くのに役立つことを願っています
理解したいのは
bmpBack.getWidth()
->ビットマップのサイズとbmpBack.getScaledWidth(canvas)
; ->これにより、画面に表示されるビットマップのサイズがわかります。
ImageViewを使用したことはありませんでした。相対的なディスプレイが私を怒らせていたので、最終的にはonDrawをオーバーライドし、openglと非常によく似たキャンバスを作成しました。
これがあなたの問題だと思う
乾杯
ジェイソン
ImageviewのviewtreeobserverとaddonDrawListenerを使用できます。
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
@Override
public void onDraw() {
float[] f = new float[9];
imageView.getImageMatrix().getValues(f);
// Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
final float scaleX = f[Matrix.MSCALE_X];
final float scaleY = f[Matrix.MSCALE_Y];
// Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
final Drawable d = imageView. getDrawable();
final int origW = d.getIntrinsicWidth();
final int origH = d.getIntrinsicHeight();
// Calculate the actual dimensions
final int actW = Math.round(origW * scaleX);
final int actH = Math.round(origH * scaleY);
}
});
単にこのコードを使用することができます(アクティビティ中):
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
final ImageView imageView = findViewById(R.id.imageView);
int width = imageView.getWidth(), height = imageView.getHeight();
}
画像がimageViewの両端に達した場合
画面に表示される画像のサイズが必要だと思います。そのためには、これを行うだけです。
_@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
initialWidth = this.getMeasuredWidth();
initialHeight = this.getMeasuredHeight();
}
_
そして、次のようなメソッドのドキュメントを見てください:getWidht()
、getHeight()
、getMeasuredWidth()
、getMeasuredHeight()
など。それがあなたにそのサイズを与えるために何をするかを知るために。
編集:実際のwidth
とheight
にロードされる画像のimageView
が必要な場合。次のように、メソッド呼び出しをgetMeasuredWidth()
からgetIntrinsicWidth()
に、getMeasuredHeight()
からgetIntrinsicHeight()
に変更できます。
_ Drawable drawable = getDrawable();
actualWidth = drawable.getIntrinsicWidth();
actualHeight = drawable.getIntrinsicHeight();
_
私は、画像ビューの寸法をスケーリングされた画像に設定して、上下または左右の空きスペースを防ぐソリューションを探していました(ビューの寸法がスケーリングされた画像に合わせて変更されないため)。
私がそのトリックを見つけたのは、メソッドmImageView.setAdjustViewBounds(true);
を使用して、正しいレイアウトディメンションを作成することでした。私はスケーリングされた画像の寸法を持っていませんが、私が探していた結果を得ました...誰かがそれを必要とするだけで...
public class images extends Activity {
ImageView i1;
LinearLayout l1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
i1=(ImageView)findViewById(R.id.iv);
l1 = new LinearLayout(this);
ImageView i = new ImageView(this);
ImageView i1 = new ImageView(this);
i.setImageResource(R.drawable. imagename.........);
l1.addView(i);
l1.addView(i1);
setContentView(l1);
}
}
最初にurリソースフォルダーに画像を追加します。.....xmlファイルに画像ビューを作成します。
BitmapFactory.decodeResource(Resources res、int id、BitmapFactory.Options opts) を使用して、BitmapFactory.Options()クラスでリソースをロードしてみてください。 BitmapFactory.Options()
には「inJustDecodeBounds」と呼ばれるフラグがあり、リソースのディメンションのみを提供します。
お役に立てば幸いです。
onSizeChangedの代わりにonMeasure(int widthMeasureSpec, int heightMeasureSpec)
をオーバーライドしてください。
画像が適切に拡大縮小されるためには、ImageViewの寸法が必要です。これをカスタムクラスで行い、onMeasure()
呼び出しをオーバーライドして幅と高さを取得しました。
class LandImageView extends ImageView{
public LandImageView (Context context, AttributeSet attrs) {
super (context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int width = MeasureSpec.getSize(widthMeasureSpec);
final int height = MeasureSpec.getSize(heightMeasureSpec);
Log.v("", String.format("w %d h %d", width, height));
// width and height are the dimensions for your image
// you should remember the values to scale your image later on
this.setMeasuredDimension(width, height );
}}
OnMeasureでは、ビューに合うように画像の幅と高さを取得します。
次のように、レイアウトでLandImageViewを使用できます。
<my.package.LandImageView ... >