尝试在ImageView中获取图像的显示大小

android imageview ondraw

37572 观看

14回复

226 作者的声誉

我试图获得图像视图中显示的图像的实际大小。实际上我的图像比屏幕大,图像视图正在调整图像大小以显示它。我正在寻找这个新尺寸。

我试图在自定义视图中覆盖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);
    }
}

你有线索吗?

作者: Guillaume Ménant 的来源 发布者: 2010 年 10 月 4 日

回应 14


0

9675 作者的声誉

尝试覆盖onMeasure(int widthMeasureSpec, int heightMeasureSpec)而不是onSizeChanged。

作者: bhups 发布者: 2010 年 10 月 4 日

-1

9471 作者的声誉

ImageView.getBackground()或ImageView.getDrawable(),然后是Drawable.getBounds()?

作者: Ryan Reeves 发布者: 2010 年 10 月 21 日

6

76755 作者的声誉

尝试

ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()
作者: Peter Knego 发布者: 2010 年 10 月 23 日

0

17744 作者的声誉

如果我找到你,你需要你的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 ... >
作者: thumbmunkeys 发布者: 2010 年 10 月 24 日

0

310 作者的声誉

尝试使用BitmapFactory.decodeResource(Resources res,int id,BitmapFactory.Options opts)和BitmapFactory.Options()类加载资源。BitmapFactory.Options()有一个标志,称为“inJustDecodeBounds”,只给出资源维度。

希望有所帮助。

作者: Uri May 发布者: 2010 年 10 月 24 日

1

13858 作者的声誉

我只是路过,但希望它仍然有助于我在你的imageView中谈论位图的假设

你想要了解的是它们之间的区别

bmpBack.getWidth() - >这给你的位图大小 bmpBack.getScaledWidth(canvas); - >这将显示屏幕上显示的位图大小。

我从来没有使用过ImageView,因为相对显示让我很生气,所以最后我只是覆盖onDraw并使我的画布与opengl非常相似。

我想这是你的问题

干杯

贾森

作者: Jason Rogers 发布者: 2010 年 10 月 26 日

0

705 作者的声誉

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文件中创建图像视图....

作者: user493244 发布者: 2010 年 11 月 10 日

0

51053 作者的声誉

我正在寻找一种解决方案,将图像视图的尺寸设置为缩放图像,以防止顶部/底部或左/右空白空间(因为视图的尺寸不会改变以适合缩放图像)。

我发现做的诀窍是使用mImageView.setAdjustViewBounds(true);导致正确布局尺寸的方法。我没有缩放的图像尺寸,但我得到了我正在寻找的结果......只要有人需要它...

作者: WarrenFaith 发布者: 2011 年 3 月 9 日

9

1264 作者的声誉

我发现WarrenFaith建议使用setAdjustViewBounds,但我不得不将ImageView的layout_width / layout_height更改为'wrap_content'(使用'match_parent',setAdjustViewBounds什么也没做)。为了获得我想要的高度/宽度/重力行为,我必须将ImageView包装在FrameLayout中:

<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()返回)与图像的显示大小相匹配。

作者: Squatting Bear 发布者: 2013 年 3 月 7 日

98

4151 作者的声誉

这里的答案都没有实际回答这个问题:

从a Bitmap显示的任何尺寸中ImageView,找到所显示图像实际尺寸,而不是所提供的尺寸Bitmap

即:

  • 使用ImageView.getDrawable().getInstrinsicWidth()getIntrinsicHeight()将返回原始尺寸。
  • 获得Drawable通过ImageView.getDrawable()并强制转换为BitmapDrawable,然后用BitmapDrawable.getBitmap().getWidth()getHeight()也返回原来的图像和它的尺寸。

获得所显示图像的实际尺寸的唯一方法是提取并使用Matrix用于显示图像的变换。这必须在测量阶段之后进行,这里的例子显示了它在叫OverrideonMeasure()自定义ImageView

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 发布者: 2013 年 3 月 21 日

26

1103 作者的声誉

我扩展了BT的答案,从中生成静态方法,并将图像左侧和顶部位置包含在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;
}
作者: chteuchteu 发布者: 2014 年 11 月 14 日

0

111 作者的声誉

我认为你需要屏幕上可见的图像大小,因为你只需要这样做:

@Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        initialWidth = this.getMeasuredWidth();
        initialHeight = this.getMeasuredHeight();
    }

并做看一看的方法,如文档:getWidht()getHeight()getMeasuredWidth()getMeasuredHeight(),等你会了解它做什么给你的大小。

编辑:如果你想要实际widthheight图像被加载到imageView。您可能要在方法调用从改变getMeasuredWidth()getIntrinsicWidth(),并getMeasuredHeight()getIntrinsicHeight()这样的:

  Drawable drawable = getDrawable();
  actualWidth = drawable.getIntrinsicWidth();
  actualHeight = drawable.getIntrinsicHeight();
作者: Ashutosh Tiwari 发布者: 2017 年 12 月 25 日

1

68 作者的声誉

您可以使用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);

        }
    });
作者: Satpal Yadav 发布者: 2018 年 6 月 21 日

0

223 作者的声誉

只需使用此代码(在活动中):

@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
    super.onWindowFocusChanged(hasWindowFocus);
    final ImageView imageView = findViewById(R.id.imageView);
    int width = imageView.getWidth(), height = imageView.getHeight();
}

如果图片到达imageView的末尾。

作者: IQ.feature 发布者: 2019 年 7 月 25 日
32x32