如何处理 Android 国际象棋应用程序中的拖动?

2024-04-26

我刚刚开始开发 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;
        }
    }

希望这样的事情能给你带来这样的想法:

@Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            ...               
            view.startDrag(clipData, dsb, view, 0);
            ...
            return true;
        } else {
            return false;
        }
    }

 @Override
    public boolean onDrag(View view, DragEvent dragEvent) {
        int dragAction = dragEvent.getAction();
        View dragView = (View) dragEvent.getLocalState();
        if (dragAction == DragEvent.ACTION_DRAG_EXITED) {
            containsDragable = false;
        } else if (dragAction == DragEvent.ACTION_DRAG_ENTERED) {
            containsDragable = true;
        } else if (dragAction == DragEvent.ACTION_DROP && containsDragable){
            //your function to move and check valid moves
            dragView.setVisibility(View.VISIBLE);
        }
        return true;
    }

Ref: https://www.javacodegeeks.com/2011/12/android-drag-and-drop-tutorial.html https://www.javacodegeeks.com/2011/12/android-drag-and-drop-tutorial.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 Android 国际象棋应用程序中的拖动? 的相关文章

  • 使用 Android Intent 发送基于 HTML 的电子邮件正文

    我需要使用 android Intent extra 将基于 HTML 的内容发送到电子邮件应用程序 它接受一些标签 例如 br 但它没有显示任何锚链接或 h1 其显示像简单的文本 EDITED I have tried with gmai
  • Apache POI - JAVA - 迭代 Excel 中的列

    这里是java新手 我正在编写一个代码 该代码读取 Excel 文件 查看列中的单元格 然后编写如下表所示的内容 我有一个 Excel 文件 如下所示 col1 col2 col3 col4 row1 2 3 1 1 w row2 3 2
  • 从壁纸中获取颜色? - 安卓

    如何找到当前壁纸的 平均 颜色并将该颜色设置为我的小部件上的布局 我正在尝试做的一个例子 这是 AccuWeather 上的设置 您可以使用WallpaperManager getWallpaperColors https develope
  • 我如何在 Android 中跟踪收到的短信?

    我正在开发一个应用程序 想要跟踪传入的短信 我需要一个可以使用的示例代码或例程 如果您为传入短信实施广播接收器 在这种情况下 以下代码将跟踪您传入的短信并为您提供消息和发件人号码 import android content Broadca
  • 如果Jetty的密钥库中有多个证书,它如何选择?

    我们的系统中有一些代码用于自动将自签名证书生成到密钥库中 然后由 Jetty 使用 如果给定主机的密钥已经存在 那么什么也不会发生 但如果它不存在 我们会生成一个新密钥 如下所示 public void generateKey String
  • 在其抽象超类中使用子类的泛型类型?

    在我的代码中有以下抽象超类 public abstract class AbstractClass
  • 当从搜索表单动态构建 WHERE 子句时,如何防止 SQL 注入?

    我知道在 Java 中保护 SQL 查询免受 SQL 注入的唯一真正正确的方法是使用准备好的语句 然而 这样的语句要求基本结构 选择的属性 连接的表 WHERE条件的结构 不会改变 我这里有一个 JSP 应用程序 其中包含一个带有大约十几个
  • 应用程序被终止时无法处理 FCM 消息

    我一直在阅读各种教程 其他 SO 线程以及官方 Android 开发人员和 Firebase 文档 但无济于事 我已经尝试了几乎所有的方法 但我已经耗尽了精力和时间 因为我正在修复以前可以工作但现在不再工作的通知系统 我正在使用 Azure
  • 需要在 java api 中的 Solr 搜索中搜索文本及其周围的几行

    我正在使用 solr 7 7 2 并且我使用 solrj 在 Solr 中编写了一个 Java 程序 该程序在一个巨大的文本文件中搜索单词 我使用以下代码来显示代表整个文本的搜索结果 SolrQuery params new SolrQue
  • 如何使用 Java glob 模式搜索(区分大小写)文件?

    我正在检查获取路径匹配器 http docs oracle com javase 7 docs api java nio file FileSystem html getPathMatcher 28java lang String 29的方
  • 将 XML 转换为 Java 对象 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何对动态渲染 html 和 css 的 Java 代码进行单元测试?

    我有一个 Java 类 它从数据库获取表单定义 然后根据表单定义呈现 html javascript 和 css 它使用大量 appendable append append 来构建html 片段 这很容易出错 Jsp 和通用模板框架 例如
  • Android - 使用 HttpURLConnection 来 POST XML 数据

    我遇到了一些死胡同 需要一些帮助 请 我对 Android 开发 以及一般编码 非常陌生 基本上我需要使用 HttpURLConnection 将 XML 数据发布到 URL 但无法让它工作 我的应用程序从 GET 请求读取并传递 XML
  • 遍历多行字符串

    我得到一些数据 def data some useless text n even more n finally interesting text 我怎样才能得到其中 有趣的部分 所以基本上所有行都不是以 开头的 Groovy 的一种选择是
  • Java:如何复制对象数组?

    现在 我有一个 Point 对象数组 我想制作一个COPY该数组的 我尝试过以下方法 1 Point temp mypointarray 2 Point temp Point mypointarray clone 3 Point temp
  • OutputStream 到 DB2 数据库表的 BLOB 列

    在 DB2 数据库中 我有下表 CREATE TABLE MyTestTable MYPATH VARCHAR 512 NOT NULL MYDATA BLOB CONSTRAINT MYTESTTABLE PK PRIMARY KEY M
  • Spring Data 中 IQueryable 的等效项

    我习惯了 Net 和 LINQtoEntities 尤其是 IQueryable 部分 它允许在获取结果之前通过不同的函数传送请求 Spring数据中是否存在类似的东西 或者任何其他 java ORM 我希望能够做的基本示例 private
  • 如何在 Android 上从后台线程显示 Toast?

    我怎样才能显示Toast http developer android com guide topics ui notifiers toasts html来自线程的消息 您可以通过调用Activity s runOnUiThread您线程中
  • 使用 jar 外部的配置启动 .jar,但能够从任何当前目录执行此操作

    我一直在努力解决一个特定的问题 我在 jar 文件中有一个 Java 程序 并且在 jar 之外有一个 lib 目录和一个 config 目录 但与 jar 本身所在的目录位于同一目录中 我正在尝试参考config foo config从代
  • 需要在 Android 应用程序卸载期间执行一些活动

    我正在开发一个应用程序 如果用户卸载该应用程序 我需要登录该应用程序 所以我正在遵循这种方法应用程序如何检测到它将被卸载 https stackoverflow com questions 18692571 how it works war

随机推荐

  • Makefiles:从一个目录获取.cpp,并将编译后的.o放在另一个目录中

    我正在开发适用于移动设备 Windows Mobile 6 和 Android 的跨平台 2D 引擎 我的 Windows 版本已基本准备就绪 但我仍需要确保 Android 上也提供相同的功能 我想要的是一个Makefile在项目的根目录
  • 外部化各种 React 组件中的通用函数

    在不同的components在样式或其他方面我使用相同的功能 其中一些函数使用this setState 我想将所有这些函数收集在一个公共位置 因此在重写它们时 我不必在所有组件中重写它们 而只需在一个文件中重写它们 但是 我不知道如何写t
  • Unicode字符串的跨平台迭代(使用ICU计算字素)

    我想迭代每个字符一个 Unicode 字符串 处理每个代理对并将字符序列组合为一个单元 一个字素 Example 文本 由代码点组成 U 0928 U 092E U 0938 U 094D U 0924 U 0947 其中 U 0938 a
  • 如何更改反应导航中的后退按钮路线

    我正在使用反应导航 堆栈导航 我想更改我的标题后退按钮图标路线 Home 订票 我的预订 这些是我项目中的屏幕 现在 当我单击 MyBookings 屏幕中的标题后退按钮时 它应该路由到主屏幕 如果您的 stackNavigator 堆栈配
  • Git 术语:tip 和 HEAD 之间的区别?

    和Git有什么区别HEAD and tip 抱歉 如果在其他地方有人问过这个问题 没有看到任何其他关于此的问题 From 吉特词汇表 https git scm com docs gitglossary html 可能通过git help
  • 使用opencv在灰度图像中绘制彩色矩形

    是否可以使用opencv在灰度图像中绘制彩色矩形 我尝试了几种方法 但整个图像要么变成灰度 要么变成 RGB 您不能获得混合的灰色和彩色图像 你可以看看有没有办法在同一图像opencv C 上同时拥有灰度和RGB像素 https stack
  • 如何为幻灯片中的每个图像添加链接?

    我使用了 为什么这张幻灯片闪烁 中的代码 彼得在网站上给出了您的答案之一 它工作得很好 没有任何闪烁 但我的问题是如何为每个图像添加超链接 我把代码贴出来供大家参考 Script function Edit these Assumes yo
  • jQuery $(window).resize() 在减小窗口高度时不起作用

    我有一个 id 为 main 的 div 我想使用 jQuery 设置它的高度并使其在window resize它的高度是使用函数修改的 但由于某种原因 它仅在增加窗口高度时才能正常工作 而在减小窗口高度时则不起作用 这是JS functi
  • 设置 sendBufferSize() 后,UDP 套接字的消息太长

    我正在尝试发送 UDP 数据报 包含协议缓冲区消息 并收到消息太长的异常 java io IOException Message too long at java net PlainDatagramSocketImpl send Nativ
  • Angular 动态表上的 Jquery 表排序器

    我有一个表 需要使用 Jquery Tablesorter 插件进行排序等 它对于静态表工作得很好 但是当我尝试在 Angular 支持的表上使用时 它不起作用 有谁知道为什么会这样 http plnkr co edit SUjs1h7pr
  • Vaadin 7.0.1 带有 JPAContainer 和 FieldGroup 的组合框

    抱歉 如果这是一个新问题 我有两个 JPAContainer 一个用于 Employee 类 表 一个用于语言类 表 员工可以选择一种语言 我正在尝试创建一个员工编辑表单 其中包含用于语言选择的组合框和用于处理绑定和创建的 FieldGro
  • 获取进程的返回值

    您好 我正在尝试执行以下操作 我有一个可以接受参数 数字 的过程 并返回这些数字的总和 Process P Process Start sPhysicalFilePath Param int result P ExitCode 我从 Exi
  • 如何在不锁定 Excel 文件的情况下打开它?

    我有一个构建 Excel 报告 然后为用户打开它的流程 问题是 如果有人让文件保持打开状态 则该文件将保持锁定状态 并且在第一个人退出 Excel 文件之前 其他人都无法生成报告 有没有办法打开 Excel 文件而不锁定它 使用Proces
  • android什么时候会在没有唤醒锁的情况下停止CPU?

    我知道 android 使用唤醒锁来保持 cpu 运行或屏幕打开 很明显 屏幕唤醒锁可以防止用户活动计时器在用户不活动一段时间后关闭屏幕 但我想知道cpu唤醒锁到底什么时候生效 1 如果我创建一个新线程并在没有任何唤醒锁的情况下在后台继续耗
  • 如何在 Jupyter Notebook 中加载 CSV 文件?

    我是新人 正在研究机器学习 我偶然发现了一个在网上找到的教程 我想让该程序运行起来 这样我就能更好地理解 但是 我在将 CSV 文件加载到 Jupyter Notebook 时遇到问题 我收到此错误 File
  • “sendKeys”在 Selenium WebDriver 中不起作用

    我无法使用 WebDriver 在我的应用程序中赋予任何价值 我的应用程序正在使用框架 我可以清除文本框的值driver findElement By name name clear 但我无法使用任何值driver findElement
  • Jenkins JobDSL multibranchPipelineJob更改脚本路径

    我正在尝试在 jobDSL 中创建多分支PipelineJob 但是 Jenkinsfile 位于默认位置的替代位置 我已经查看了文档https jenkinsci github io job dsl plugin path multibr
  • 上传到服务器后,页面上只有一个 getter 起作用

    我有一个使用 Struts2 框架的网站 它在我的本地计算机上运行良好 但是当我将其上传到远程服务器 托管 时 一些 getter 和 setter 变得不调用 例如 操作 ForecastAction java JSP 预测 jsp 这是
  • 在 cakephp 2.0.2 中使用 shell 类的插件组件

    我想使用我的 shell 类中的插件组件 我正在尝试使用 App import Component Myplugin Mycomponent this gt Mycomponent new MycomponentComponent 不幸的是
  • 如何处理 Android 国际象棋应用程序中的拖动?

    我刚刚开始开发 android 应用程序 使用 java 在 android studio 中 如果这很重要的话 我正在做一个小项目 只是为了好玩 我想创建自己的国际象棋应用程序 到目前为止我已经做了很多事情 我设置了一个菜单来切换到另一个