2013-08-16 38 views
18

Tôi đã xem xét các câu hỏi tương tự và đã thử các giải pháp của họ nhưng nó không hiệu quả với tôi. Tôi cố gắng lấy chiều rộng của một imageView, nhưng nó trả về 0. Đây là mã:getWidth() và getHeight() trả về 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); 
    } 
} 
} 

Bất cứ ai có thể giúp tôi với điều này? Cảm ơn

+5

Có quá nhiều câu hỏi/câu trả lời về SO đề cập đến chủ đề này.Tóm lại, bạn đang truy cập chiều rộng và chiều cao khi chưa được đo. – Tobrun

Trả lời

17

Bạn cần sử dụng phương thức onSizechanged().

này được gọi là trong bố trí khi kích thước của quan điểm này đã thay đổi

+0

Nhưng Làm thế nào anh ta sử dụng phương thức 'onSizechanged()'. phương pháp này được bảo vệ phương pháp và ông có thể ovrride phương pháp này chỉ khi ông tạo ra nó 's bố trí riêng mở rộng từ View –

+0

Đó là sự thật. Tại sao tôi trả lời theo cách này tôi không thể nhớ nhưng nếu truy cập 'width' và' height' của 'ImageView' từ' Activity' của 'Fragment' thì nó nên được thực hiện ở đâu đó sau trong vòng đời như trong' onStart () 'mặc dù tôi không thể tìm thấy một câu lệnh rõ ràng khi' chiều cao' và 'chiều rộng' trở thành khác không. – Kerry

9

Bạn đang truy cập chiều rộng và chiều cao của ImageViews trước khi được đo hoặc sau khi bạn đặt khả năng hiển thị thành GONE.

image2.setVisibility(View.GONE); 

Sau đó getWidth() hoặc getHeight() sẽ trả về 0.,

Bạn cũng có thể có một cái nhìn tại onWindowFocusChanged(), onSizeChanged() và 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 chưa vẽ hình ảnh, do đó không có chiều rộng hoặc chiều cao trở lại. Bạn có thể sử dụng một lớp con để có chiều rộng điểm ảnh.

Dưới đây là một số liên kết cung cấp cho bạn một phương pháp đơn giản:

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

Hy vọng điều này giúp bạn.

+1

Tôi không biết cảm ơn bạn như thế nào. Một phần của mã trên của bạn đã giúp tôi rất nhiều. 'int width = MeasureSpec.getSize (widthMeasureSpec);'. Tôi đã dành gần 2 ngày và thử tất cả các hoán vị và kết hợp để hoàn thành công việc của tôi, nhưng dòng này đã giúp tôi tìm ra giải pháp. :) – Srikanth

+0

Chúng tôi chỉ giúp đỡ nhau để tiết kiệm thời gian ~ Đừng bận tâm ~ –

3

bạn có thể sử dụng OnGlobalLayoutListener cho image1 ImageView để bạn có thể có được chiều rộng và chiều cao chính xác chiếm đóng bởi quan điểm trong cách bố trí ... như

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

Đây không phải là trường hợp khi khả năng hiển thị biến mất. Ý tôi là, bạn không thể có chiều rộng hoặc chiều cao như vậy trong trường hợp đó. – Sotti

-7

Hãy sử dụng một Handler và nhận được chiều cao và chiều rộng về vấn đề này với thời gian chậm trễ> = 10

này có thể hữu ích để sử dụng:

012.
@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

Nó thực sự không phải là một ý tưởng tốt để làm điều đó theo cách này. Bạn không đảm bảo rằng sự chậm trễ tùy ý của '10' sẽ đủ dài để bố cục xảy ra. – jwir3

8

Bạn nên sử dụng: image1.getLayoutParams().width;

+5

không thành công khi sử dụng layout_width = "match_parent" ... trở về -1 ... –

0

Có lẽ bạn nên gọi View.measure (int, int) đầu tiên.
Vì chiều rộng và chiều cao không được xác định cho đến khi chế độ xem này được vẽ. Bạn có thể gọi số đo bằng tay để thực thi quan điểm này để tính toán kích thước của nó;

Các vấn đề liên quan