如何防止使用 Path() 绘制的自定义视图在调整大小时跳转?
How to prevent custom view drawn with Path() from jumping when being resized?
我创建了一个自定义视图,并使用 Path() 绘制了它的形状。
class CurvedInvertedShape(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs) {
private var path: Path? = null
private var paint: Paint? = null
private var bottom: Float = 0f
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
paint = Paint()
paint!!.style = Paint.Style.FILL
paint!!.color = resources.getColor(R.color.light_gray, context.theme)
path = Path()
val horizontalOffset = w * .4f
if (oldh == 0)
bottom = h.toFloat()
path!!.arcTo(
-horizontalOffset,
0f,
w.toFloat() + horizontalOffset,
bottom,
180f,
180f,
false
)
path!!.lineTo(w.toFloat(), h.toFloat())
path!!.lineTo(-horizontalOffset, h.toFloat())
path!!.fillType = Path.FillType.INVERSE_EVEN_ODD
}
override fun onDraw(canvas: Canvas) {
if (path != null)
canvas.drawPath(path!!, paint!!)
super.onDraw(canvas)
}
}
我的问题是当它的高度发生变化时,自定义视图的底部会从一个高度跳到另一个高度,而不是像其他视图那样平滑地调整大小。
这是我希望它的样子以及实际表现如何的示例:https://imgur.com/a/MZf9rnY
我很确定我需要自己制作动画,因为视图是我制作的,但我找不到怎么做。
好的,所以我不知道我在想什么...基本上我创建了另一个视图,我将其设置为匹配进行更改的布局,而不是直接应用此自定义视图 for 布局本身。以下是简化的示例:
<com.app.MyCustomView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="40dp"
android:background="@drawable/gradient_state_1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:animateLayoutChanges="true"
android:background="@drawable/gradient_state_1"
android:orientation="vertical">
<!--Some views which collapse and expands-->
</LinearLayout>
上面是我做过的和没做过的,下面是我做过的和做过的:
<come.app.MyCustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:animateLayoutChanges="true"
android:background="@drawable/gradient_state_1"
android:orientation="vertical">
<!--Some views which collapse and expands-->
</com.app.MyCustomView>
我不敢相信我在这方面如此努力,因为我知道我在同一个项目的其他地方也做过同样的事情。我想我是专注于制作动画的方式。
我创建了一个自定义视图,并使用 Path() 绘制了它的形状。
class CurvedInvertedShape(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs) {
private var path: Path? = null
private var paint: Paint? = null
private var bottom: Float = 0f
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
paint = Paint()
paint!!.style = Paint.Style.FILL
paint!!.color = resources.getColor(R.color.light_gray, context.theme)
path = Path()
val horizontalOffset = w * .4f
if (oldh == 0)
bottom = h.toFloat()
path!!.arcTo(
-horizontalOffset,
0f,
w.toFloat() + horizontalOffset,
bottom,
180f,
180f,
false
)
path!!.lineTo(w.toFloat(), h.toFloat())
path!!.lineTo(-horizontalOffset, h.toFloat())
path!!.fillType = Path.FillType.INVERSE_EVEN_ODD
}
override fun onDraw(canvas: Canvas) {
if (path != null)
canvas.drawPath(path!!, paint!!)
super.onDraw(canvas)
}
}
我的问题是当它的高度发生变化时,自定义视图的底部会从一个高度跳到另一个高度,而不是像其他视图那样平滑地调整大小。
这是我希望它的样子以及实际表现如何的示例:https://imgur.com/a/MZf9rnY
我很确定我需要自己制作动画,因为视图是我制作的,但我找不到怎么做。
好的,所以我不知道我在想什么...基本上我创建了另一个视图,我将其设置为匹配进行更改的布局,而不是直接应用此自定义视图 for 布局本身。以下是简化的示例:
<com.app.MyCustomView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="40dp"
android:background="@drawable/gradient_state_1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:animateLayoutChanges="true"
android:background="@drawable/gradient_state_1"
android:orientation="vertical">
<!--Some views which collapse and expands-->
</LinearLayout>
上面是我做过的和没做过的,下面是我做过的和做过的:
<come.app.MyCustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:animateLayoutChanges="true"
android:background="@drawable/gradient_state_1"
android:orientation="vertical">
<!--Some views which collapse and expands-->
</com.app.MyCustomView>
我不敢相信我在这方面如此努力,因为我知道我在同一个项目的其他地方也做过同样的事情。我想我是专注于制作动画的方式。