2021-03-24 继承ViewGroup自定义View

2021-03-24  本文已影响0人  小强开学前

这次需求是写基础组件,类似设置项中的item,但是需要有带输入框的。
思路是继承ConstraintLayout,手动生成View并建立约束。

预览效果图

1. 如何用代码的方式给子View建立约束关系?

eg: 让子View上下居中,水平靠后布局

2. 约束布局xml里面的类似 topToTopOf="parent"在代码中代表什么?

如 1 中所示,关联的是parent的id。默认是ConstraintSet.PARENT_ID,这个值为0;当然我们可以手动在xml中给约束布局设置id,或者使用View.generateViewId()在代码中设置,然后通过这个id建立约束。

就是这样

   id = View.generateViewId()
   val t = TextView()
   t.layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
   this.endToEnd = this@MyView.id
   this.topToTop =  this@MyView.id
   this.bottomToBottom =  this@MyView.id
 }

3. 红色提示如何优雅展示?

Android给ViewGroup其实内置了默认的动画,只是没有开启,这会在子View属性改变时触发。对应到我们的需求,GONEVISIBLE刚好符合。

}
```
效果:


提示动画

4. 重写onDraw()绘制分割线没有效果

ViewGroup没有背景默认不会走绘制自身的方法。

1. Draw the background
2. If necessary, save the canvas' layers to prepare for fading
3. Draw view's content
4. Draw children
5. If necessary, draw the fading edges and restore layers
6. Draw decorations (scrollbars for instance)
7. If necessary, draw the default focus highlight

默认打印 background 为 null,这样它认为不需要绘制自身,上面3. Draw view's content对应的onDraw()不会执行。

5. 如何恢复和保存子View的状态(Switch 开关,EditText文本)

安卓默认会给所有设置了id的控件实现保存和恢复状态。
但是它会有个isViewIdGenerated()的判断,如果是通过调用View.generateViewId()生成的,则不会保存。

思路有二

上一篇 下一篇

猜你喜欢

热点阅读