当前位置: 首页 > 知识库问答 >
问题:

ACTION\u DOWN或only ACTION\u MOVE in onTouch()

李鹏
2023-03-14

我的观点:

public boolean onTouch(View view, MotionEvent event) {
        Log.d("Touch", "Touch");

        int mNewX = (int) Math.floor(event.getX());
        int mNewY = (int) Math.floor(event.getY());

        boolean isPositionFree = isPositionFree(mNewX, mNewY);

        if (!isPositionFree) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                int i = 0;
                for (Point point : points) { 
                    if (point.spotted) {
                        points.remove(i);
                        invalidate();
                        break;
                    }
                    i++;
                }
            } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
                int i = 0;
                for (Point point : points) { 
                    if (point.spotted) {
                        points.remove(i);
                        Point p = new Point(mNewX, mNewY, point.TYPE);
                        points.add(i, p);
                        invalidate();
                        break;
                    }
                    i++;
                }
            }
        }
}

画布中有多个项目。他们的位置保存在“点”中。他们通过这些“点”的位置(即点-点)以onDraw方法绘制到画布上。x和点。y

现在,当我单击一个项目(画布上的一个点)时,它应该消失。然后,当MotionEvent。ACTION\u MOVE为true,我想根据事件移动点。getX()和事件。getY()。

方法“isPositionFree(newX,newY)”检查点是否。x和点。y等于newX和newY(我刚刚在屏幕上触摸的位置)。

如果选择了该位置(意味着我刚刚单击了一个项目),我将进入motionevent IFs。

问题来了:我的代码在实际移动点之前就删除了它。我好几个小时都没有找到解决这个问题的方法。:/我发现这很难,因为onTouch总是从一开始就被调用,意味着ACTION\u DOWN和ACTION\u MOVE永远不会同时发生。

你知道有什么办法吗?

提前谢谢你,塞巴斯蒂安

共有3个答案

闾丘淇
2023-03-14

尝试使用switch case语句:

切换finger\u动作:

case(ACTION_MOVE)
{
//move code
return false;
}
case(ACTION_TOUCH)
{
//dissappear code
return false;
}

请注意上面的代码是伪代码,但它所做的是在触摸之前检查您是否正在移动点。这样,点将首先尝试移动而不是首先被删除。

谢谢,亚历克斯

狄心水
2023-03-14

我只是建议大家四处走走:

不要在单击时删除该点,而是在类中创建一个privata点,您当前在其中删除该点,只需将新变量点设置为您要删除的点。。。

然后,在action或action move中使用它后,在最后一个要使用它的地方,检查您的私有变量是否为null,如果是,请删除它,然后将其设置为null。

狄晟睿
2023-03-14

让它工作!

对于有同样问题的人,请随时使用此示例代码作为帮助:)

我一开始宣布的东西

Vector<Point> points = new Vector<Point>();

Bitmap[] monsterTypes = new Bitmap[3];

Vector<Integer> distanceMovedX = new Vector<Integer>();
Vector<Integer> distanceMovedY = new Vector<Integer>();

int mNewX = -1;
int mNewY = -1;

OnTouch方法

public boolean onTouch(View view, MotionEvent event) {

        mNewX = (int) FloatMath.floor(event.getX());
        mNewY = (int) FloatMath.floor(event.getY());

        boolean touchedPoint = touchedPoint(mNewX, mNewY);

        switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:

            distanceMovedX.add(mNewX);
            distanceMovedY.add(mNewY);
            break;
        case MotionEvent.ACTION_UP:

            isMoveEvent = isMoveEvent();
            if (isMoveEvent) {
                for (Point point : points) {

                    if (point.spotted) {

                        // Your code
                    } 
                    i++;
                }
            } else {
                if (touchedPoint) {
                    for (Point point : points) { 
                        if (point.spotted) {

// Your code
                        }
                    }
                }
            }
            distanceMovedX.clear();
            distanceMovedY.clear();
            return true;
        }
        return true;
    }

触摸点-方法

public boolean touchedPoint(int mNewX, int mNewY) {
        boolean touchedPoint = false;
        int height = 0;
        int width = 0;

        for (Point point : points) {
            height = monsterTypes[point.TYPE - 1].getHeight();
            width = monsterTypes[point.TYPE - 1].getWidth();

            if (point.x + width < mNewX || point.x > mNewX + width
                    || point.y + height < mNewY || point.y > mNewY + height) {
                touchedPoint = false;
                point.spotted = false;
            } else {
                touchedPoint = true;
                point.spotted = true;
                return touchedPoint;
            }
        }
        return touchedPoint;
    }

isMoveEvent方法

public boolean isMoveEvent() {
        boolean isMoveEvent = false;
        boolean isMoveEventX = false;
        boolean isMoveEventY = false;

        for (int i = 0; i <= (points.size() -1); i++) {
            Log.d("point", "for loop entered");

            if (!distanceMovedY.isEmpty()) {
                Log.d("point.x", "distanceMovedY is not empty");
                int dMY = distanceMovedY.get(distanceMovedY.size() - 1) - distanceMovedY.get(0);

                if ((dMY > 50 || dMY <= 0) && dMY != 0) {
                    Log.d("point.y", "is move event");
                    Log.d("point.y", "dMY: " + dMY);
                    isMoveEventY = true;
                } else {
                    Log.d("point.x", "is no move event");
                    Log.d("point.x", "dMY: " + dMY);
                    isMoveEvent = false;
                    return isMoveEvent;
                }
            }
            if (!distanceMovedX.isEmpty()) {
                Log.d("point.x", "distanceMovedX is not empty");
                int dMX = distanceMovedX.get(distanceMovedX.size() - 1) - distanceMovedX.get(0);

                if (dMX <= 50 && dMX >= -50 && dMX != 0) {
                    Log.d("point.x", "is move event");
                    Log.d("point.x", "dMX: " + dMX);
                    isMoveEventX = true;
                } else {
                    Log.d("point.x", "is no move event");
                    Log.d("point.x", "dMX: " + dMX);
                    isMoveEvent = false;
                    return isMoveEvent;
                }
            }
            if (isMoveEventX && isMoveEventY) {
                Log.d("point", "is move event");
                isMoveEvent = true;
                return isMoveEvent;
            }
        }
        Log.d("point", "is no move event");
        return isMoveEvent;
    }

Point类

类点{int x, y; int类型;布尔点;布尔半点;

public Point() {
}

public Point(int x, int y, int t) {
    this.x = x;
    this.y = y;
    this.TYPE = t;
}

@Override
public String toString() {
    return x + ", " + y;
}

}

说明:

点:我们有一个类点。矢量中声明的所有点都是画布上的x和y坐标。它们帮助我们检查我们点击的位置。

怪物类型:这是我使用的不同图形。如果您只使用在画布上绘制的一个图形,请根据需要进行更改

距离移动DX

mNewX公司

方法:

onTouch():首先,我们将mNewX和Y覆盖到当前触摸的位置。然后我们检查我们是否点击了现有的位置(在我的例子中是一些48px*48px区域)。接下来我们以ACTION_MOVE记录拍摄的距离。之后我们继续ACTION_UP,在那里我们检查我们是否刚刚执行了一些moveEvent或clickEvent。

TouedPoint():计算我们是否触摸了画布上的某个现有点。返回真或假

isMoveEvent():检查是否移动了一定距离。在我的情况下,我想向下移动,50像素或更多。虽然不允许im侧向移动-50px或50px。如果不是移动事件,最后一个接触的点仍然必须在给定距离的上(在我的例子中是在点的48px*48px范围内)。

就这样。我花了几天时间才弄清楚这个选项;/为此感到羞耻...虽然我写得很快,但让我感觉好点的是: D

 类似资料:
  • 我只是试着编一个足球比赛的程序,在完成了所有的绘画和初始化球员和球之后,我现在正处于尝试移动球员的位置。我看了一些关于如何在游戏中编程运动的教程,但它们都使用了键盘监听器。正如我在网上写的,KeyListener不是一个好方法。(是否仍有使用KeyListeners的情况?)。然而,我正在努力实现一个平稳、正确的动作。我找不到以“正确”的方式教授这一点的在线资源。我之所以指定“正确”的方式,是因为

  • 目录 为何 type 必须是字符串,或者至少可以被序列化? 为什么 action 类型应该作为常量? 是否存在 reducer 和 action 之间的一对一映射? 怎样表示类似 AJAX 请求的 “副作用”?为何需要 “action 创建函数”、“thunk” 以及 “middleware” 类似的东西去处理异步行为? 应该使用什么样的异步中间件? 怎样在 thunks、sagas、observ

  • 首先,让我们来给 action 下个定义。 Action 是把数据从应用(译者注:这里之所以不叫 view 是因为这些数据有可能是服务器响应,用户输入或其它非 view 的数据 )传到 store 的有效载荷。它是 store 数据的唯一来源。一般来说你会通过 store.dispatch() 将 action 传到 store。 添加新 todo 任务的 action 是这样的: const A

  • Extends Widget An executable item that is integrated in the application’s navigation menu. Add a listener on select to implement the action. Import this type with “const {Action} = require('tabris');”

  • Action(事务) 启动一个事务action( $callback ) $callback [function] 事务内执行的方法.Return: void不是每个数据库引擎都支持事务。你必须在使用前检查。如果返回false,则回滚事务。 $database->action(function($database) { $database->insert("account", [

  • Action(事务) 启动一个事务action( $callback ) $callback [function] 事务内执行的方法.Return: void不是每个数据库引擎都支持事务。你必须在使用前检查。如果返回false,则回滚事务。 $database->action(function($database) { $database->insert("account", [