Android 在屏幕上绘制后不完全圆的圆弧或圆

Android 在屏幕上绘制后不完全圆的圆弧或圆,android,draw,geometry,Android,Draw,Geometry,我想通过填充一个圆弧来显示文件上传的进度,直到它达到100%(一个圆圈)。这很容易做到。我只需要它旋转动画以及。当我这样做的时候,我得出结论,这个圆不是完全圆的,因为它有点反弹 下面,您将看到100%时的圆弧。 这是一个用Photoshop添加的绿色覆盖图,它显示了圆的缺陷。 为什么圆弧/圆不是圆的?这是反走样吗?除此之外,当我以帧速率在不同位置重新绘制圆弧时,它仍然显示反弹效果 我使用的“调试”代码: @Override protected void onDraw(Canvas canva

我想通过填充一个圆弧来显示文件上传的进度,直到它达到100%(一个圆圈)。这很容易做到。我只需要它旋转动画以及。当我这样做的时候,我得出结论,这个圆不是完全圆的,因为它有点反弹

下面,您将看到100%时的圆弧。

这是一个用Photoshop添加的绿色覆盖图,它显示了圆的缺陷。

为什么圆弧/圆不是圆的?这是反走样吗?除此之外,当我以帧速率在不同位置重新绘制圆弧时,它仍然显示反弹效果

我使用的“调试”代码:

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

    Path path = new Path();
    RectF drawBounds = new RectF(mBounds.left, mBounds.top, mBounds.right, mBounds.bottom);

    if(mProgress != 100) {
        path.arcTo(drawBounds, mStartDegree, mProgress * 3.6f, true);
        canvas.drawPath(path, mLoaderPaint);
    }

    if (mStartDegree >= 359)
        mStartDegree = 0;
    else
        mStartDegree ++;

    invalidate();
}

似乎圆弧绘制程序有点中断,请运行我的代码并等待角度小于等于270度:

class V extends View implements Runnable {

    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private RectF mRect = new RectF();
    private float mStartAngle;
    private float mAngle;
    private Xfermode mClearMmode = new PorterDuffXfermode(Mode.CLEAR);

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

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mRect.set(0, 0, w, w);
        getHandler().post(this);
    }

    @Override
    protected void onDetachedFromWindow() {
        Log.d(TAG, "onDetachedFromWindow ");
        super.onDetachedFromWindow();
        getHandler().removeCallbacks(this);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        mPaint.setColor(0xff00aa00);
        mPaint.setXfermode(null);
        canvas.drawOval(mRect, mPaint);

        mPaint.setXfermode(mClearMmode);
        canvas.drawArc(mRect, mStartAngle, mAngle, true, mPaint);
    }

    @Override
    public void run() {
        mStartAngle += 3.65;
        mAngle += 0.2f;
        invalidate();
        getHandler().postDelayed(this, 20);
    }
}

好消息是,您将很容易找到如何使用此代码获取所需内容

任何代码如何绘制和旋转它?抱歉,忘记添加它了。我现在有……)姆邦兹是完美的正方形吗?杰普,是的。我现在正在使用掩蔽。那很好用。但奇怪的是,圆和弧并不是完全圆的。在发布了这个问题之后,我已经在研究掩蔽解决方案了。这很好用。但我仍然认为弧线和圆不是完美的圆是很奇怪的。