2012-01-16 50 views
9

Tôi đang tự hỏi cách đo kích thước của chế độ xem. Trong trường hợp của tôi, nó là aan Absolute Layout. Tôi đã đọc các câu trả lời liên quan đến những câu hỏi đó nhưng tôi vẫn chưa hiểu. Tôi khá mới để lập trình vì vậy có lẽ nó chỉ là tôi. ;)Nhận chiều rộng/chiều cao của bố cục trong Android

Đây là mã của tôi:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);  

    AbsoluteLayout layoutbase = (AbsoluteLayout) findViewById(R.id.layoutbase);  

    drawOval(); 

} 
public void drawOval(){ //, int screenWidth, int screenHeight){ 
    AbsoluteLayout layoutbase = (AbsoluteLayout) findViewById(R.id.layoutbase);  

    int screenWidth = layoutbase.getWidth(); 
    int screenHeight = layoutbase.getHeight(); 
    Log.i("MyActivity", "screenWidth: " + screenWidth + ", screenHeight: " +screenHeight); 

    Coordinates c = new Coordinates(BUTTONSIZE,screenWidth,screenHeight); 

    ...some code ... 

    ((ViewGroup) layoutbase).addView(mybutton, new AbsoluteLayout.LayoutParams(BUTTONSIZE, BUTTONSIZE, c.mX, c.mY)); 


    mybutton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      showText(mybutton); 
     } 
    }); 
} 

public void showText(View button){  

    int x = findViewById(LAYOUT).getWidth(); 
    int y = findViewById(LAYOUT).getHeight(); 

    Toast message = Toast.makeText(this, "x: " + x , Toast.LENGTH_SHORT);  
    message.show();  


} 

Lệnh getWidth() công trình lớn trong showText() nhưng nó không trong drawOval(). Tôi biết có vẻ hơi khác một chút nhưng tôi cũng đã sử dụng phiên bản int x = findViewById(LAYOUT).getWidth(); trong drawOval() và x/y luôn là 0. Tôi không thực sự hiểu tại sao dường như không có chiều rộng/chiều cao ở điểm trước đó. Ngay cả khi tôi thực sự vẽ một Nút trên Bố cục tuyệt đối, getWidth() trả lại 0. Oviously tôi muốn đo kích thước trong drawOval().

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào.

Cảm ơn!

+1

Lưu ý rằng 'AbsoluteLayout' bị phản đối và không bao giờ nên được sử dụng. sử dụng Bố cục độc lập với mật độ thay thế! –

+0

hi, cảm ơn. nhưng tôi có thể định vị các yếu tố hoàn toàn trong bất kỳ loại Bố cục nào khác không? – mayhem

+0

Không, nhưng để thiết kế một cái gì đó hoàn toàn về cơ bản có nghĩa là bạn đang thiết kế cho một kích thước màn hình/mật độ. Bạn sẽ có thể đạt được kết quả mong muốn bằng cách sử dụng một cái gì đó như LinearLayout (ví dụ) và các giá trị đơn vị mật độ độc lập ("dp" hoặc "sp" thay vì "px"). –

Trả lời

7

getWidth() cung cấp cho bạn 0 vì onCreate được gọi trước khi bố cục thực sự xảy ra. Do quan điểm có thể có vị trí và kích thước động dựa trên thuộc tính hoặc các yếu tố khác (ví dụ: fill_parent) không có kích thước cố định cho bất kỳ chế độ xem hoặc bố cục cụ thể nào. Tại thời gian chạy có một điểm trong thời gian (thực sự nó có thể xảy ra nhiều lần tùy thuộc vào nhiều yếu tố), nơi tất cả mọi thứ được thực sự đo và đặt ra. Nếu bạn thực sự cần chiều cao và chiều rộng, bạn sẽ phải nhận chúng sau này khi bạn đã phát hiện ra.

1

câu trả lời của kabuko là chính xác, nhưng có thể rõ ràng hơn một chút, vì vậy hãy để tôi làm rõ.

getWidth()getHeight() (đúng) cho bạn 0 vì chúng chưa được vẽ trong bố cục khi bạn gọi cho chúng. hãy thử gọi hai phương thức trên nút sau addView() (sau khi chế độ xem đã được vẽ và hiện diện trong bố cục) và xem liệu có cung cấp cho bạn kết quả mong đợi hay không.

Xem này post để biết thêm thông tin.

+1

như tôi đã nói trước đó, tuy nhiên, tôi khuyên bạn nên sử dụng bố cục khác (chẳng hạn như 'LinearLayout' hoặc' RelativeLayout') là 'AbsoluteLayout' là ** không ** độc lập với mật độ và sẽ không hoạt động tốt trên nhiều kích thước màn hình và mật độ. –

+0

... hoặc nếu bạn đang muốn vẽ hình bầu dục trên Canvas, sau đó chỉ cần điền vào màn hình với chế độ xem tùy chỉnh có thể hoàn thành công việc. xem mã của tôi trong câu trả lời thứ hai của tôi bên dưới :) –

2

Nếu mục tiêu của bạn chỉ đơn giản là vẽ hình bầu dục trên màn hình, sau đó xem xét tạo tùy chỉnh của riêng bạn View thay vì lộn xộn xung quanh với AbsoluteLayout. Tùy chỉnh View của bạn phải ghi đè onDraw(android.graphics.Canvas), sẽ được gọi khi chế độ xem hiển thị nội dung của nó.

Dưới đây là một số mẫu mã cực kỳ đơn giản mà có thể giúp bạn bắt đầu:

public class MainActivity extends Activity { 

    private final Paint mPaint = new Paint(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new SampleView(this)); 
    } 

    // create a nested custom view class that can draw an oval. if the 
    // "SampleView" is not specific to the Activity, put the class in 
    // a new file called "SampleView.java" and make the class public 
    // and non-static so that other Activities can use it. 
    private static class SampleView extends View { 
     public SampleView(Context context) { 
      super(context); 
      setFocusable(true); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      canvas.drawColor(Color.CYAN); 

      // smoothen edges 
      mPaint.setAntiAlias(true); 
      mPaint.setColor(Color.RED); 
      mPaint.setStyle(Paint.Style.STROKE); 
      mPaint.setStrokeWidth(4.5f); 

      // set alpha value (opacity) 
      mPaint.setAlpha(0x80); 

      // draw oval on canvas 
      canvas.drawOval(new RectF(50, 50, 20, 40), mPaint); 
     } 
    } 
} 
+0

[** post **] này (http://stackoverflow.com/questions/3616676/how-to-draw-a-line-in-android) cũng cung cấp một số mẫu mã về cách vẽ một đường nếu hữu ích của nó :) –

3

này đặc biệt đối phó với Dimension s so

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 
int height = display.getHeight(); 

này có thể giúp bạn trong việc quản lý kích thước.

Lưu ý: Điều này trả về kích thước màn hình theo pixel - như mong đợi. Nhưng các phương thức getWidth() và getHeight() không được chấp nhận. Thay vào đó, bạn có thể sử dụng:

Display display = getWindowManager().getDefaultDisplay(); 
Point size = new Point(); 
display.getSize(size); 
int width = size.x; 
int height = size.y; 

cũng như Martin Koubek đề xuất.

10

Tôi nghĩ sẽ giúp bạn.

LinearLayout headerLayout = (LinearLayout)findviewbyid(R.id.headerLayout); 
    ViewTreeObserver observer = headerLayout .getViewTreeObserver(); 
      observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      // TODO Auto-generated method stub 
      int headerLayoutHeight= headerLayout.getHeight(); 
     int headerLayoutWidth = headerLayout.getWidth(); 
     headerLayout .getViewTreeObserver().removeGlobalOnLayoutListener(
       this); 
    } 
}); 


} 
+0

"l" trong trường hợp của bạn là gì? l.getHeight() –

2

này cung cấp cho bạn màn hình độ phân giải:

WindowManager wm = (WindowManager)context.getSystemService(context.WINDOW_SERVICE); 
Display display = wm.getDefaultDisplay(); 
Point outSize = new Point(); 
display.getSize(outSize); 
+0

int width = size.x; int height = size.y; – CoolMind

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