我需要创建一个能够在不同视图之间滑动的自定义视图。我不能使用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);
}
}
}
但是另一个视图(如果直接使用可以工作)不会被绘制。当我在构造函数中为这个滑动视图指定一个背景色时,它会以那个颜色而不是白色显示,但另一个视图仍然不会被绘制。
这是我用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)
}
}
try this:
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);
}
}
}
这只是一个建议,我还没有试过。如果它不起作用,你应该使用视图列表并管理这些视图的可见性(当前视图=可见,其他视图已消失)。这样做可能更容易。