【问题标题】:Android how to draw shape centered in viewAndroid如何在视图中绘制形状居中
【发布时间】:2019-12-27 18:15:57
【问题描述】:

我有多个自定义视图实例,我正在尝试使用视图中的中心值绘制自定义形状。问题是我在尝试获取中心并在其上绘制形状时一直不成功,这是下面代码的结果,您可以看到黑色方块在 4 个方块中的每一个中都没有正确居中:

class MyCustomView
constructor(context: Context,
            attrs: AttributeSet? = null
) : View(context, attrs) {

    private var center = PointF(0f, 0f)

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        center.set(w / 2f, h / 2f)
    }

    override fun onDraw(canvas: Canvas) {
        val squareDimension = 100F
        val halfDimension = squareDimension / 2
        if (center.x == 0F || center.y == 0F) {
            center = PointF(width / 2F, height / 2F)
        }

        val paint = Paint()

        paint.color = Color.rgb(
            0,
            0,
            0)

        canvas.drawRect(
            center.x - halfDimension,
            center.y - halfDimension,
            center.x + halfDimension,
            center.y + halfDimension,
            paint)
    }

}

Android 我的布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:id="@+id/first"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/second"
        app:layout_constraintBottom_toTopOf="@id/third"
        android:background="@color/colorPrimary">
        <MyCustomView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/second"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toEndOf="@id/first"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toTopOf="@id/second"
        android:background="@color/colorAccent">
        <MyCustomView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/third"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/fourth"
        app:layout_constraintTop_toBottomOf="@id/first"
        android:background="@color/colorAccent">
        <MyCustomView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/fourth"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/third"
        app:layout_constraintTop_toBottomOf="@id/second"
        android:background="@color/colorPrimary"
        >
        <MyCustomView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

如何在每个视图的中心正确绘制形状?

【问题讨论】:

    标签: android kotlin canvas android-custom-view


    【解决方案1】:

    如果您查看视图,MyCustomView 及其父级设置为 wrap_content。它也是您在屏幕上看到的LinearLayouts 的边界。如果您检查您的视图,MyCustomViews 很可能不是您所期望的。

    您的选择:

    1. LinearLayout 的宽度和高度设为0dp(尽管这不是必需的约束),并将MyCustomView 的宽度和高度设为match_parent

    2. 完全删除 LinearLayouts 并将其替换为 MyCustomView。父级当前是多余的,但您以后可能会用到它。

    就您的课程而言,情况看起来不错,尽管我只有一个点 (val),全局创建绘制而不是在每次绘制时创建,并避免在 onDraw 期间改变点。您可以选择在onSizeChanged 期间计算RectF,并避免在onDraw 期间进行任何进一步的计算

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多