2012-02-20 15 views
9

Vì API Android Cấp 15 có methodpublic Drawable getDrawableForDensity (int id, int density) để truy lục đối tượng có thể kéo được cho mật độ màn hình cụ thể. Có cách nào để thực hiện việc này trước API cấp 15 không?Có thể rút được mật độ cho Cấp API <15

+3

Không cố gắng dày đặc, nhưng tại sao bạn không thể lấy Bản vẽ theo tên trống (ID tài nguyên) và để cho hệ điều hành tìm ra đúng? – Sparky

+1

Điều đó làm việc tốt cho các bố trí XML của tôi, nhưng khi tôi tải bitmap thông qua BitmapFactory.decodeResource (Tài nguyên res, int id) nó cho thấy bitmap với độ phân giải nhỏ hơn. Có lẽ điều đó có liên quan đến việc mở rộng BitmapFactory, do đó tôi muốn chắc chắn rằng nó đang nạp tài nguyên thích hợp. Dù sao, khi vẽ lên canvas, có thể hữu ích khi có quyền truy cập vào các độ phân giải khác của bitmap, mà không bao gồm nhiều lần trong APK. –

+0

Đó là sự thật, nhưng sau đó nếu bạn muốn lười biếng, bạn chỉ có thể bao gồm nó một lần và để cho hệ điều hành con số ra không có bất kỳ bản sao khác. Bạn có thể có thể lấy đi chỉ với MDPI hoặc HDPI cho một bức ảnh; dòng nghệ thuật sẽ không đẹp như vậy. – Sparky

Trả lời

2

Vì vậy, tôi thực sự nghĩ rằng nó có thể được giải quyết bằng cách sử dụng kỹ thuật đảo ngược của API Android và mã nguồn theo đề xuất của @ adtennant. Tôi bắt đầu viết giải pháp đó, nhưng trong quá trình nhấn một kết thúc chết như một API cơ bản (không phải Java) mà là cần thiết không có sẵn trong các phiên bản sau của Android.

Nếu bạn không quan tâm đến việc này chỉ với Bitmaps, như ngụ ý bởi nhận xét của bạn, có thể thực hiện điều này với BitmapFactory như được đề xuất. BitmapFactory có một phương pháp khác:

decodeResource(Resources res, int id, BitmapFactory.Options opts)

Phương pháp này chấp nhận thêm BitmapFactory.Options mà sẽ cho phép bạn chỉ định mật độ để tải. Điều này dường như đã tồn tại kể từ cấp API 1. Cụ thể, tôi tin rằng bạn có thể sử dụng:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inDensity = DisplayMetrics.DENSITY_MEDIUM; // whichever you want to load 
options.inTargetDensity = getResources().getDisplayMetrics().densityDpi; 
options.inScaled = true; 

Điều này cũng sẽ mở rộng mật độ màn hình nếu mật độ không khớp được tải.

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