3

この画像のように、ビューの中央に長方形を描きたいです。このために、次のコードを使用しています

public class TransparentView extends View {


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

    public TransparentView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TransparentView(Context context) {
        super(context);
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        canvas.drawColor(Color.parseColor("#60000000"));
        Paint borderPaint = new Paint();
        borderPaint.setARGB(255, 255, 128, 0);
        borderPaint.setStyle(Paint.Style.STROKE);
        borderPaint.setStrokeWidth(4);

        Paint innerPaint = new Paint();
        innerPaint.setARGB(0, 0, 0, 0);
        innerPaint.setAlpha(0);
        innerPaint.setStyle(Paint.Style.FILL);

        RectF drawRect = new RectF();

        drawRect.set(100, 100, 100,100);

        canvas.drawRect(drawRect, innerPaint);
        canvas.drawRect(drawRect, borderPaint);

    }

}

長方形の内側を完全に透明にし、外側の領域を透明にするにはどうすればよいですか?

4

4 に答える 4

12

使うだけ

innerPaint.setStyle(Paint.Style.STROKE);

それ以外の

innerPaint.setStyle(Paint.Style.FILL);
于 2013-07-19T11:36:38.060 に答える
2

2つのを使用Pathして追加Rectします。1つはビュー領域全体用で、もう1つは「選択」用です。パスfillTypeをEVEN_ODDに設定します。次に、それを半透明の色で塗りつぶします。

Path outerPath = new Path();
// add rect covering the whole view area
outerPath.addRect(0, 0, getWidth(), getHeight(), Path.Direction.CW);
// add "selection" rect;
RectF inner = new RectF(left, top, right, bottom);
outerPath.addRect(inner, Path.Direction.CW);
// set the fill rule so inner area will not be painted
outerPath.setFillType(Path.FillType.EVEN_ODD);

// set up paints
Paint outerPaint = new Paint();
outerPaint.setColor(0x60000000);

Paint borderPaint = new Paint();
borderPaint.setARGB(255, 255, 128, 0);
borderPaint.setStyle(Paint.Style.STROKE);
borderPaint.setStrokeWidth(4);

// draw
canvas.drawPath(outerPath, outerPaint);
canvas.drawRect(inner, borderPaint);

パフォーマンスを向上させるために、onPaint()でペイントとパスを作成しないでください。そのためには、onSizeChanged()の方が適していることをお勧めします。

于 2012-10-10T13:31:58.863 に答える
1

画像を 5 つの長方形に分けました。主なものは完全に透明なもので、図の中央にあります。残りの 4 つは半透明になります。

その後、onDraw(Canvas canvas) 内で、4 つの長方形を半透明の色で塗りつぶしました。

これが私が使用したコードです。

//On constructor:
float x1,x2,y1,y2;
x1 = (screenWidth - squareSize)/2;
x2 = x1 + squareSize;
y1 = (screenHeight - squareSize)/2;
y2 = y1 + squareSize;
rect = new RectF(x1, y1, x2, y2);
dark = new RectF[]{
        new RectF(0, 0, screenWidth, y1),
        new RectF(0, y1, x1, y2),
        new RectF(x2, y1, screenWidth, y2),
        new RectF(0, y2, screenWidth, screenHeight)
};

semitransparentPaint = new Paint();
semitransparentPaint.setColor(Color.BLACK);
semitransparentPaint.setAlpha((int) (256 * (1-TRANSPARENCY)));



//Inside onDraw(Canvas canvas)
for(RectF r : dark){
    canvas.drawRect(r, semitransparentPaint);
}

それはあなたのために働くかもしれません。また、境界線を要求しませんでしたが、コード スニペットでcanvas.drawRect(drawRect, borderPaint);を呼び出していることがわかりました。魔女はあなたもそれらを描きたいと思わせるので、境界線を描くために使用したコードをここに貼り付けます。

//Inside onDraw(Canvas canvas)
canvas.drawLines(new float[]{
    rect.left, rect.top, rect.right, rect.top, 
    rect.right, rect.top, rect.right, rect.bottom,
    rect.right, rect.bottom, rect.left, rect.bottom,
    rect.left, rect.bottom, rect.left, rect.top}
    , 0, 16, squareBorderPaint);
于 2012-10-10T12:28:50.903 に答える
0

内側の透明領域を取得するためにsetXfermode()Paintと passPorterDuff.Mode.ADDをパラメータとして使用できます。PorterDuff.Mode.ADD

Android での実装方法を示す、別の四角形の中に透明な四角形を含む以下の例について言及しました。

    Paint outerPaint = new Paint();
    outerPaint.setColor(0x7f0600a6); // mention any background color 
    outerPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD));
    outerPaint.setAntiAlias(true);

    Paint innerPaint = new Paint();
    innerPaint.setColor(Color.TRANSPARENT);
    innerPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    innerPaint.setAntiAlias(true);

    canvas.drawRect(0.0F, 0.0F, width, height, outerPaint);
    canvas.drawRect(150F, 150F, innerWidth, innerHeight, innerPaint);

注意:必要に応じて値を変更できdrawRect()ます。

于 2019-01-08T17:21:57.880 に答える