java - 自定义 View 无法正确绘制

标签 java android

我只是想创建一条水平线。我将 View 涂成红色,然后添加了一条蓝线,我认为该蓝线应该占高度的一半。

因为我说我的自定义 View 高度为 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。

有两种不同的解决方案:

  1. 您可以将描边设置为 40(将填充 -20 和 +20)
  2. 您可以在drawLine方法中将Y设置为10(这将填充0和+20)。

关于java - 自定义 View 无法正确绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622078/

相关文章:

java - Spring MVC - Eclipse 警告 - 验证消息

Java - 我可以扩展类的实例以使其成为父类实例吗?

java - 如何知道我们应该添加的最少数字以获得完整数组

java - 从 InputStreamReader 将 Json 转换为 gson

android - 带大小写的 SQL 请求按顺序抛出 "(1) 1st ORDER BY term does not match any column in the result set"

android - 在 gridview 末尾添加一个 textview 用于加载更多图片

java - 反射和元数据之间的区别

安卓和苹果手机。统一代码库可能吗?

java - Android 7.0 不显示多个权限请求

android - 应用启动生命周期