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

时间:2013-01-02 13:22:10

标签: android user-interface drawing

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

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

2 个答案:

答案 0 :(得分:1)

这是我正在使用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)
    }
}

答案 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)。这样做可能更容易。