Дуга пути при рисовании на холсте толще дуги линии - PullRequest
0 голосов
/ 10 января 2019

Я создаю пользовательский вид, который рисует простую линию с закругленным углом, используя холст, и я не могу получить линию в углу такой же толщины, как прямые части. Путь определяется в методе onSizeChanged.

вот так выглядит мой взгляд:

Line

Вот вид

public class CanvasView extends View {

private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
Context context;

public CanvasView(Context c) {
    super(c);
    context = c;
    mPath = new Path();
    mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}

public CanvasView(Context c, AttributeSet attrs) {
    super(c, attrs);
    context = c;
    mPath = new Path();
    mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if(mBitmap == null) {

        RectF rectf = new RectF(w - w / 2, h - w / 2, w, h);
        mPath.moveTo(w, 0);
        mPath.lineTo(w, h - w / 2);
        mPath.arcTo(rectf, 0, 90);
        mPath.lineTo(0, h);

        mBitmapPaint.setAntiAlias(true);
        mBitmapPaint.setDither(true);
        mBitmapPaint.setColor(context.getResources().getColor(R.color.siminn_warm_gray));
        mBitmapPaint.setStyle(Paint.Style.STROKE);

        mBitmapPaint.setStrokeWidth(5);
    }
}


@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.drawPath(mPath, mBitmapPaint);

}
}

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Когда вы рисуете с помощью canvas, вы должны учитывать отступы вида. Метод onSizeChanged дает вам высоту и высоту представления без заполнения. Чтобы получить заполнение, вы можете использовать функции getPaddingTop(), getPaddingBottom(), getPaddingStart() и getPaddingEnd() в вашем классе View. Это будет код с учетом заполнения:

@Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        int realWidth = w - (getPaddingStart() + getPaddingEnd());
        int realHeight = h - (getPaddingTop() + getPaddingBottom());

        if (mBitmap == null) {
            RectF rectf = new RectF(realWidth - realWidth / 2, realHeight - realWidth / 2, realWidth, realHeight);
            mPath.moveTo(realWidth, getPaddingTop());
            mPath.lineTo(realWidth, realHeight - realWidth / 2);
            mPath.arcTo(rectf, 0, 90);
            mPath.lineTo(getPaddingStart(), realHeight);

            mBitmapPaint.setAntiAlias(true);
            mBitmapPaint.setDither(true);
            mBitmapPaint.setColor(context.getResources().getColor(R.color.siminn_warm_gray));
            mBitmapPaint.setStyle(Paint.Style.STROKE);
            mBitmapPaint.setStrokeWidth(5);
        }
    }
0 голосов
/ 10 января 2019

Я понял это, я рисовал вдоль края холста, который имел эффект показа только половины линии. Я немного сдвинул линии с края, и это работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...