2

私の質問が理解できるかどうかわかりません。ImageレイアウトにとがありViewGroupます。は、ドラッグ アンド ドロップできるアイテムがある にViewGroup匹敵します。GridView今、私は自分のアイテムをViewGroup画像の上にドラッグすることに興味がありますが、試行するたびに、画像の後ろに消えるため、アイテムの z-index が低いようです。

とそのアイテムを組み合わせてみbringToFrontましたが、うまくいきませんでした。さて、私の質問は、アイテムを兄弟の前ViewGroupに持ち込むことさえ可能かどうかです. 誰もそれを経験したことがありますか?viewgroupsviewgroups

私の xml は次のようになります。どこにGridViewあるのですかViewgroup...画像リソースと画像の可視性はコードで設定されています。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relative_gridview_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="@string/tag_fragment_GridView"
android:background="#FFF"
android:orientation="vertical" >

<ImageView
    android:id="@+id/img"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:visibility="gone" />


<de.test.GridView
    android:id="@+id/grid_view1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/img"
    android:background="#FFF"
    android:gravity="center"
    android:numColumns="auto_fit"
    android:stretchMode="none"
    android:tag="grid_view_tag" >
</de.test.GridView>

編集: このライブラリhttps://github.com/openaphid/android-flipを使用して反転できる動的な量のページがあるため、BaseAdapter を使用してレイアウトを表示します。

私が作成するレイアウトは次のようになります。

public View loadView(final View view, final int position) {

    final GridView dgv = (GridView) view
            .findViewById(R.id.grid_view1);


    dgv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(android.widget.AdapterView<?> arg0, View v,
                int position, long arg3) {

            // Simple click listener for the items...



        }
    });

    dgv.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT < 16) {
                        dgv.getViewTreeObserver()
                                .removeGlobalOnLayoutListener(this);
                    } else {
                        dgv.getViewTreeObserver()
                                .removeOnGlobalLayoutListener(this);
                    }

                    int displayHeight = view.getHeight();
                    int displayWidth = view.getWidth();


                        dgv.initChilds(displayWidth, displayHeight,
                                2,
                                2);
                    } else {
                        mImage = (ImageView) view
                                .findViewById(R.id.img);
                        mImage.getLayoutParams().height = displayHeight / 2;

                        mImage.setImageResource(R.drawable.bild);


                        dgv.initChilds(displayWidth,
                                displayHeight / 2, 2,
                                2);
                    }

                    updateGridView();
                }

            });

    mList.add(view);

    return view;
}

initChilds() メソッドは、ビューグループの各アイテムのサイズを決定します。ロングクリックでビューグループ項目を選択した際に、最前面に設定したいと考えています。longclicklistener は次のようになります。

@Override
public boolean onLongClick(View view) {

    draggedItem = getDraggedView(); draggedItem.bringToFront();
    callback.bringGridToFront();            

    return true;
}

このように項目を前面に移動しようとしましたが、うまくいきません...コールバック変数は、現在次のコードを実行する、bringGridToFront()-Method を呼び出す baseadapter クラスのインスタンスです。

public void bringGridToFront() {
    View view = mList.get(mCurrentPage);
    RelativeLayout rl = (RelativeLayout) view.findViewById(R.id.relative_gridview_layout);
    GridView dgv = (GridView) view.findViewById(R.id.grid_view1);       
    rl.bringChildToFront(dgv);
}
4

3 に答える 3

1

Android は、レイアウト ツリー テーブル内のビューの位置に基づいて z-index を管理します。最大のインデックスを持つビューは、他のビューの上に描画されます。カスタム グリッドはレイアウトの最後のビューであり、最大のインデックスを取得するため、レイアウトでは他のグリッドの上にあります。

あなたのコードでは、あなたが呼び出していることがわかります

draggedItem = getDraggedView();

onLongClick(View ビュー) イベントで。getDraggedView() は、ドラッグしているビューであるビューを返す可能性があり、上部に表示されません (getDraggedView() コードを投稿していないため、これは単なる推測です)。この場合、ドラッグされたビューの親を知る必要があります。たとえば、親がメイン ウィンドウである場合、レイアウト全体がその上に表示されます。したがって、私の最善の推測は、ドラッグされたビューをレイアウトに追加することです。これが最後のビューになるため、一番上に表示されます。

さらに、私はあなたが電話していることに気づきました

mImage.getLayoutParams().height = displayHeight / 2;

高さを変更するには、画像ビューで。View のソース コードの 10130 行目で setLayoutParams コードを参照すると、 layoutparamsのセット以外にもいくつかのことが起こっていることがわかるため、これが正しい方法だとは思いません。ただし、これがあなたの問題に関連しているかどうかはわかりません。

私の答えは完全なものというよりも推測に近いものであることは承知していますが、質問のデータに基づいてできる限りのことです。

お役に立てれば...

于 2013-07-10T11:47:52.077 に答える
0

すべての助けに感謝します。最後に、bringToFront()-Method が機能しないようです。これで、ViewGroups からオーバーライドされた getChildDrawingOrder() メソッドを使用して問題を解決できるようになりました。

この方法を使用すると、子の描画順序を変更できるため、最後に他のすべての上に配置するアイテムを描画できます。例:

@Override
public int getChildDrawingOrder(int childCount, int i) {
    if(mDragged != -1) {

        if(i == mDragged) {
            return childCount-1;
        }
        else if(i == (childCount - 1)) {
            return mDragged;
        }       
        else {
            return i;
        }
    }

    return i;
}

mDragged は、前面に配置する変数です。だから私は最後のものでこの変数の描画位置を変更しました...同じ問題を抱えていた人のためにこの助けを願っています:D

于 2013-07-15T09:14:56.510 に答える