17

現在、キャンバスに描画して、アプリで画像の丸みを帯びたバージョンを作成しています。画像の周りにかすかな影を描きたいのですが、うまくいきません。2 つの質問があります。 . コード:

![public Bitmap getRoundedCornerBitmap(Bitmap bitmap, float cornerRadius) {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth()+6, bitmap.getHeight() +6, Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        int shadowRadius = getDipsFromPixel(3);
        final Rect imageRect = new Rect(shadowRadius, shadowRadius, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(imageRect);

        // This does not achieve the desired effect
        Paint shadowPaint = new Paint();
        shadowPaint.setAntiAlias(true);
        shadowPaint.setColor(Color.BLACK);
        shadowPaint.setShadowLayer((float)shadowRadius, 2.0f, 2.0f,Color.BLACK);
        canvas.drawOval(rectF, shadowPaint);

        canvas.drawARGB(0, 0, 0, 0);
        final Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(color);

        canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, imageRect, imageRect, paint);

        return output;
    }][1]

http://i.stack.imgur.com/d7DV6.png

これは私が達成しようとしている効果の例です: ここに画像の説明を入力

4

5 に答える 5

16

どうぞ

http://i.imgur.com/cKi1ckX.png はい、私はまだ Nexus S を愛用しています。

まず、ビットマップをそのようにマスキングするのをやめてください。別の を割り当てることなくこれを達成できます。丸みを帯びた (そして実際にはあらゆる形状の) 画像を描画する方法についてのこのブログ投稿Bitmapをチェックしてください。

2番目に、Drawableおそらく影を追加する方法を理解できるでしょう。18+では、ViewOverlayそのために s を使用できます。また、ハードウェアアクセラレーションレイヤーにはサポートされていない描画操作がいくつかあることに注意してください。とが含まれsetShadowLayerBlurMaskFilterいます。パフォーマンスが問題にならない場合は、いつものように無効にすることができます。

if (SDK_INT >= HONEYCOMB) {
  view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

そしてsetShadowLayer、あなたがすでに試していたように使用してください:

somePaint.setShadowLayer(shadowSize, deltaX, deltaY, shadowColor);

サンプルは末尾のリンクをご確認ください。

それでもハードウェア アクセラレーションが必要な場合は、オーバードローのリスクを冒してそれを偽造する必要があります。放射状グラデーションを使用するか、自分でぼかした別の楕円形を描画するか (前述のように を使用できませんBlurMaskFilter)、または事前にぼかしたものを使用しますBitmap(より多くのマスキング)。

このような微妙な影の場合、パフォーマンスが必要な場合はフラットにする方がよいでしょう。完全なソースはバナナ スタンドにあります。

更新: L を開始すると、 real shadows を使用できます

于 2013-07-29T01:53:47.557 に答える