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ので、ヘッダー行がレイアウトされていることがわかります。とにかくビューツリーを聞いていたので便利でしたが、必要に応じてに持ち込むことができまし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)
    }
}
于 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、その他はGONE)。そのようにする方が簡単かもしれません。

于 2013-01-02T14:02:34.210 に答える