4

背景が緑色の単純なアクティビティがあり、透明な円形領域を持つ赤いオーバーレイを提供しようとしています。これが私が達成しようとしている効果です:

期待されるイメージ

インターネットで見つけたコードを使用すると、次のようになります。

コードの結果

起こっているように見えるのは、PorterDuff が、私が明確に指定したビューではなく、アクティビティ内のすべてのビューに適用されていることです。Stack に関する投稿の多くは、ビットマップを別のビットマップでマスクすることに関するもので、プログラムで作成された円形でビューの一部をマスクしようとしています。これが私が使用しようとしているコードです:

public class ClippingTestActivity extends Activity {
    private Paint mPaint;
    ClippingView ddd;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.test);
        View v = new View(this.getBaseContext());
        v.setBackgroundColor(Color.GREEN);
        this.addContentView(v, new  LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));

         ClippingView r = new ClippingView(this.getBaseContext());
        r.setBackgroundColor(Color.RED);   
        this.addContentView(r, new   LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
    }

}

    public class ClippingView extends View {
    Paint paint = new Paint();
        Path path = new Path();
        public ClippingView(Context context) {
    super(context);
    }
    @Override
    public void onDraw(Canvas canvas) {
    super.onDraw( canvas );

        paint.setColor(Color.TRANSPARENT);
        paint.setStyle(Style.FILL);

        paint.setXfermode( new PorterDuffXfermode( Mode.CLEAR ) );
        int cx = 200;
        int cy = 200;
        int radius = 50;
        canvas.drawCircle( cx, cy, radius, paint );
    }
}

レイアウトxmlファイルはそのままです

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res/com.appspot.scruffapp" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent"         
 android:layout_centerHorizontal="true"
 android:background="#ff0000"> 
 </RelativeLayout> 

効果を達成する方法を知っている人はいますか?

4

1 に答える 1

3

わかった。友人の助けを借りて、私はそれを理解しました。空の新しいキャンバスを作成し、それを関数から関数に渡し、後で追加される新しいビューにキャンバスを描画する必要があることがわかりました。これは私のために働いたコードです:

Bitmap circle = DrawView.makeCircle(drawable);
Bitmap overlayBg = DrawView.makeOverlayBg(canvas.getWidth(),canvas.getHeight());

Bitmap finalImage = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(), Bitmap.Config.ARGB_8888);

final android.graphics.Canvas tmpCanvas = new android.graphics.Canvas(finalImage);
tmpCanvas.drawBitmap(overlayBg, 0, 0, null);

final android.graphics.Paint paint = new android.graphics.Paint();
paint.setXfermode(new android.graphics.PorterDuffXfermode(Mode.DST_OUT));
tmpCanvas.drawBitmap(circle, cx - radius, cy - radius, paint);

canvas.drawBitmap(finalImage, 0, 0, null); 
于 2012-12-28T17:41:11.727 に答える