gpt4 book ai didi

android - 将 View 添加到 RelativeLayout 不尊重初始布局

转载 作者:行者123 更新时间:2023-11-30 03:05:28 25 4
gpt4 key购买 nike

我正在创建一个文字游戏,棋盘上有一堆方 block 。我开始实现触摸和移动瓷砖的运动事件并遇到问题。当我触摸一个图 block (ACTION_DOWN) 时,我将其从当前 View 中删除并将其移动到另一个父 View 。我设置了它的新布局,但不遵守该布局,图 block 在新 View 中移动到 0,0。我有相同的代码来定义 ACTION_MOVE 事件中的图 block 位置,并且它按预期运行。所以我看到的是我触摸了一个图 block ,它在新 View 中弹出到 0,0,然后当我移动手指时它弹回到我的手指下并按照我的预期移动。这是代码:

我的 Tile 类扩展了 View,我的板类 TileViewContainer 扩展了 RelativeLayout。

当我创建一个 tile 时,我会像这样为触摸事件注册它:

TileViewContainer gameBoard = (TileViewContainer) findViewById(R.id.gameBoard);
tile.setOnTouchListener(gameBoard);

这是我的 OnTouchListener:

    @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 仍然可以正常工作。

关于android - 将 View 添加到 RelativeLayout 不尊重初始布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com