0

我试图允许用户将图像从一个位置拖放到另一个位置。画面布局如下:

1 2 3

4 5 6

7 8 9

我希望用户抓取图像 2、4、6 或 8 并将其拖动到图像 5。拖动到图像 5 后,我想加载一个片段。用户只能将图像从当前位置直线拖动到 5 的位置。即图像2只能向下拖动,直到它超过图像5,图像4只能向右拖动直到超过5,等等。

非常感谢任何有关如何做到这一点的见解。

谢谢, 曼

4

1 回答 1

0

所以我想出了一个让它工作的方法。非常hacky,但我基本上使用图像位置并通过我想要的直接从它的中心的边距转换它,直到它到达所需的位置。

我创建了一个临时图像 (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();

谢谢, 曼

于 2012-12-13T19:27:36.960 回答