it-swarm.com.de

Der Versuch, die Anzeigegröße eines Bildes in einer ImageView abzurufen

Ich versuche, die tatsächliche Größe eines Bildes in einer Bildansicht anzuzeigen. Mein Bild ist tatsächlich größer als der Bildschirm, und die Bildansicht ändert das Bild, um es darzustellen. Ich suche nach dieser neuen Größe.

Ich habe versucht, die onDraw-Methode von ImageView in einer benutzerdefinierten Ansicht zu überschreiben, aber ich bekomme nicht die richtige Höhe und Breite.

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

Hast du irgendwelche Hinweise?

44

Keine der Antworten hier beantwortet tatsächlich die Frage:

Ermitteln Sie aus einem Bitmap beliebiger Größe, das von einem ImageView angezeigt wird, das tatsächliche Abmessungen des angezeigten Bildes im Gegensatz zu den Abmessungen des geliefert Bitmap.

Nämlich:

  • Bei Verwendung von ImageView.getDrawable().getInstrinsicWidth() und getIntrinsicHeight() werden beide die ursprünglichen Abmessungen zurückgegeben.
  • Wenn Sie Drawable durch ImageView.getDrawable() bringen und in BitmapDrawable umwandeln und dann BitmapDrawable.getBitmap().getWidth() und getHeight() verwenden, werden auch das Originalbild und seine Abmessungen zurückgegeben.

Die einzige Möglichkeit, die tatsächlichen Abmessungen des angezeigten Bildes zu ermitteln, besteht darin, die Transformation Matrix zu extrahieren und zu verwenden, mit der das Bild so angezeigt wird, wie es angezeigt wird. Dies muss nach der Messphase erfolgen und das Beispiel hier zeigt, dass es in einer Override von onMeasure() für eine benutzerdefinierte ImageView aufgerufen wird:

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

}  

Hinweis: Um die Bildtransformation Matrix aus dem Code im Allgemeinen (wie in Activity) zu erhalten, lautet die Funktion ImageView.getImageMatrix() - z. myImageView.getImageMatrix()

99
B T

Ich habe die Antwort von BT erweitert, um daraus eine statische Methode zu erstellen und die linken und oberen Positionen der Bilder in die ImageView aufzunehmen:

/**
 * 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;
}
26
chteuchteu

Ich fand, dass WarrenFaiths Vorschlag, setAdjustViewBounds zu verwenden, funktionierte, aber ich musste die layout_width/layout_height von ImageView in 'wrap_content' ändern (mit 'match_parent' hat setAdjustViewBounds nichts getan). Um das gewünschte Höhen-/Breiten-/Schwerkraftverhalten zu erhalten, musste ich die ImageView in ein FrameLayout packen:

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

Danach stimmten die Abmessungen von ImageView (wie von getWidth () und getHeight () zurückgegeben) mit der Anzeigegröße des Bildes überein.

9
Squatting Bear

Versuchen 

ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()
6
Peter Knego

Ich denke, Sie benötigen die Größe des Bildes, das auf dem Bildschirm sichtbar ist. Dazu müssen Sie einfach Folgendes tun:

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

Und werfen Sie einen Blick in die Dokumentation der Methoden wie: getWidht(), getHeight(), getMeasuredWidth(), getMeasuredHeight(), usw. Sie werden erfahren, was Sie tun müssen, um Ihnen diese Größe zu geben.

BEARBEITEN: Wenn Sie möchten, dass die width und height des Bildes in die imageView geladen werden. Möglicherweise möchten Sie die Methodenaufrufe von getMeasuredWidth() in getIntrinsicWidth() und getMeasuredHeight() in getIntrinsicHeight() wie folgt ändern:

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

Ich gehe gerade vorbei, hoffe aber, dass es immer noch hilft. Ich gehe davon aus, dass Sie in Ihrem imageView über Bitmaps sprechen

was Sie verstehen wollen, ist der Unterschied zwischen

bmpBack.getWidth()-> Damit erhalten Sie die Größe Ihrer Bitmap und bmpBack.getScaledWidth(canvas); -> Damit erhalten Sie die Größe der Bitmap, die auf dem Bildschirm angezeigt wird.

Ich habe ImageView nie verwendet, weil mich die relative Anzeige verrückt gemacht hat. Am Ende überschreibe ich einfach die onDraw und machte meine Leinwand sehr ähnlich wie opengl.

Ich denke das ist dein Problem

prost 

Jason

1
Jason Rogers

Sie können den viewtreeobserver und den addonDrawListener von imageview verwenden. 

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

        }
    });
1
Satpal Yadav

Einfach kann dieser Code verwendet werden (in Aktivität):

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

Falls das Bild das Ende der Bildansicht erreicht.

0
IQ.feature

Ich habe nach einer Lösung gesucht, um die Größe der Bildansicht auf das skalierte Bild festzulegen, um zu verhindern, dass Leerzeichen oben/unten oder links/rechts verwendet werden (da die Größe der Ansicht nicht an das skalierte Bild angepasst wird).

Was ich für den Trick gefunden habe, war die Methode mImageView.setAdjustViewBounds(true);, die zur korrekten Layout-Dimension führt. Ich habe nicht die skalierte Bildgröße, aber ich habe das Ergebnis gefunden, nach dem ich gesucht habe ... nur wenn jemand es braucht ...

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

fügen Sie zunächst die Bilder in den Ressourcenordner ....... ein und erstellen Sie in der XML-Datei eine Bildansicht ....

0
user493244

Laden Sie Ihre Ressource mit BitmapFactory.decodeResource (Ressourcen res, int id, BitmapFactory.Options-Optionen) mit der BitmapFactory.Options () -Klasse. BitmapFactory.Options() hat ein Flag mit dem Namen "inJustDecodeBounds" und gibt nur die Ressourcendimensionen an.

Hoffe das hat geholfen.

0
Uri May

versuchen Sie, onMeasure(int widthMeasureSpec, int heightMeasureSpec) anstelle von onSizeChanged zu überschreiben.

0
bhups

Wenn ich Sie richtig bekomme, benötigen Sie Ihre ImageView-Dimension, um Ihr Bild entsprechend zu skalieren. Ich habe dies mit einer benutzerdefinierten Klasse gemacht, in der ich den Aufruf von onMeasure() überschreibe, um Breite und Höhe zu erhalten. 

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

In onMeasure erhalten Sie die Breite und Höhe Ihres Bildes, so dass es zu Ihrer Ansicht passt.

Sie können die LandImageView in Ihrem Layout folgendermaßen verwenden:

<my.package.LandImageView ... >
0
thumbmunkeys