简单的画布绘制不按预期工作

时间:2017-05-01 17:37:03

标签: android android-layout android-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);
}

2 个答案:

答案 0 :(得分:0)

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

setWillNotDraw(false);

这可能与Custom onDraw() method not called

中的问题相同

答案 1 :(得分:0)

Canvas.drawRect(100, 100, 50, 50, paint)的调用不会绘制任何内容,因为传递的参数错误的方式应该是绘制的所需矩形所代表的点,我们称之为反转的矩形。

如果你看一下Canvas.drawRect(float, float, float, float, Paint)方法的描述(JavaDoc),你会发现第一个参数是,第二个是顶部,第三个是正确,第四个是底部,这是您的问题所在,正确(50)点位于左侧 X轴上的(100)点,底部(50)点在Y轴上的顶部(100)点之前。

因此,如果我假设通过调用Canvas.drawRect(100, 100, 50, 50, paint),您希望在 X处绘制 50 px 宽且 50 px 高的矩形 100 px 的位置以及 100 px Y 位置您应该可以通过调用Canvas.drawRect(100, 100, 150, 150, paint)来实现这一目标。