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

时间:2010-10-04 12:31:19

标签: android imageview ondraw

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

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

你有线索吗?

14 个答案:

答案 0 :(得分:98)

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

Bitmap显示的任何尺寸的ImageView,找到显示图片的实际尺寸,而不是提供的{{尺寸> { 1}}。

即:

  • 使用BitmapImageView.getDrawable().getInstrinsicWidth()都会返回原始尺寸。
  • 获取getIntrinsicHeight()Drawable并将其投放到ImageView.getDrawable(),然后使用BitmapDrawableBitmapDrawable.getBitmap().getWidth()也会返回原始图片及其尺寸。< / LI>

获取所显示图像的实际尺寸的唯一方法是提取并使用用于显示图像的转换getHeight()。这必须在测量阶段之后完成,此处的示例显示在Matrix Override中调用自定义onMeasure()

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()

答案 1 :(得分:26)

我扩展了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;
}

答案 2 :(得分:9)

我发现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()返回)与图像的显示尺寸相匹配。

答案 3 :(得分:6)

尝试

ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()

答案 4 :(得分:1)

我只是路过,但希望它仍然有帮助 我假设您在imageView中讨论位图

你想要了解的是

之间的区别

bmpBack.getWidth() - &GT;这为您提供了位图的大小 和 bmpBack.getScaledWidth(canvas); - &GT;这将为您提供屏幕上显示的位图大小。

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

我认为这是你的问题

欢呼

杰森

答案 5 :(得分:1)

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

@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();

答案 6 :(得分:1)

您可以使用imageview的viewtreeobserver和addonDrawListener。

System.loadLibrary("lib2");

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果我找到你,你需要你的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 ... >

答案 9 :(得分:0)

尝试使用BitmapFactory.decodeResource (Resources res, int id, BitmapFactory.Options opts)和BitmapFactory.Options()类加载资源。 BitmapFactory.Options()有一个名为“inJustDecodeBounds”的标志,仅提供资源维度。

希望有所帮助。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

仅可在活动中使用此代码:

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

如果图片到达了imageView的末端。

答案 13 :(得分:-1)

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