2010-05-12 33 views
13

Tôi đang làm việc với Android 2.1 và có vấn đề sau: Sử dụng phương thức View.getDrawingCache() luôn trả về giá trị rỗng. getDrawingCache() sẽ trả về một Bitmap, là bản trình bày nội dung của View.Phương thức getDrawingCache() của Android 2.1 View luôn trả về null

Ví dụ mã:

public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    final View view = findViewById(R.id.ImageView01); 
    view.setDrawingCacheEnabled(true); 
    view.buildDrawingCache(); 
    final Bitmap bmp = view.getDrawingCache(); 
    System.out.println(bmp); 

}

Tôi đã cố gắng nhiều cách khác nhau để cấu hình Xem đối tượng để tạo ra bộ nhớ cache vẽ (ví dụ View.setWillNotDraw(boolean)View.setWillNotCacheDrawing(boolean)), nhưng không hoạt động.

Cách đúng, hoặc những gì tôi đang làm sai?

PS: Trong mã thực, tôi muốn áp dụng getDrawingCache() trên một ViewGroup như RelativeLayout. Là hành vi giống nhau khi sử dụng một ViewGroup?

+0

Tôi gặp vấn đề tương tự trong 2.1, 2.2 lưu bitmap đúng cách. –

+0

Điều này sẽ hoạt động - http://stackoverflow.com/questions/11560882/call-to-getdrawingcache-fails-on-api-8-everytime – Ronnie

Trả lời

0

Theo như tôi đọc những ngày cuối cùng trong tài liệu, bạn chỉ nên nhớ setDrawingCacheEnabled hoặc buildDrawingChache() nhưng không được cả hai.

+0

Tôi biết, rằng setDrawingCacheEnabled và buildDrawingChache là dự phòng. lực setDrawingCacheEnabled để xây dựng bộ nhớ cache vẽ theo yêu cầu và buildDrawingChache tạo bộ nhớ cache mà không cần thiết lập cờ cho phép. nhưng nó không làm việc cho tôi - không chỉ thiết lập cờ, cũng như không sử dụng lệnh gọi abstract buildDrawingChache mà không cần thiết lập cờ. – Impression

5

sử dụng

onLayout(x, y, width, height); 

cho ví dụ:

onLayout(0, 0, 100, 100); 

trước khi gọi getDrawingCache

+0

thx ... hoạt động – Impression

+1

Không hoạt động: Phương thức onLayout (boolean, int, int, int, int) từ loại LinearLayout không hiển thị –

+3

chỉ là: layout.layout (0, 0, wt, ht); –

17
Bitmap screenshot; 
view.setDrawingCacheEnabled(true); 
screenshot = Bitmap.createBitmap(view.getDrawingCache()); 
view.setDrawingCacheEnabled(false); 

Bạn cần Bitmap.createBitmap(view.getDrawingCache()); như Bitmap từ đó các tài liệu tham khảo được nhận bởi getDrawingCache() được tái chế.

+4

Không làm việc cho tôi! Nói: nguồn là null tại Bitmap.createBitmap() –

2

Không bao giờ làm những việc này trong onCreate! Bạn có thể làm điều đó trong một View.onClickListener hoặc địa điểm khác.

0

có cùng một vấn đề và cuối cùng này một phần làm việc cho tôi:

view.layout(0, 0, 1000, 100); 
Bitmap b = view.getDrawingCache(); 
try { 
    b.compress(CompressFormat.JPEG, 95, 
    new FileOutputStream(Environment.getExternalStorageDirectory()               + "/folder/name.jpg")); 
catch (FileNotFoundException e) { 
    Log.e(LOGTAG, "error:" + e.getMessage()); 
    } 

vấn đề duy nhất là, mà tôi không thể có được kích thước đầy đủ các quan điểm của tôi. view.getwidth trả lại giá trị rỗng ...

0

Kiểm tra xem chế độ xem của bạn có lớn hơn kích thước màn hình hay không. Tôi thấy điều này và chuyển sang kích thước của quan điểm của tôi như vậy, bây giờ nó hoạt =) Android get full View as Bitmap

2

Tôi biết điều này không trả lời câu hỏi của bạn, nhưng ....

Cũng giống như một dành cho các nhà phát triển khác đọc điều này, nếu những gì bạn đang thực sự cố gắng làm là có quyền truy cập vào nội dung của chế độ xem tùy chỉnh, lấy được chế độ xem tùy chỉnh của bạn từ một ImageView. Và sau đó tạo canvas và bitmap mà bạn sẽ kiểm soát/vẽ/đọc và sử dụng setImageBitmap() để đặt bitmap của bạn thành đối tượng xem. Từ đó bạn có thể bỏ qua canvas được truyền cho bạn trong phương thức onDraw (canvas) và chỉ cần vẽ vào canvas/bitmap cục bộ của bạn.

Tại sao bạn cần điều này? Có một sự giám sát trong lớp Canvas theo ý kiến ​​của tôi. Lớp Canvas cung cấp cho bạn không có cách nào để đọc nội dung canvas cũng như không nhận được bitmap đằng sau nó. Vì vậy, nếu bạn cần phải đọc từ một bitmap, ví dụ để có được một bãi chứa hình ảnh của nội dung xem, không có cách nào tôi biết để làm điều đó, khác với phương pháp được mô tả ở trên.

Điều này sẽ không hoạt động đối với sự cố RelativeView được mô tả ban đầu ở đây trong chuỗi này nhưng điều này có thể được các nhà phát triển Android mới quan tâm.

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