2012-07-01 18 views
24

Tôi đã cố gắng tạo chế độ xem tùy chỉnh có hình dạng mờ bên dưới văn bản. Vấn đề là các BlurMaskFilter không có hiệu lực trên bất kỳ hình dạng mà tôi vẽ trên vải. Đây là cách tôi initialising các đối tượng Sơn trong constructor:Android BlurMaskFilter không có hiệu lực trong canvas.drawOval trong khi văn bản bị mờ

paint = new Paint(0); 
paint.setColor(0xffffffff); 
paint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL)); 

mShadowPaint = new Paint(0); 
mShadowPaint.setColor(0xff333333); 
mShadowPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL)); 

Và tôi kêu gọi các chức năng như thế này trong OnDraw():

canvas.drawOval(mShadowBounds,mShadowPaint); 
canvas.drawText("hello", x, y, paint); 

Nhưng đây là những gì tôi nhìn thấy.

The Oval is not blurred yet the text is blurred.

Sử dụng android 4.0 sdk và thử nghiệm trên một thiết bị Nexus 4.0.4 thiên hà (Anh). Tôi tự hỏi nếu đây là một lỗi trong 4.0.4 như tôi đã thử nghiệm nó trên giả lập với 4.0 và 4.0.3 và nó đã làm mờ hoàn toàn tốt trên chúng, trừ khi tôi đang làm một cái gì đó hoàn toàn sai?

EDIT: Đây là mã Chế độ xem mở rộng để kiểm tra trên các nền tảng khác.

import android.content.Context; 
import android.graphics.BlurMaskFilter; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.util.AttributeSet; 
import android.view.View; 

public class BlurTestView extends View{ 

    private Paint paint; 
    private Paint mShadowPaint; 
    private int size = 100; 
    private RectF mShadowBounds = new RectF(); 

    public BlurTestView(Context context) { 
     this(context, null, 0); 
    } 

    public BlurTestView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public BlurTestView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     paint = new Paint(0); 
     paint.setColor(0xff333333); 
     paint.setTextSize(size); 
     paint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL)); 

     mShadowPaint = new Paint(0); 
     mShadowPaint.setColor(0xff333333); 
     mShadowPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL)); 

     mShadowBounds.top = size; 
     mShadowBounds.bottom = mShadowBounds.top+(size /2); 
     mShadowBounds.left = 0; 
     mShadowBounds.right = (int)paint.measureText("hello"); 
    } 

    @Override 
    public void onDraw(Canvas canvas) 
    { 
     canvas.drawOval(mShadowBounds,mShadowPaint); 
     canvas.drawText("hello", 0, size, paint); 
    } 

} 
+2

Tôi thấy điều tương tự trên Galaxy Nexus chạy 4.0.4, chỉ văn bản bị mờ, không có gì khác. Chạy cùng một ứng dụng thử nghiệm trên Gingerbread Incredible của tôi đúng cách làm mờ tất cả các hình dạng và văn bản. – Josh

Trả lời

36

Trông giống như một lỗi đối với tôi. Tôi đã báo cáo cho nhóm Android; chúng ta sẽ thấy những gì họ nói.

Nó hiển thị chính xác nếu bạn đặt android:hardwareAccelerated="false" trên Hoạt động của mình ở AndroidManifest.xml.

Đây là từ chính thức của nhóm đồ họa Android: "BlurMaskFilter không được hỗ trợ với tăng tốc phần cứng". (Kể từ ngày 10 tháng 7 năm 2012)

+0

Có nó sẽ hiển thị chính xác nếu tăng tốc phần cứng được đặt thành false. Nhưng tiếc là tôi không thể làm điều đó khi ứng dụng sử dụng tăng tốc phần cứng. Cảm ơn bạn đã trả lời của bạn mặc dù. –

+0

Tôi nghĩ rằng nó là hợp lý để sử dụng chủ yếu là kết xuất phần cứng nhưng buộc phần mềm dựng hình trên các hoạt động cụ thể mà có rắc rối, miễn là hiệu suất là tốt. – Sparky

+0

Tôi đã thử điều đó, hiệu suất đã xấu đi đáng kể. –

1

Tôi gặp sự cố tương tự khi thêm bộ lọc vào đường dẫn. Tôi nhận thấy rằng việc đặt mục tiêu là 13 hoặc thấp hơn cho phép các bộ lọc hoạt động. 14 và họ đã không.

android:targetSdkVersion="13" 
+0

Điều kỳ quặc khi xem xét tăng tốc phần cứng đã được giới thiệu trong API 11. –

+0

Ngay cả khi tôi trộn chế độ xem xuống một bitmap, bitmap mới cho thấy nó bị mờ trong bản sao. Thật kỳ quặc. – a54studio

+1

Vì vậy, có cách nào khác để làm thế nào để đạt được hiệu ứng làm mờ này mà không có blurmaskfilter? Đặt hình ảnh hiển thị hw TẮT thực sự làm chậm hoạt ảnh. – Uday

1

Nếu bạn không thể vô hiệu hóa tăng tốc phần cứng trong hoạt động của bạn (ví dụ nó sử dụng TextureView đòi hỏi khả năng tăng tốc phần cứng) bạn chỉ có thể gọi setLayerType với tham số đầu tiên LAYER_TYPE_SOFTWARE và vô giá trị tham số thứ hai cho tầm nhìn của bạn.

Giống như

public class BlurTestView extends View { 

    public BlurTestView(Context context) { 
     this(context, null, 0); 
    } 

    public BlurTestView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

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

     // Disable hardware acceleration for this view 
     setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

     // Perform other initialisation 
    } 

    // Other methods and so on... 
} 

Thông tin thêm về các bộ lọc này mặt nạ, hiệu ứng và shaders bạn có thể tìm here.

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