我需要创建一个能够在不同视图之间滑动的自定义视图。我不能使用ViewPager等,因为它没有我需要的过渡和功能。
我从这开始:
public final class DynamicSwipeView extends View {
private View view;
public DynamicSwipeView(Context context) {
super(context);
}
public void setPage(View view) {
this.view = view;
}
@Override
protected void onDraw(final Canvas canvas) {
if (view != null) {
view.draw(canvas);
}
}
}
但是没有绘制另一个视图(如果直接使用,则可以使用)。当我在构造函数中为此滑动视图指定背景颜色时,它将以该颜色而不是白色显示,但不会绘制另一个视图。
答案 0 :(得分:1)
这是我正在使用Kotlin编写的版本,它在API 19、25和28上进行了测试,效果很好。
我将其用于要锚定到屏幕顶部的TableLayout
的浮动标题行。我在viewToDraw
中分配了ViewTreeObserver.onGlobalLayoutListener
,所以我知道标题行的布局。这对我来说很方便,因为无论如何我都在听视图树,但是可以在必要时将其引入CopyView
至invalidate()
中。标题行和CopyView
中的项目设置为固定高度,但您也可以对此进行扩展以复制视图尺寸。
class CopyView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : View(context, attrs, defStyleAttr) {
var viewToDraw: View? = null
set(value) {
field = value
background = value?.background
invalidate()
}
override fun onDraw(canvas: Canvas?) {
viewToDraw?.draw(canvas)
}
}
答案 1 :(得分:0)
试试这个:
public final class DynamicSwipeView extends View {
private View view;
public DynamicSwipeView(Context context) {
super(context);
}
public void setPage(View view) {
this.view = view;
this.invalidate();
}
@Override
protected void onDraw(final Canvas canvas) {
super.draw(canvas);
if (view != null) {
view.draw(canvas);
}
}
}
这只是一个建议,我没试过。
如果它不起作用,您应该使用视图列表并管理这些视图的可见性(当前视图= VISIBLE,其他GONE)。这样做可能更容易。