为了账号安全,请及时绑定邮箱和手机立即绑定

检测触摸按压与长按按压与运动?

检测触摸按压与长按按压与运动?

jeck猫 2019-11-29 11:01:38
我目前正在研究Android编程,但是在检测不同的触摸事件时遇到了一个小问题,即正常的触摸按下(在屏幕上按下并立即释放),长按(触摸屏幕并用手指按住它) )和移动(在屏幕上拖动)。我想做的是在屏幕上放一个(圆的)图像,然后可以拖动它。然后,当我按一下(短按/普通按)时,Toast会提供一些有关它的基本信息。长按它时,会出现一个带有列表的AlertDialog,以选择其他图像(圆形,矩形或三角形)。我使用自己的OnTouchListener制作了一个自定义View,以检测事件并在onDraw中绘制图像。OnTouchListener.onTouch类似于以下内容:// has a touch press started?private boolean touchStarted = false;// co-ordinates of imageprivate int x, y;public boolean onTouch(View v, MotionEvent event) {    int action = event.getAction();    if (action == MotionEvent.ACTION_DOWN) {        touchStarted = true;    }    else if (action == MotionEvent.ACTION_MOVE) {        // movement: cancel the touch press        touchStarted = false;        x = event.getX();        y = event.getY();        invalidate(); // request draw    }    else if (action == MotionEvent.ACTION_UP) {        if (touchStarted) {            // touch press complete, show toast            Toast.makeText(v.getContext(), "Coords: " + x + ", " + y, 1000).show();        }    }    return true;}问题在于,印刷机无法正常工作,因为当我随意触摸屏幕时,它还会检测到一点点移动,并取消触摸印刷机,而是在图像周围移动。我引入了一个新变量“ mTouchDelay”,在ACTION_DOWN上将其设置为0,然后在MOVE中将其设置为0,然后在MOVE中将其设置为大于等于3,就执行了“ move”代码。但是我有种感觉,这并不是真正的方法。我还没有发现如何检测长按。真正的罪魁祸首是似乎总是触发的MOVE。有关我大致想要的示例,请参见Android应用程序“ DailyStrip”:它显示了漫画的图像。如果屏幕太大,可以拖动它。您可以点击一次以弹出某些控件,然后长按它以显示选项菜单。PS。我正在尝试使其在Android 1.5上运行,因为我的手机仅在1.5上运行。
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

此代码可以区分单击和移动(拖动,滚动)。在onTouchEvent中,设置标志isOnClick,并在ACTION_DOWN上设置初始X,Y坐标。清除ACTION_MOVE上的标志(注意通常会检测到意外移动,这可以通过THRESHOLD常量解决)。


private float mDownX;

private float mDownY;

private final float SCROLL_THRESHOLD = 10;

private boolean isOnClick;


@Override

public boolean onTouchEvent(MotionEvent ev) {

    switch (ev.getAction() & MotionEvent.ACTION_MASK) {

        case MotionEvent.ACTION_DOWN:

            mDownX = ev.getX();

            mDownY = ev.getY();

            isOnClick = true;

            break;

        case MotionEvent.ACTION_CANCEL:

        case MotionEvent.ACTION_UP:

            if (isOnClick) {

                Log.i(LOG_TAG, "onClick ");

                //TODO onClick code

            }

            break;

        case MotionEvent.ACTION_MOVE:

            if (isOnClick && (Math.abs(mDownX - ev.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - ev.getY()) > SCROLL_THRESHOLD)) {

                Log.i(LOG_TAG, "movement detected");

                isOnClick = false;

            }

            break;

        default:

            break;

    }

    return true;

}

对于上述建议的LongPress,GestureDetector是必经之路。检查以下问答:


使用Android检测长按


查看完整回答
反对 回复 2019-11-29
  • 2 回答
  • 0 关注
  • 560 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信