Android 将视图添加到RelativeLayout不考虑初始布局

Android 将视图添加到RelativeLayout不考虑初始布局,android,android-layout,Android,Android Layout,我正在创造一个文字游戏,一块板上的一堆方形瓷砖。我开始执行触摸和移动瓷砖的动作事件,并出现问题。当我触摸一个平铺(动作向下)时,我会将其从当前视图中移除,并将其移动到另一个父视图中。。我将其设置为新布局,但该布局不受尊重,平铺在新视图中移动到0,0。我有相同的代码来定义ACTION_MOVE事件中的平铺位置,在那里它按预期的方式工作。所以我看到的是,我触摸一块瓷砖,它在新视图中弹出到0,0,然后当我移动手指时,它弹回到我的手指下,并按照我的预期移动。代码如下: 我的Tile类扩展了视图,我的bo

我正在创造一个文字游戏,一块板上的一堆方形瓷砖。我开始执行触摸和移动瓷砖的动作事件,并出现问题。当我触摸一个平铺(动作向下)时,我会将其从当前视图中移除,并将其移动到另一个父视图中。。我将其设置为新布局,但该布局不受尊重,平铺在新视图中移动到0,0。我有相同的代码来定义ACTION_MOVE事件中的平铺位置,在那里它按预期的方式工作。所以我看到的是,我触摸一块瓷砖,它在新视图中弹出到0,0,然后当我移动手指时,它弹回到我的手指下,并按照我的预期移动。代码如下:

我的Tile类扩展了视图,我的board类TileViewContainer扩展了RelativeLayout

创建互动程序时,我会将其注册为触摸事件,如下所示:

TileViewContainer gameBoard = (TileViewContainer) findViewById(R.id.gameBoard);
tile.setOnTouchListener(gameBoard);
以下是我的听众:

    @Override
public boolean onTouch(View v, MotionEvent event) {

    final int X = (int) event.getRawX();
    final int Y = (int) event.getRawY();

    if(tileBoard == null)
        tileBoard = (TileBoard) findViewById(R.id.tileBoard);
    if(tileTray == null)
        tileTray = (TileTray) findViewById(R.id.tileTray);

    Tile tile = (Tile) v;
    TileView parent = tile.lastParent;
    Rect rect = null;
    int size = tileBoard.mTileSize;

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:   

            //Add tile to container
            tile.removeParent();
            this.addView(tile);
            rect = new Rect(X-(size/2), Y-(size), X-(size/2)+size, Y-(size)+size);
            tile.layout(rect.left, rect.top, rect.right, rect.bottom);  
            break;

        case MotionEvent.ACTION_UP:
            print("action up");
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            print("pointer down");
            break;
        case MotionEvent.ACTION_POINTER_UP:
            print("pointer up");
            break;
        case MotionEvent.ACTION_MOVE:

            //Move tile
            rect = new Rect(X-(size/2) , Y-(size)  , X-(size/2)+size, Y-(size)+size);
            tile.layout(rect.left, rect.top, rect.right, rect.bottom);
            break;
    }

    this.invalidate();
    return true;   

}

我找到了一个解决方案,可以解决任何其他遇到这个问题的人。我将ACTION_DOWN案例更改为:

//Add tile to container
tile.removeParent();
this.addView(tile);
rect = new Rect(X-(size/2), Y-(size), X-(size/2)+size, Y-(size)+size);   
tile.layout(rect.left, rect.top, rect.right, rect.bottom); 
break;
为此:

//Add tile to container
tile.removeParent();
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(sizeScaled, sizeScaled);
params.leftMargin = X-sizeScaled/2;
params.topMargin = Y-sizeScaled;
addView(tile, params);
break;
似乎我需要为初始放置创建一个新的LayoutParams。在“移动”区域中设置tile.layout仍然可以正常工作