Как сделать обтекание контента в полукруглом режиме? - PullRequest
0 голосов
/ 02 апреля 2019

Я делаю пользовательский вид полукруга на Android. Тем не менее, я изо всех сил пытаюсь удалить ненужный нижний пробел в содержимом переноса. Я думаю, потому что это рисунок, основанный на расчете «полный круг». Я делюсь своей реализацией Custom View, а также тем, как я вызываю ее из своего приложения. Смотрите также это изображение: Нажмите здесь для скриншота

Примечание: если я изменю размер onMeasure, то будет обрезан верхний круг: Нажмите здесь для скриншота

class CircularProgressView(context: Context, attrs: AttributeSet) : View(context, attrs) {

    private var circle = RectF()
    private val paint = Paint()
    private var size = 0

    init {
        paint.isAntiAlias = true
        paint.style = Paint.Style.STROKE
        paint.strokeWidth = strokeWidth.toFloat()
        paint.strokeCap = Paint.Cap.BUTT

        setupAttributes(attrs)
    }

    private fun setupAttributes(attrs: AttributeSet?) {

        // TypedArray objects are shared and must be recycled.
        typedArray.recycle()
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)

        drawBackground(canvas)
    }


    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        size = Math.min(measuredWidth, measuredHeight)

        setMeasuredDimension(size, size)
    }


    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)

        val centerX = w / 2
        val centerY = h / 2

        // Pick the minimum value so that it can fit the container. Radius is half size
        val radius = size / 2f

        // Create the background and progress circle, adding dialStrokeWidth in equation so that make sure the dial can fit container
        circle.top = (centerY - radius)
        circle.bottom = (centerY + radius)
        circle.left = (centerX - radius)
        circle.right = (centerX + radius)
    }

    private fun drawBackground(canvas: Canvas) {
        paint.shader = null
        paint.color = backGroundColor
        canvas.drawArc(circle, startAngle, sweepAngle, false, paint)
    }
}

Вот как я это использую:

<com.enova.circular_progress.CircularProgressView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:background="@color/white"
                    app:backgroundColor="@color/colorHint"
                    app:dialColor="@color/colorPrimary"
                    app:foregroundColorEnd="@color/colorPrimary"
                    app:foregroundColorStart="@color/colorPrimaryDark"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:percent="80">
                </com.enova.circular_progress.CircularProgressView>               

1 Ответ

0 голосов
/ 02 апреля 2019

Измени свой onMeasure. Вы устанавливаете измеренную ширину и высоту на одно и то же значение. Если вы хотите отобразить только верхний полукруг, то вы хотите установить высоту равной половине ширины. В противном случае, он будет думать, что представление является полным кругом по высоте.

...