Java 自定义视图绘制不正确

Java 自定义视图绘制不正确,java,android,Java,Android,我只是想画一条水平线。我把风景画成了红色,然后加了一条蓝线,我认为这条线应该占一半的高度 既然我说我的自定义视图的高度是40 dp,我会认为20 dp的蓝色条会将其填充一半。但事实并非如此。它需要1/4而不是1/2。我怎样才能解决这个问题 public class MyProgressView extends View { public MyProgressView(Context context) { super(context); } public

我只是想画一条水平线。我把风景画成了红色,然后加了一条蓝线,我认为这条线应该占一半的高度

既然我说我的自定义视图的高度是40 dp,我会认为20 dp的蓝色条会将其填充一半。但事实并非如此。它需要1/4而不是1/2。我怎样才能解决这个问题

public class MyProgressView extends View {

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

    public MyProgressView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(dipToPx(20));
        canvas.drawLine(0, 0, 300, 0, paint);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);

        setMeasuredDimension(parentWidth, dipToPx(40));
    }

    private int dipToPx(int dp) {
        return (int) getResources().getDisplayMetrics().density * dp;
    }
}
和XML:

<view
        class="com.company.MyProgressView"
        android:background="#ff0000"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        />

在您的例子中,
drawLine
方法在Y=0上绘制一条线。这意味着线在Y上的中心位置为0。如果将笔划宽度设置为20,它将填充-10和+10

有两种不同的解决方案:

  • 您可以将笔划设置为40(这将填充-20和+20)
  • 您可以在drawLine方法中将Y设置为10(这将填充0和+20)。

  • 我已经有一段时间没有画线了,但我相信可能是因为线的下半部分被剪掉了。试着提高10 dp,看看你能不能得到更多。谢谢你的帮助:)