Android 6.0 错误处理 drawCircle 方法

标签 android android-6.0-marshmallow

在我的应用中,我需要使用位图和 drawCircle() 方法绘制圆。

在 Android 6.0 之前,一切都运行良好,完全符合预期。

它仍然在所有以前的版本上绘制圆圈,但是当我在 6.0 上使用该应用程序时绘制矩形。但是如果我将其更改为填充,它会在 api 22 和 api 23 中绘制一个圆圈。 任何人都有同样的问题或知道为什么会发生这种情况?

这是源代码和屏幕截图(左侧是在 API 23 上运行的应用程序,右侧是 API 22)。 same app on different api's

 public final class Circle1View extends View {

    private float xCenter, yCenter;
    private Bitmap grid = null;

    public Circle1View (Context context) {
        super(context);
        init();
    }

    private void init() {
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int w = getWidth();
        int h = getHeight();
        xCenter = w / 2;
        yCenter = h / 2;

        drawBitmaps(w, h);

        canvas.translate(xCenter, yCenter);
        canvas.scale(xCenter, yCenter);

        canvas.drawBitmap(grid, null, new RectF(-1, -1, 1, 1), null);
    }


    private void drawBitmaps(int w, int h) {

        grid  = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas();

        canvas.translate(xCenter, yCenter);
        canvas.scale(xCenter, yCenter);

        Paint gridPaint = new Paint();

        gridPaint.setStrokeWidth(0.01f);
        // Works with FILL
        // gridPaint.setStyle(Paint.Style.FILL);
        gridPaint.setStyle(Paint.Style.STROKE);

        canvas.setBitmap(grid);

        canvas.drawCircle(0, 0, 0.5f, gridPaint);


    }
}

最佳答案

我认为这与您所做的缩放和平移有关。想象绘制的圆很小,只需要 4 个像素。将其放大回完整尺寸时,这些像素之间会留下 4 条直线。

当我将描边宽度更改为 0.04f 时,问题就消失了。我建议您通过直接在提供的 Canvas 上绘制来简化您的代码:

@Override
protected void onDraw(Canvas canvas) {
    int w = getWidth();
    int h = getHeight();
    xCenter = w / 2;
    yCenter = h / 2;

    Paint gridPaint = new Paint();

    gridPaint.setStrokeWidth(1f);
    gridPaint.setStyle(Paint.Style.STROKE);

    canvas.drawCircle(xCenter, yCenter, w/4, gridPaint);
}

关于您关于 API 级别之间差异的问题:Marshmallow 引入了对 drawBitmap() 的更改。您可以查看 Lollipop 的相应源代码。和 Marshmallow .

关于Android 6.0 错误处理 drawCircle 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33394472/

相关文章:

android - 如何获取 Android 中菜单项的 Android ID?

java - 如何在Activity运行时一步步画线位图

android - ContextCompat.checkSelfPermission 的用例是什么?

android - Android 6.0 上的低功耗蓝牙 startScan 找不到设备

Android M - 无法检查运行时权限

android - 使用 fragment 时应用程序崩溃

android - Android可绘制目录可以包含子目录吗?

java - 安卓直播使用wowza + libstreaming

android - 仅限 API 23 以下的相机权限

android - 针对 android 中较低的 SDK 版本