2010-06-15 62 views
15

Vui lòng giải thích cách bộ nhớ cache bản vẽ hoạt động trong Android. Tôi đang triển khai lớp con Xem tùy chỉnh. Tôi muốn bản vẽ của tôi được lưu trữ bởi hệ thống. Trong Xem constructor, tôi gọiBộ nhớ cache bản vẽ Android

setDrawingCacheEnabled(true); 

Sau đó, trong lễ bốc thăm (Canvas c), tôi làm:

Bitmap cac = getDrawingCache(); 
    if(cac != null) 
    { 
     c.drawBitmap(cac, 0, 0, new Paint()); 
     return; 
    } 

Tuy nhiên, lợi nhuận getDrawingCache() rỗng đối với tôi. My draw() không được gọi là từ setDrawingCacheEnabled(), cũng không phải từ getDrawingCache(). Làm ơn, tôi đang làm gì sai?

+0

Bản sao có thể có của http://stackoverflow.com/questions/2817166/android-2-1-views-getdrawingcache-method-always-returns-null – Hasturkun

+2

Khác nhau - điều đó liên quan đến yêu cầu bộ nhớ cache cho hệ thống- cung cấp chế độ xem con, cái này là về cách xây dựng nó theo quan điểm của riêng bạn. –

+0

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

Trả lời

8

Có giới hạn cứng về việc vẽ kích thước bộ nhớ cache, có sẵn thông qua lớp ViewConfiguration .. Chế độ xem của tôi lớn hơn mức cho phép để lưu vào bộ nhớ cache.

FYI, nguồn của lớp Chế độ xem có sẵn thông qua Trình quản lý SDK cho một số phiên bản Android (không phải tất cả).

+1

Để lưu những người khác khỏi bị quấy rối thông qua mã như tôi đã làm, séc bắt đầu trên dòng 6193. –

+0

cảm ơn bạn rất nhiều vì thông tin này. –

+0

@Seva đã cung cấp liên kết hiện không hoạt động và cung cấp lỗi "410". Thực sự đánh giá cao nếu ai đó có thể chỉnh sửa nó cho liên kết chính xác. – AnujAroshA

5

Hy vọng điều này sẽ giải thích.

public class YourCustomView extends View { 

    private String mSomeProperty; 

    public YourCustomView(Context context) { 
     super(context); 
    } 

    public YourCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public YourCustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void setSomeProperty(String value) { 
     mSomeProperty = value; 
     setDrawingCacheEnabled(false); // clear the cache here 
     invalidate(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     // specific draw logic here 

     setDrawingCacheEnabled(true); // cache 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     ... 
    } 

} 

Mã ví dụ được giải thích.

  1. Trong setSomeProperty() gọi phương thức setDrawingCacheEnabled (false) để xóa bộ nhớ cache và buộc vẽ lại bằng cách gọi invalidate().
  2. Gọi setDrawingCacheEnabled (true) trong phương thức onDraw sau khi vẽ lên canvas.
  3. Tùy chọn đặt câu lệnh tường trình trong phương thức onDraw để xác nhận nó chỉ được gọi một lần mỗi khi bạn gọi phương thức setSomeProperty(). Hãy chắc chắn để loại bỏ các cuộc gọi đăng nhập một lần xác nhận vì điều này sẽ trở thành một vấn đề hiệu suất.
+3

Điều này thực sự có hiệu quả không, làm cho tài liệu dường như giải thích khác đi: Bật hoặc tắt bộ nhớ cache vẽ. Khi bộ đệm bản vẽ được bật, ** lệnh gọi hàm getDrawingCache() hoặc buildDrawingCache() tiếp theo sẽ vẽ chế độ xem theo bitmap ** Cho dù tôi thêm các dòng đó hay không chỉ onDraw() của tôi được gọi một lần mỗi lần tôi gọi invalidate() Đã kiểm tra: bộ nhớ cache không được sử dụng. – 3c71

+2

Điều này là sai. Bạn chỉ cần bật bộ nhớ cache và nó sẽ được điền vào mỗi cuộc gọi để vẽ. Điều này thực sự sẽ không hoạt động vì bộ nhớ cache bản vẽ sẽ không được kích hoạt trong lần gọi đầu tiên đến onDraw. – dcow

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