2013-08-16 19 views
18

Przyjrzałem się podobnym pytaniom i wypróbowałem ich rozwiązania, ale nie zadziałało to dla mnie. Próbuję pobrać szerokość imageView, ale zwraca 0. Oto kod:Wyświetlane są getWidth() i getHeight() zwracające 0

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

Czy ktoś może mi w tym pomóc? Dziękujemy

+5

Istnieje ponad wystarczająca liczba pytań/odpowiedzi na temat zgłoszenia zastrzeżeń dotyczących tego tematu.Krótko mówiąc masz dostęp do szerokości i wysokości, gdy nie są jeszcze mierzone. – Tobrun

Odpowiedz

17

Należy użyć metody onSizechanged().

To się nazywa układ podczas gdy wielkość tego widoku nie zmieniło

+0

Ale w jaki sposób używa on metody 'onStoechanged()'. ta metoda jest metodą chronioną i może ją przewodzić tylko wtedy, gdy utworzy własny układ z widoku –

+0

To prawda. Dlaczego odpowiedziałem w ten sposób, nie pamiętam, ale dostęp do "szerokości" i "wysokości" obrazu 'ImageView' z' Activity' fragmentu 'Fragment' powinien zostać wykonany gdzieś później w stylu lifestyl, np. W' onStart () 'chociaż nie mogłem znaleźć wyraźnego stwierdzenia, w którym' wysokość' i 'szerokość' stają się niezerowe. – Kerry

9

Masz dostęp do szerokości i wysokości ImageViews przed jej zmierzeniem lub po ustawieniu widoczności na GONE.

image2.setVisibility(View.GONE); 

Następnie getWidth() lub getHeight() zwróci 0.,

Można też rzucić okiem na onWindowFocusChanged(), onSizeChanged() i onMeasure():

@Override 
public void onWindowFocusChanged(boolean focus) { 
    super.onWindowFocusChanged(focus); 
    // get the imageviews width and height here 
} 
4
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 nie narysował jeszcze obrazu, więc nie powróci żadna szerokość ani wysokość. Możesz użyć podklasy, aby uzyskać szerokość widoku obrazu.

Oto Link dostarczyć kolejny łatwy metod:

How to get the width and height of an android.widget.ImageView?

How to get the width and height of an Image View in android?

Android ImageView return getWidth, getHeight zero

Nadzieja to pomóc.

+1

Nie wiem, jak ci podziękować. Część powyższego kodu bardzo mi pomogła. 'int width = MeasureSpec.getSize (widthMeasureSpec);'. Spędziłem prawie 2 dni i wypróbowałem wszystkie permutacje i kombinacje, aby wykonać moją pracę, ale ta linia pomogła mi znaleźć rozwiązanie. :) – Srikanth

+0

Po prostu pomagamy sobie nawzajem, aby zaoszczędzić czas ~ Nieważne ~ –

3

można użyć OnGlobalLayoutListener dla Image1 ImageView dzięki czemu można uzyskać dokładną wysokość i szerokość zajmowanego przez widok w układzie ... jak

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

Nie ma to miejsca, gdy widoczność zniknęła. Chodzi mi o to, że w takim przypadku nie można uzyskać takiej szerokości ani wysokości. – Sotti

-7

Proszę za pomocą Handler i uzyskać wysokość i szerokość w tej sprawie z opóźnieniem> = 10

może to być przydatne do użytku:

@Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     getHeight(); 

    } 

    private void getHeight() { 
     // TODO Auto-generated method stub 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(), "Height:" + mAnimationView.getMeasuredHeight(), 
         Toast.LENGTH_SHORT).show(); 
      } 
     }, 10L); 

    } 
+5

To naprawdę nie jest dobry pomysł, aby zrobić to w ten sposób. Nie masz gwarancji, że arbitralne opóźnienie "10" będzie wystarczająco długie, aby układ mógł się wydarzyć. – jwir3

8

Należy użyć: image1.getLayoutParams().width;

+5

kończy się niepowodzeniem przy użyciu layout_width = "match_parent" ... zwracając -1 ... –

0

Może powinieneś zadzwonić View.measure (int, int) pierwsza.
Ponieważ szerokość i wysokość nie są zdefiniowane, dopóki ten widok nie zostanie narysowany. Możesz ręcznie wywołać pomiar, aby wymusić ten widok, aby obliczyć jego rozmiar;