2012-04-09 28 views
5

Tôi gọi getHeight và getWidth ở chế độ xem tùy chỉnh theo phương thức onDraw(). getHeight() trả lại 1,073,742,549getWidth() trả lại 1,073,742,304. Tuy nhiên, khi tôi nhìn vào số liệu hiển thị cho chiều cao và chiều rộng của màn hình, tôi nhận được 800 và 480 tương ứng. GetHeight là gì và getWidth trở về?Xem giá trị trả về getHeight() và getWidth() quá lớn

Tôi đang nhận được thứ nguyên của chế độ xem để tôi có thể chọn kích thước của một ảnh bitmap sẽ xuất hiện trong chế độ xem.

Cảm ơn.

+0

Tôi mới trên Android, nhưng tôi có kinh nghiệm tương tự. Nó phải làm một cái gì đó với phiên bản Android, vì cùng một dự án hoạt động tốt trên 4.1, nhưng có hành vi kỳ lạ này trên 2.3.6 Có lẽ một số cài đặt tương thích bị thiếu. –

+0

Bạn có lẽ cũng có thể ghi đè trênMeasure trong chế độ xem tùy chỉnh của mình và gọi setMeasuredDimensions với giá trị của MeasureSpec.makeMeasureSpec (width, MeasureSpec.EXACTLY). Tôi tin rằng các giá trị bạn đang nhận được sẽ được trả về từ makeMeasureSpec với MeasureSpec.EXACTLY và các thứ nguyên bạn đã chỉ định. –

Trả lời

10

Không dứt khoát giải quyết bạn vấn đề, nhưng một cách tò mò:

Width: 
1,073,742,304 == 0x400001E0 
      480 == 0x000001E0 

Height: 
1,073,742,549 == 0x400002D5 
      725 == 0x000002D5 

Bất kỳ cơ hội chế độ xem tùy chỉnh này có kích thước khoảng 725 x 480? Tôi không có ý tưởng nơi mà thêm 0x40000000 đến từ, nhưng có vẻ như nó có thể được gần như đúng trừ 1 bit :)

+2

Cảm ơn. Điều đó rất lạ. Vì vậy, tôi và chiều rộng và chiều cao so với 0xbfffffff để có được kích thước phù hợp, hoạt động. – Jays

+1

@Jays, tôi đã xem lại điều này, và tôi nghĩ rằng điều an toàn nhất để làm có thể là 'View.MeasureSpec.getSize (getWidth())' (và chiều cao). Các Measpec có thể báo hiệu những thứ khác bên trong nhân vật hàng đầu đó, và nếu một cái gì đó thay đổi nó có thể cắn bạn sau này (nói nếu nó báo cáo 0x8000xxxx). – Tim

3

Có thể, bạn đã làm một cái gì đó như thế này trong chế độ xem tùy chỉnh của bạn.

final int desiredHSpec = MeasureSpec.makeMeasureSpec(pixelHeight, MeasureSpec.MODE_CONSTANT); 
final int desiredWSpec = MeasureSpec.makeMeasureSpec(pixelWidth, MeasureSpec.MODE_CONSTANT); 
setMeasuredDimension(desiredWSpec, desiredHSpec); 

như thế này Android:Why after override onMeasure() in a custom view, the view's text can't show in RalativeLayout?

Nếu bạn thay đổi nó thành

setMeasuredDimension(width, height); 

, bạn sẽ nhận được chiều rộng nhỏ đơn giản, chiều cao trên onSizeChanged của bạn() và onLayout().

0

Tôi cũng gặp sự cố này. Cách tôi giải quyết nó đã ghi đè phương pháp onMeasure. Bằng cách này, chế độ xem luôn có cùng kích thước. Ví dụ, nếu bạn muốn xem để có kích thước và chiều rộng của màn hình, bạn nên làm một cái gì đó như thế này:

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     WindowManager wm = (WindowManager)this.getContext().getSystemService(Context.WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 
//display.getWidth() and display.getHeight() return the screen dimensions 
     this.setMeasuredDimension(display.getWidth(), display.getHeight()); 
    } 
Các vấn đề liên quan