テキストの下にぼやけた形のカスタムビューを作成しようとしています。問題は、BlurMaskFilterが、キャンバスに描画するどのシェイプにも影響を与えないことです。コンストラクターでPaintオブジェクトを初期化する方法を次に示します。
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));
そして、私はonDraw()で次のような関数を呼び出しています:
canvas.drawOval(mShadowBounds,mShadowPaint);
canvas.drawText("hello", x, y, Paint);
しかし、これは私が見るものです。
Android 4.0 sdkを使用し、4.0.4ギャラクシーネクサスデバイス(英国)でテストしています。4.0のエミュレータでテストしたので、これは4.0.4のバグかどうか疑問に思っています。そして、4.0.3そして、私が何か間違ったことをしているのでない限り、それはそれらの上で完全によくぼやけましたか?
編集:これは、他のプラットフォームでテストするための拡張Viewコードです。
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);
}
}
私にはバグのようです。私はそれをAndroidチームに報告しました。彼らの言うことがわかります。
Android:hardwareAccelerated="false"
のアクティビティでAndroidManifest.xml
を設定すると、正しくレンダリングされます。
Androidグラフィックチームからの公式の単語:「BlurMaskFilterはハードウェアアクセラレーションではサポートされていません。」(2012年7月10日現在)
アクティビティでハードウェアアクセラレーションを無効にできない場合(たとえば、ハードウェアアクセラレーションを必要とするTextureViewを使用している場合)、最初のパラメーター LAYER_TYPE_SOFTWARE で setLayerType を呼び出し、2番目のパラメーターをnullにするだけです。あなたの意見。
このような
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...
}
マスクフィルター、エフェクト、シェーダーの詳細については、 ここ を参照してください。
パスにフィルターを追加しているときにも同じ問題が発生しました。ターゲットを13以下に設定すると、フィルターが機能することに気づきました。 14歳以上はそうではありませんでした。
Android:targetSdkVersion="13"