0

我需要创建一个能够在不同视图之间滑动的自定义视图。我不能使用 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);
        }
    }
}

但是没有绘制另一个视图(如果直接使用则有效)。当我在构造函数中为此滑动视图分配背景颜色时,它会以该颜色而不是白色显示,但仍然不会绘制另一个视图。

4

2 回答 2

1

这是我正在使用的用 Kotlin 编写的版本,它运行良好,在 API 19、25 和 28 上进行了测试。

我将它用于浮动标题行TableLayout,我想将它锚定到屏幕顶部。我分配viewToDraw了一个,ViewTreeObserver.onGlobalLayoutListener所以我知道标题行是布局的。这对我来说很方便,因为无论如何我都在听视图树,但是可以在必要时将其带入CopyViewto 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)
    }
}
于 2018-12-14T01:27:14.900 回答
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,其他视图已消失)。这样做可能更容易。

于 2013-01-02T14:02:34.210 回答