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