gpt4 book ai didi

java - 在android中正确处理onTouch和onClick事件

转载 作者:行者123 更新时间:2023-12-01 22:24:53 24 4
gpt4 key购买 nike

我正在使用以下代码在屏幕上拖动 View

   tweatBtn.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
float currX,currY;

int action = event.getAction();
switch (action ) {
case MotionEvent.ACTION_DOWN:
{
mPrevX = event.getRawX();
mPrevY = event.getRawY();

btnPrevX = tweatBtn.getX();
btnPrevY = tweatBtn.getY();

break;
}

case MotionEvent.ACTION_MOVE:
{
Display display = getActivity().getWindowManager().getDefaultDisplay();
int width = display.getWidth() + 80; // deprecated
int height = display.getHeight(); // deprecated

currX = event.getRawX();
currY = event.getRawY();
if(tweatBtn.getY() > 80 && tweatBtn.getX() > 0 && tweatBtn.getX() < width)
{
tweatBtn.setX(btnPrevX + currX - mPrevX);
tweatBtn.setY(btnPrevY + currY - mPrevY);
}
else
{
if((btnPrevY + currY - mPrevY) > 70 && (btnPrevX + currX - mPrevX) > -10 && tweatBtn.getX() < (width - 10))
{
tweatBtn.setX(btnPrevX + currX - mPrevX);
tweatBtn.setY(btnPrevY + currY - mPrevY);
}
}
break;
}

case MotionEvent.ACTION_CANCEL:
break;

case MotionEvent.ACTION_UP:
break;
}
return false;
}
});
}

它工作正常,但有时当我抬起手指时,它会自动触发点击。我该如何改进?

最佳答案

您在代码末尾始终返回false。这意味着您设置的 touchListener 不处理触摸。因为如果它,View 会将任何正常的触摸视为点击。你应该做的是当 View 被拖动时返回True,否则你应该返回False

 boolean dragged = false;
ViewConfiguration viewConfiguration = ViewConfiguration.get(getContext());
int minTouchSlop = viewConfiguration.getScaledTouchSlop();

.....

public boolean onTouch(View v, MotionEvent event)
{
float currX,currY;

int action = event.getAction();
switch (action ) {
case MotionEvent.ACTION_DOWN:
{
mPrevX = event.getRawX();
mPrevY = event.getRawY();

btnPrevX = tweatBtn.getX();
btnPrevY = tweatBtn.getY();

dragged = false; // global dragged variable

break;
}

case MotionEvent.ACTION_MOVE:
{
Display display = getActivity().getWindowManager().getDefaultDisplay();
int width = display.getWidth() + 80; // deprecated
int height = display.getHeight(); // deprecated

currX = event.getRawX();
currY = event.getRawY();

if(Math.abs(currX-mPrevX) > minTouchSlop || Math.abs(currY-mPrevY) > minTouchSlop)
dragged = true; // differntiate btw drag or click


if(tweatBtn.getY() > 80 && tweatBtn.getX() > 0 && tweatBtn.getX() < width)
{
tweatBtn.setX(btnPrevX + currX - mPrevX);
tweatBtn.setY(btnPrevY + currY - mPrevY);
}
else
{
if((btnPrevY + currY - mPrevY) > 70 && (btnPrevX + currX - mPrevX) > -10 && tweatBtn.getX() < (width - 10))
{
tweatBtn.setX(btnPrevX + currX - mPrevX);
tweatBtn.setY(btnPrevY + currY - mPrevY);
}
}
break;
}

case MotionEvent.ACTION_CANCEL:
break;

case MotionEvent.ACTION_UP:
break;
}
return dragged;
}

关于java - 在android中正确处理onTouch和onClick事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com