onTouch,onLong在android中一起点击

时间:2012-06-08 10:01:04

标签: android event-handling ontouchevent onlongclicklistener

我正在动态地将图像视图添加到父版面。我正在onTouch添加图像执行放大/缩小操作。我想删除它上面的onLongPress的添加视图。

img.setOnLongClickListener(longClickAction);
img.setOnTouchListener(touchAction); 

onLongPress:

OnLongClickListener longClickAction = new OnLongClickListener() {

    @Override
    public boolean onLongClick(View v) {

        parentLayout.removeView((ImageView)v);
        return false;
    }
};

onTouch:

OnTouchListener touchAction = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ImageView i = (ImageView)v;

        //perfrom zoom operation on touch of imageview
        zoom(i, event);
        return true; 

    }
};

只有Touch事件正在运行。为什么?我怎么能同时拥有?我哪里出错了?我该怎么做才能删除添加的视图?请帮我。提前致谢。

5 个答案:

答案 0 :(得分:15)

始终为您的视图调用

onTouch,因为这是将事件分派给视图的初始状态。当您长按视图时,这仍然会先调用onTouch,因为您在true中返回onTouch(这意味着您已经消耗了此事件且不应再进一步调度)不要叫onLongPress。诀窍是在false

中返回onTouch

答案 1 :(得分:1)

正如@asenovm 所讨论的那样onTouch()总是被调用,因为它是将事件分派到视图的初始状态,但是如果我们返回值 false onTouch()然后两者都会像魅力一样工作,问题将得到解决。

编辑:我对用户的建议是,不要同时实现OnLongClickListener()和OnTouch(),而是在双击事件中尝试使用OnLongClickListener()函数。

您可以通过以下方式实施双击:

int i = 0;
btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    i++;
    Handler handler = new Handler();
    Runnable r = new Runnable() {

        @Override
        public void run() {
            i = 0;
        }
    };

    if (i == 1) {
        //Single click
        handler.postDelayed(r, 250);
    } else if (i == 2) {
        //Double click
        i = 0;
        ShowDailog();
    }


  }
});

答案 2 :(得分:0)

答案 3 :(得分:0)

试试这个,它对我来说很好。

boolean isMoving= false;

yourView.setOnTouchListener(new View.OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            isMoving = true;
            Log.i("isMoving:", "true");
        }
        if(event.getAction()==MotionEvent.ACTION_UP){
            isMoving=false;
            Log.i("isMoving:","false");
        }
        return false;
    }
});
yourView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        if(!isMoving){
            //do onlongclick event here
        }
        return true;
    }
});;

答案 4 :(得分:0)

如果您需要保持手指静止,那么在科特林(Kotlin)中最简单的方法就是这样

onCreateView 中:

view.setOnTouchListener(this)
view.setOnClickListener(this)
view.setOnLongClickListener {
    if (! isFingerMoving) {
        Toast.makeText(activity, "Long click detected", Toast.LENGTH_LONG).show()
        //do something
    }
    false
}

onTouch 中:

fun onTouch(v: View?, event: MotionEvent): Boolean {
    when (event.actionMasked) {
        MotionEvent.ACTION_DOWN -> {
            isFingerMoving = false
            lastTouchX = event.getX(0)
            lastTouchY = event.getY(0)
            ...
        }
        
        MotionEvent.ACTION_MOVE -> {
            val deltaX = (x - lastTouchX) * event.xPrecision
            val deltaY = (y - lastTouchY) * event.yPrecision
            if ((deltaX.absoluteValue > 0.1) || (deltaY.absoluteValue > 0.1)) 
                isFingerMoving = true            
            ...                 
        }
    }
    return false
}