2012-12-07 26 views
48

Hi Tôi bối rối bởi hai phương pháp từ Android lớp drawableandroid getIntrinsicHeight và getIntrinsicWidth nghĩa là gì?

getIntrinsicHeight() 
getIntrinsicWidth() 

nét api nói http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()

gì từ nội tại chiều cao/chiều rộng nghĩa là gì? ý tôi là chiều rộng của hình ảnh thực tế?

+2

câu trả lời chính xác tại đây http://stackoverflow.com/questions/6536418/android-why-are-the-width-height-of-the-drawable-in-imageview-wrong – mathheadinclouds

Trả lời

102

Nếu bạn muốn biết ý nghĩa của nội tại, nó là gì, nhưng tài sản thực tế sở hữu bởi một đối tượng. Trong trường hợp của chúng tôi, getIntrinsicWidth/Height chỉ đơn giản có nghĩa là cung cấp cho bạn chiều rộng/chiều cao mặc định của đối tượng có thể vẽ đó.

Điều này trả về kích thước chính xác của đối tượng có thể kéo mà bạn đã đặt trong thư mục tài nguyên mà không có bất kỳ sửa đổi nào.

Bây giờ bạn phải biết rằng getWidth hoặc getHeight sẽ trả lại giá trị có thể khác nhau tùy theo chiều rộng và chiều cao bạn chỉ định cho ImageView trong bố cục XML của mình.

Giả sử bạn đã cung cấp chiều rộng và chiều cao của ImageView100*100 trong bố cục XML và hình vẽ bạn đã sử dụng làm nền có kích thước 200 * 200.

Bây giờ getIntrinsicWidth phải trả lại 200 trong khi getWidth phải trả lại 100.

+0

cảm ơn tôi thấy. nhưng hiện tại tôi đang downloaidng một hình ảnh từ url (và tải nó ot một hình ảnh xem) chiều cao nội tại và chiều rộng không giống như hình ảnh ban đầu nếu tôi truy cập nó trong trình duyệt, nó lớn hơn những gì đang được báo cáo, nhưng trong ur ở trên Ví dụ, ur nói rằng họ nên được cùng một – user1697965

+0

cũng có thể bạn đang thu nhỏ hình ảnh trong khi tải xuống. Tôi không chắc chắn như thế nào đến nay làm việc cho một hình ảnh tải về nhưng ít nhất nó hoạt động cho những hình ảnh mà tôi có trong drawable của tôi. –

+6

sai. câu trả lời đúng ở đây http://stackoverflow.com/questions/6536418/android-why-are-the-width-height-of-the-drawable-in-imageview-wrong – mathheadinclouds

4

Trong android có thể vẽ có thể có nhiều loại như màu sắc, bitmap, hình, vv

Một số các drawables có một chiều cao như vậy thực chất dưới dạng BitmapDrawable là kích thước của hình ảnh.

Các bản vẽ như ColorDrawable (được sử dụng để vẽ các màu đồng nhất) không có chiều cao nội tại. Trong trường hợp này giá trị của getIntrinsicHeight/Width trả về -1.

Thậm chí nếu có thể vẽ không có nội chiều cao/chiều rộng, mỗi nhu cầu drawable có giới hạn của họ thiết lập trước khi họ có thể làm cho bản thân (tức là trước khi bạn gọi mydrawable.draw (canvas))

Nếu bạn sử dụng một có thể vẽ làm nền cho chế độ xem, chế độ xem nội bộ đặt giới hạn cho bạn. Nhưng nếu bạn đang sử dụng drawables trong onDraw của riêng bạn, thì bạn cần phải thiết lập rõ ràng các giới hạn thông qua setBounds.

8

câu hỏi liên quan here on stackoverflow.

NẾU hình ảnh của bạn được tải xuống từ internet, .getIntrinsicWidth().getIntrinsicHeight() thực sự cung cấp cho bạn chiều rộng và chiều cao "thực" của hình ảnh.

Nó được gọi là nội tại, vì nó chỉ phụ thuộc vào hình ảnh và không có gì khác (chẳng hạn như điện thoại của bạn).

Than ôi, những gì bạn nhận được KHÔNG phải là nội tại trong mọi trường hợp - nó không phụ thuộc vào những thứ khác ngoài hình ảnh.

Đây là nơi bạn nhận được kết quả sai (cụ thể là không nội tại).Giả sử bạn đang sử dụng biểu tượng trình chạy mặc định, sau đó

Log.i("", "ic_launcher intrinsic width " + getResources().getDrawable(R.drawable.ic_launcher).getIntrinsicWidth()); 

sẽ cho bạn biết chiều rộng (tính bằng pixel) của biểu tượng trình khởi chạy. Nhưng cái nào? - bạn có một vài trong số đó, một trong thư mục draw-xhdpi, một trong thư mục drawable-hdpi, vâng, nếu thiết bị của bạn là xhdpi, nó cung cấp cho bạn 96, thực sự là chiều rộng pixel của phiên bản biểu tượng trình khởi chạy nằm trong thư mục draw-xhdpi. Bây giờ, xóa biểu tượng trong thư mục draw-xhdpi và chạy lại (vẫn sử dụng thiết bị xhdpi (thực hoặc giả lập)). Hình ảnh sẽ được sử dụng sẽ từ thư mục drawable-hdpi, vì đó là "gần nhất" với phiên bản xhdpi. Biểu tượng đó có chiều rộng pixel là 72. Nhưng ở trên mã S ST S ST ĐẾN BẠN 96 !!!

Điều đó rõ ràng KHÔNG "nội tại" (theo đúng nghĩa của từ), vì nó không chỉ phụ thuộc vào hình ảnh được sử dụng. Vì vậy, nếu bạn lười biếng như tôi, và do đó không tạo ra 4 phiên bản của mỗi biểu tượng/hình ảnh tài nguyên (nhưng thay vì chỉ sử dụng 1 hoặc 2, và mở rộng quy mô bằng tay), bạn phải cẩn thận với androidal được đề cập nhầm lẫn.