web-dev-qa-db-fra.com

Les vues getWidth () et getHeight () retournant 0

J'ai regardé les questions similaires et essayé leurs solutions mais cela n'a pas fonctionné pour moi. J'essaie de prendre la largeur d'une imageView, mais elle renvoie 0. Voici le code:

public class MainActivity extends Activity {
private ImageView image1;   
float centerX,centerY;
private ImageView image2;
private boolean isFirstImage = true;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.rotate);
    image1 = (ImageView) findViewById(R.id.ImageView01);
    image2 = (ImageView) findViewById(R.id.ImageView02);
    image2.setVisibility(View.GONE);

    if (isFirstImage) {
        applyRotation(0, 90);
        isFirstImage = !isFirstImage;
    }   
}   

private void applyRotation(float start, float end) {


            centerX=image1.getWidth()/2.0f;
    centerY=image1.getHeight()/2.0f;
    final Flip3dAnimation rotation =

    new Flip3dAnimation(start, end,centerX , centerY);
    rotation.setDuration(500);
    rotation.setFillAfter(true);
    rotation.setInterpolator(new AccelerateInterpolator());
    rotation.setAnimationListener(new DisplayNextView(isFirstImage, image1,
            image2));

    if (isFirstImage)
    {
        image1.startAnimation(rotation);
    } else {
        image2.startAnimation(rotation);
    }
}
}

Est-ce que quelqu'un peut m'aider avec ça? Merci

20
yrazlik

Vous devez utiliser la méthode onSizechanged () .

Ceci est appelé pendant la mise en page lorsque la taille de cette vue a changé

20
Kerry

Vous accédez soit à la largeur et à la hauteur d'ImageViews avant qu'elle ait été mesurée, ou après avoir défini sa visibilité sur GONE.

image2.setVisibility(View.GONE);

GetWidth () ou getHeight () renverra alors 0.,

Vous pouvez également consulter onWindowFocusChanged (), onSizeChanged () et onMeasure ():

 @Override
 public void onWindowFocusChanged(boolean focus) {
    super.onWindowFocusChanged(focus);
    // get the imageviews width and height here
 }
10
Philipp Jahoda

Vous devez utiliser: image1.getLayoutParams().width;

10
Incredible
public class GETImageView extends ImageView {

public GETImageView (Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    Drawable d = getDrawable();

    if (d != null) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}

ImageView n'a pas encore dessiné l'image, donc pas de retour de largeur ou de hauteur. Vous pouvez utiliser une sous-classe pour obtenir la largeur de la vue d'image.

Voici un lien qui vous propose d'autres méthodes simples:

Comment obtenir la largeur et la hauteur d'un Android.widget.ImageView?

Comment obtenir la largeur et la hauteur d'une vue d'image dans Android?

Android ImageView renvoie getWidth, getHeight zero

J'espère que cela vous aidera.

5
Sonny Ng

vous pouvez utiliser OnGlobalLayoutListener pour l'image ImageView1 afin d'obtenir la largeur et la hauteur exactes occupées par la vue dans la mise en page ... comme

image1 = (ImageView) findViewById(R.id.ImageView01);
        ViewTreeObserver viewTreeObserver = image1.getViewTreeObserver();
        viewTreeObserver
                .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        if (isFirstImage) {
                            applyRotation(0, 90);
                            isFirstImage = !isFirstImage;
                        } 
                        if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.JELLY_BEAN)
                            image1.getViewTreeObserver()
                                    .removeOnGlobalLayoutListener(this);
                        else
                            image1.getViewTreeObserver()
                                    .removeGlobalOnLayoutListener(this);
                    }
                });
2
Santhosh

Soit dit en passant, les vues ne sont pas dimensionnées tant que les étapes de mesure n'ont pas été effectuées. Voir ce lien:

getWidth () et getHeight () de View renvoie

1
Adam Ruhl

Vous devriez peut-être d'abord appeler View.measure (int, int).
Puisque la largeur et la hauteur ne sont pas définies tant que cette vue n'est pas dessinée. Vous pouvez appeler la mesure à la main pour appliquer cette vue afin de calculer sa taille;

0
landerlyoung