Подтвердить что ты не робот

Попытка получить размер изображения в ImageView

Я пытаюсь получить реальный размер изображения, отображаемого в представлении изображения. На самом деле мое изображение больше, чем экран, и изображение просматривает изображение, чтобы изменить его. Я ищу новый размер.

Я попытался переопределить метод onDraw ImageView в пользовательском представлении, но я не получаю правильную высоту и ширину...

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);
    }
}

Есть ли у вас какие-либо подсказки?

4b9b3361

Ответ 1

Ни один из ответов здесь фактически не отвечает на вопрос:

Из Bitmap любого размера, отображаемого ImageView, найдите фактические размеры отображаемого изображения в отличие от размеров поставляемого Bitmap.

А именно:

  • Использование ImageView.getDrawable().getInstrinsicWidth() и getIntrinsicHeight() приведет к возврату исходных измерений.
  • Получение Drawable через ImageView.getDrawable() и отбрасывание его на BitmapDrawable, затем с помощью BitmapDrawable.getBitmap().getWidth() и 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() - например. myImageView.getImageMatrix()

Ответ 2

Я продлил ответ 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;
}

Ответ 3

Я обнаружил, что WarrenFaith предложили использовать setAdjustViewBounds, но мне пришлось изменить ImageView_ layout/layout_height Image_width на '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()) соответствуют размеру изображения изображения.

Ответ 4

Попробуйте

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

Ответ 5

Я прохожу мимо, но надеюсь, что это все еще помогает Я исхожу из предположения, что вы говорите о растровых изображениях в вашем изображенииView

то, что вы хотите понять, - это разница между

bmpBack.getWidth() - > это дает вам размер вашего растрового изображения а также bmpBack.getScaledWidth(canvas); - > это даст вам размер растрового изображения, отображаемого на экране.

Я никогда не использовал ImageView, потому что относительный дисплей сводил меня с ума, поэтому, в конце концов, я просто переопределял onDraw и сделал свой холст очень похожим на opengl.

Я думаю, что это ваша проблема.

приветствия

Джейсон

Ответ 6

Вы можете использовать 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);

        }
    });

Ответ 7

попробуйте переопределить onMeasure(int widthMeasureSpec, int heightMeasureSpec) вместо onSizeChanged.

Ответ 8

Если вы правильно поняли, вам понадобится ваше измерение 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

Попробуйте загрузить свой ресурс, используя BitmapFactory.decodeResource(ресурсы res, int id, BitmapFactory.Options opts) с классом BitmapFactory.Options(), BitmapFactory.Options() имеет флаг, который называется "inJustDecodeBounds" и дает только размеры ресурсов.

Надеюсь, что это помогло.

Ответ 10

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

Я искал решение для установки размера представления изображения на масштабированное изображение, чтобы предотвратить пустое пространство сверху/снизу или влево/вправо (поскольку размер представления не изменяется в соответствии с масштабированным изображением).

То, что я нашел, чтобы сделать трюк, это использовать метод mImageView.setAdjustViewBounds(true);, который приводит к правильному размеру макета. У меня нет масштабированного размера изображения, но я получил результат, который я искал... просто, если кому-то это нужно...

Ответ 12

Я думаю, вам нужен размер изображения, видимый на экране, для этого вам просто нужно это сделать:

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

И взгляните на документацию по таким методам, как: getWidht(), getHeight(), getMeasuredWidth(), getMeasuredHeight() и т.д. Вы узнаете, что он делает, чтобы дать вам этот размер.

EDIT: Если вы хотите, чтобы фактические width и height изображения загружались в imageView. Вы можете изменить вызовы метода от getMeasuredWidth() до getIntrinsicWidth() и getMeasuredHeight() до getIntrinsicHeight() следующим образом:

  Drawable drawable = getDrawable();
  actualWidth = drawable.getIntrinsicWidth();
  actualHeight = drawable.getIntrinsicHeight();

Ответ 13

Просто можно использовать этот код (в действии):

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

В случае, если изображение достигает концов imageView.

Ответ 14

Как насчет ImageView.getBackground() или ImageView.getDrawable(), а затем Drawable.getBounds()?