2012-01-17 21 views
23

Từ phương thức android 3.0 the clipPath() không còn được hỗ trợ trong các thiết bị có tăng tốc phần cứng được bật. (Đọc này article để biết thêm chi tiết).Làm việc xung quanh Canvas.clipPath() không được hỗ trợ trong android nữa

Tôi đang làm việc với canvas và tôi cần vẽ hình ảnh tròn. Bất kỳ ý tưởng về làm thế nào tôi có thể làm điều đó?

* Tôi không thể tắt tăng tốc phần cứng, tôi đang tìm giải pháp khác.

Đã trả lời: Tnx @Malcolm cho câu trả lời của bạn. Tôi tìm thấy một ví dụ điển hình cho thấy this technique, về cơ bản nó là một mặt nạ.

Trả lời

24

Canvas.clipPath() hỗ trợ tăng tốc phần cứng đã được giới thiệu lại kể từ API 18.

Cách tốt nhất để làm việc xung quanh vấn đề đang kêu gọi setLayerType(View.LAYER_TYPE_SOFTWARE, null) chỉ khi bạn đang chạy trên API 11-17:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2 
     && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    setLayerType(LAYER_TYPE_SOFTWARE, null); 
} 

Tôi cũng bao quanh cuộc gọi clipPath() với một khối try-catch để tránh ứng dụng khó lường tai nạn:

if (doClip) { 
    try { 
     canvas.clipPath(clipPath); 
    } catch (UnsupportedOperationException e) { 
     Log.e(TAG, "clipPath() not supported"); 
     doClip = false; 
    } 
} 

Dù sao, UnsupportedOperationException nên không bao giờ được ném vào API> = 18.

Xem Unsupported Drawing Operations

+0

Đây có phải là chính xác giống như trong câu trả lời khác, ngoại trừ việc đề cập đến thực tế là API 18 đã giới thiệu hỗ trợ phần cứng cho nó? Sau này nên được thêm vào, tất nhiên. – Malcolm

+0

Vâng, đó là ... Nhưng tôi đã thêm thông tin cấp 18, giải thích và ví dụ mã API ... Tất cả trong một câu trả lời ngắn gọn. – araks

39

clipPath với tăng tốc phần cứng chỉ được hỗ trợ ở cấp API 18 trở lên, ở cấp API từ 11 đến 17, cần phải tắt.

Bài viết bạn đã đề cập bao gồm một đầu mối:

Nếu ứng dụng của bạn bị ảnh hưởng bởi bất kỳ những tính năng còn thiếu hoặc hạn chế, bạn có thể tắt khả năng tăng tốc phần cứng cho chỉ phần bị ảnh hưởng của ứng dụng của bạn bằng cách gọi setLayerType(View.LAYER_TYPE_SOFTWARE, null). Bằng cách này, bạn vẫn có thể tận dụng lợi thế của tăng tốc phần cứng ở mọi nơi khác. Xem Controlling Hardware Acceleration để biết thêm thông tin về cách bật và tắt tăng tốc phần cứng ở các cấp khác nhau trong ứng dụng của bạn.

Ý tưởng chính ở đây là tắt tăng tốc phần cứng trong phần ứng dụng mà bạn cần sử dụng các phương pháp không được hỗ trợ trên thiết bị có cấp API thấp hơn 18. Bạn có thể làm điều đó cho một chế độ xem cụ thể, không có cần phải tắt hoàn toàn cho toàn bộ ứng dụng.

Nếu bạn không muốn tắt tăng tốc phần cứng, thì tôi khuyên bạn nên sử dụng chế độ Porter-Duff. Bạn có thể tạo một bitmap với một vòng tròn trong đó, sau đó vẽ hình ảnh của bạn lên khung hình bằng cách sử dụng chế độ như vậy sẽ cắt hình ảnh của bạn thành nội dung gốc.

+1

Vâng, nhưng tôi chỉ có một cái nhìn, (đây thường là những gì bạn nhận được khi làm việc với canvas ...) Vì vậy, tôi không thể tắt nó đi, đây là lý do tại sao tôi đang tìm kiếm giải pháp xung quanh. –

+0

"Nó không còn được hỗ trợ nữa, nó chỉ không khả dụng với tăng tốc phần cứng được bật". Các tiêu cực kép ở đây làm cho câu này khó đọc. Có thể thay đổi cụm từ thành một cái gì đó như: "' clipPath' chỉ khả dụng với tăng tốc phần cứng bị tắt ". –

+0

@LeoAccend Tại sao bạn không tự mình [đề xuất chỉnh sửa] (http://stackoverflow.com/help/editing)? – Malcolm

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