用户界面 - Android:如何在自定义视图的onDraw()方法中绘制另一个视图



我需要创建一个能够在不同视图之间滑动的自定义视图。我不能使用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中,因此我知道标题行已布局。这对我来说很方便,因为我正在收听视图树,但必要时可以将其带入CopyViewinvalidate()。标题行和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);
        }
    }
}
这只是一个建议,我还没有试过。

如果它不起作用,你应该使用视图列表并管理这些视图的可见性(当前视图=可见,其他视图已消失)。这样做可能更容易。

相关内容

  • 没有找到相关文章

最新更新