简单 canvas 绘图未按预期工作

Simple canvas drawing not working as expected

我在另一个视图之上有一个自定义视图,我想在其中绘制内容。 canvas 有 width 1080height 1920(固定纵向)。我已经确认此视图确实位于另一个视图(相机预览)之上。但是,onDraw 函数没有绘制任何可见的东西。当我尝试 canvas.drawRect(0, 0, 10, 10) 时,我看到一个蓝色矩形,但是当我将左上角的位置更改为 (100, 100) 之类的位置时,屏幕上没有任何内容。 (100, 100) 当然在我的屏幕尺寸范围内,但为什么矩形不显示?

public class OverlayView extends View {

    private Paint paint;

    public BarcodeOverlayView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawRect(100, 100, 50, 50, paint);
    }
}


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);
}

尝试将此添加到您的构造函数中:

setWillNotDraw(false);

这可能与 Custom onDraw() method not called

中的问题相同

调用 Canvas.drawRect(100, 100, 50, 50, paint) 将不会绘制任何内容,因为传递的参数在某种程度上是错误的,所绘制的所需矩形所代表的点是错误的,我们称其为反转矩形。

如果您查看 Canvas.drawRect(float, float, float, float, Paint) 方法的描述 (JavaDoc),您会发现第一个参数是 left,第二个参数是 top,第三个是right,第四个是bottom,就是你的问题所在,right (50)点在X轴上left(100)点之前,也是bottom(50)点之前top Y 轴上的 (100) 个点。

因此,如果我假设通过调用 Canvas.drawRect(100, 100, 50, 50, paint) 您想绘制一个 50 像素 宽且 50 像素[=34] 的矩形=] 在 X 位置 100 像素 Y 位置 100 像素 你应该可以通过调用 Canvas.drawRect(100, 100, 150, 150, paint).

来实现