我刚刚开始开发 android 应用程序(使用 java,在 android studio 中,如果这很重要的话),我正在做一个小项目,只是为了好玩。我想创建自己的国际象棋应用程序,到目前为止我已经做了很多事情。我设置了一个菜单来切换到另一个活动,即游戏本身,我用自绘板制作了一个自定义视图,我认为我的模型也几乎完成了。我唯一不明白的是如何处理拖动。那么,当您使用拖动手势将一个位置从一个位置移动到另一个位置时,如何获得它的起点和终点呢?
如前所述,我已经在我的模型中实现了一个移动(使用函数移动(位置开始,位置结束)),并且它还检查该移动对于某个棋子是否有效,但我仍然需要的唯一东西是让我在实际的棋盘上拖动一块。
我正在考虑在我的 Controller 类中添加一个 onDrag 方法,但我不知道如何解决这个问题,并且在互联网上找不到好的例子。我已经开始这样做了,但不知道它是否可行。
你能帮我实现拖动吗?
提前致谢!
附:
如果有帮助的话,我还将在我的问题中添加自定义视图和(尚未完成)控制器的代码。如果您需要更多我的代码来回答这个问题,我也会把它放在这里,请告诉我。
public class ChessView extends View implements Observer {
private Game game;
private static final Paint WHITE_PAINT = new Paint(), BLACK_PAINT = new Paint();
public ChessView(Context context) {
super(context);
init();
}
public ChessView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ChessView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void init() {
WHITE_PAINT.setColor(Color.rgb(200, 159, 77));
BLACK_PAINT.setColor(Color.rgb(61, 34, 18));
}
public void setGame(Game game) {
if (this.game != null)
this.game.deleteObserver(this);
this.game = game;
this.game.addObserver(this);
}
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (game == null)
return;
drawBoard(canvas);
drawPieces(canvas);
}
public void drawBoard(Canvas canvas) {
int tilesize = Math.min(getWidth(), getHeight())/8;
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++) {
Paint paint = ((i + j) % 2 == 0) ? WHITE_PAINT : BLACK_PAINT;
canvas.drawRect(i*tilesize, j*tilesize,(i+1)*tilesize, (j+1)*tilesize, paint);
}
}
public void drawPieces(Canvas canvas) {
for (int i = 0; i < game.getBoard().boardSize(); i++)
for (int j = 0; j < game.getBoard().boardSize(); j++) {
Position pos = new Position(i, j);
Piece p = game.getBoard().getPiece(pos);
if (p != null)
drawPiece(canvas, p, pos);
else
clearPos(canvas, pos);
}
}
public void drawPiece(Canvas canvas, Piece piece, Position position) {
switch (game.getBoard().getPiece(position).getId()) {
case ("wpawn"): drawPicture(canvas, position, R.drawable.wpawn); break;
case ("bpawn"): drawPicture(canvas, position, R.drawable.bpawn); break;
case ("wrook"): drawPicture(canvas, position, R.drawable.wrook); break;
case ("brook"): drawPicture(canvas, position, R.drawable.brook); break;
case ("wknight"): drawPicture(canvas, position, R.drawable.wknight); break;
case ("bknight"): drawPicture(canvas, position, R.drawable.bknight); break;
case ("wbishop"): drawPicture(canvas, position, R.drawable.wbishop); break;
case ("bbishop"): drawPicture(canvas, position, R.drawable.bbishop); break;
case ("wqueen"): drawPicture(canvas, position, R.drawable.wqueen); break;
case ("bqueen"): drawPicture(canvas, position, R.drawable.bqueen); break;
case ("wking"): drawPicture(canvas, position, R.drawable.wking); break;
case ("bking"): drawPicture(canvas, position, R.drawable.bking); break;
default: break;
}
}
public void drawPicture(Canvas canvas, Position position, int picture) {
int tilesize = Math.min(getHeight(), getWidth())/8, x = position.getY(), y = position.getX();
Drawable d = ResourcesCompat.getDrawable(getResources(), picture, null);
Bitmap b = ((BitmapDrawable) d).getBitmap();
canvas.drawBitmap(b, null, new Rect(x*tilesize, y*tilesize,(x + 1)*tilesize, (y + 1)*tilesize), null);
}
public void clearPos(Canvas canvas, Position position) {
int tilesize = Math.min(getWidth(), getHeight())/8, x = position.getY(), y = position.getX();
Paint paint = ((position.getX() + position.getY()) % 2 == 0) ? WHITE_PAINT : BLACK_PAINT;
canvas.drawRect(x*tilesize, y*tilesize, (x + 1)*tilesize, (y + 1)*tilesize, paint);
}
@Override
public void update(Observable observable, Object data) {
this.postInvalidate();
}
}
public class Controller extends Observable implements View.OnDragListener {
private Game game;
public Controller(Game game) {
this.game = game;
}
@Override
public boolean onDrag(View v, DragEvent event) {
float startx = event.getX();
float starty = event.getY();
if (event.getAction() == DragEvent.ACTION_DRAG_ENDED) {
}
return false;
}
}