0

ユーザーがドラッグアンドドロップして画像をある位置から別の位置に移動できるようにしようとしています。画面構成は次のとおりです。

1 2 3

4 5 6

7 8 9

ユーザーに画像 2、4、6、または 8 をつかんで、画像 5 にドラッグしてもらいます。画像 5 にドラッグすると、フラグメントをロードしたいと思います。ユーザーは、画像を現在の位置から 5 の位置まで直線でのみドラッグできます。つまり、画像 2 は下にのみドラッグし、画像 5 の上に来るまでのみ、画像 4 は 5 の上に達するまで右にのみドラッグできます。

これを行う方法についての洞察は大歓迎です。

ありがとう、Dマン

4

1 に答える 1

0

そこで私はそれを機能させる方法を考え出しました。かなりハックですが、基本的には画像の位置を使用し、目的の位置に到達するまで、中心から必要な直接のマージンを介して移行します。

一時画像 (mTempImage) を作成し、メイン画像を非表示にしました。これは、画像がレイアウト内の特定のアイテムの上にとどまるように強制し、そのアイテムの高さよりもマージンが少なくならないようにするレイアウトでパラメーターが設定されているためです。

これが私のonTouchListenerのサンプルです

int eventX = (int)event.getX();
                    int eventY = (int)event.getY();

                    int movingViewHeight = view.getHeight();
                    int movingViewWidth = view.getWidth();

                    int destinationTileTop = mTileHere.getTop();
                    int destinationTileLeft = mTileHere.getLeft();

                    // Transparent 'Tile Here' image (1)
                    // Transitional 'Tile Here' image (0 - 1)
                    // Opaque 'Tile Here' image (0)
                    float alphaMultiplier = 0;

                    switch(view.getId()) {
                    case R.id.item_position_2:  
                        // Only allow sliding down from center of object (positive eventY)
                        if (eventY > movingViewHeight / 2) {
                            // Calculate the amount that the image has moved from it's center point
                            int posFromImgCenter = (eventY - movingViewHeight / 2);
                            // Check if the image has reached the center point and stop it's motion any farther
                            if (posFromImgCenter >= destinationTileTop) {
                                params.setMargins(view.getLeft(), destinationTileTop, 0, 0);
                                alphaMultiplier = 1;
                            }
                            // Slide the image with the positioning of the persons finger
                            else {
                                params.setMargins(view.getLeft(), posFromImgCenter, 0, 0);
                                alphaMultiplier = ((float)posFromImgCenter / (float)destinationTileTop);
                            }

                        }
                        // Attempting to slide in an invalid direction leave the image where it is
                        else 
                            params.setMargins(view.getLeft(), view.getTop(), 0, 0);

... MORE CODE HERE FOR OTHER ITEM POSITIONS

// AFTER SWITCH STATEMENT COMPLETE UPDATE VIEW ITEMS ACCORDINGLY

// default 0 if not set with valid movement
                    mTileHere.setAlpha((int)(255 - (255 * alphaMultiplier)));
                    mTempImage.setLayoutParams(params);
                    mTempImage.invalidate();

ありがとう、Dマン

于 2012-12-13T19:27:36.960 に答える