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

我目前正在研究Android编程,但是在检测不同的触摸事件时遇到了一个小问题,即正常的触摸按下(在屏幕上按下并立即释放),长按(触摸屏幕并用手指按住它) )和移动(在屏幕上拖动)。


我想做的是在屏幕上放一个(圆的)图像,然后可以拖动它。然后,当我按一下(短按/普通按)时,Toast会提供一些有关它的基本信息。长按它时,会出现一个带有列表的AlertDialog,以选择其他图像(圆形,矩形或三角形)。


我使用自己的OnTouchListener制作了一个自定义View,以检测事件并在onDraw中绘制图像。OnTouchListener.onTouch类似于以下内容:


// has a touch press started?

private boolean touchStarted = false;

// co-ordinates of image

private 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上运行。


jeck猫
浏览 570回答 2
2回答

江户川乱折腾

此代码可以区分单击和移动(拖动,滚动)。在onTouchEvent中,设置标志isOnClick,并在ACTION_DOWN上设置初始X,Y坐标。清除ACTION_MOVE上的标志(注意通常会检测到意外移动,这可以通过THRESHOLD常量解决)。private float mDownX;private float mDownY;private final float SCROLL_THRESHOLD = 10;private boolean isOnClick;@Overridepublic 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检测长按
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
Android