Android 设置strokeCap或软件层会使线条消失

Android 设置strokeCap或软件层会使线条消失,android,canvas,android-canvas,android-custom-view,Android,Canvas,Android Canvas,Android Custom View,我有一个简单的自定义视图,它可以有效地作为progressbar工作。 我想画圆角,但这似乎对我不起作用。下面是完整的代码。在这种状态下,它画得正确,但没有圆角。设置strokeCap或layerType后,视图实际上变为空白。有人知道为什么吗?如何解决我的问题 编辑:另一个有趣的点是,即使drawLine在没有strokeCap的情况下工作,drawPath也不会绘制任何内容。我已经在画布上画了很多次,从来没有遇到过这么奇怪的问题……该死 编辑2:路径太大,无法渲染到纹理中-这是我在尝试使用d

我有一个简单的自定义视图,它可以有效地作为progressbar工作。 我想画圆角,但这似乎对我不起作用。下面是完整的代码。在这种状态下,它画得正确,但没有圆角。设置strokeCap或layerType后,视图实际上变为空白。有人知道为什么吗?如何解决我的问题

编辑:另一个有趣的点是,即使drawLine在没有strokeCap的情况下工作,drawPath也不会绘制任何内容。我已经在画布上画了很多次,从来没有遇到过这么奇怪的问题……该死 编辑2:路径太大,无法渲染到纹理中-这是我在尝试使用drawPath渲染时得到的结果(但它肯定比maxWidth/height小-视图大约为32x10dips)


圆角不显示的根本原因是它们从画布的边缘画出。从画布的一边到另一边画一条线<代码>绘制线在给定的坐标处绘制线,然后添加封口。在你的情况下,画布上已经没有空间了。您需要通过从边缘开始和结束绘制一半笔划长度来为封口留出空间,以便为封口留出空间。请参见下面的示例。我将笔划大小作为常量,但您可能希望在
R.dimen.grid\u 1
上加载它

@Override
protected void onDraw(Canvas canvas) {
    float step = (canvas.getWidth()-STROKE_SIZE/2)/(float)mMax;

    canvas.drawLine(STROKE_SIZE/2, getMeasuredHeight()/2, canvas.getWidth()-STROKE_SIZE/2, getMeasuredHeight()/2, mBgPaint);
    if(mProgress != 0) {
        canvas.drawLine(STROKE_SIZE / 2, getMeasuredHeight() / 2, step * mProgress, getMeasuredHeight() / 2, mFgPaing);
    }
}

尽管这是一个很好的观点(前几天我搔了搔我的头发,发现了这个愚蠢的事实),但这并没有帮助。一旦我将这些大写设置为圆形,线条就会消失,一旦我尝试使用drawPath而不是drawLine绘制它,它也会消失,而且我得到一条消息,路径太大,无法渲染为位图。:/drawPath上的消息应该通过取消线
setLayerType(LAYER_TYPE_软件,null)的注释来修复我使用了上面的代码,得到了您想要的正确行为,因此我没有想法。
@Override
protected void onDraw(Canvas canvas) {
    float step = (canvas.getWidth()-STROKE_SIZE/2)/(float)mMax;

    canvas.drawLine(STROKE_SIZE/2, getMeasuredHeight()/2, canvas.getWidth()-STROKE_SIZE/2, getMeasuredHeight()/2, mBgPaint);
    if(mProgress != 0) {
        canvas.drawLine(STROKE_SIZE / 2, getMeasuredHeight() / 2, step * mProgress, getMeasuredHeight() / 2, mFgPaing);
    }
}