android中的Handle onClick()和onTouch()都是
我在同一个imageView上执行了onClick()和onTouch(),在onClick()上执行了简单的open Gallery,但问题是我的onClick()不工作,而onTouch()工作正常。有人能告诉我到底是什么问题吗?谢谢。这是我的密码android中的Handle onClick()和onTouch()都是,android,Android,我在同一个imageView上执行了onClick()和onTouch(),在onClick()上执行了简单的open Gallery,但问题是我的onClick()不工作,而onTouch()工作正常。有人能告诉我到底是什么问题吗?谢谢。这是我的密码 boolean isMoved=true; Matrix matrix=new Matrix(); Matrix savedMatrix=new Matrix(); PointF startPoint=new PointF
boolean isMoved=true;
Matrix matrix=new Matrix();
Matrix savedMatrix=new Matrix();
PointF startPoint=new PointF();
PointF midPoint=new PointF();
float oldDist = 1f;
int NONE = 0;
int DRAG = 1;
int ZOOM = 2;
int mode = NONE;
public boolean onTouch(View v, MotionEvent event) {
ImageView imageView = (ImageView) v;
imageView.setScaleType(ScaleType.MATRIX);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
matrix.set(imageView.getImageMatrix());
isMoved = false;
startPoint.set(event.getX(), event.getY());
savedMatrix.set(matrix);
mode = DRAG;
break;
case MotionEvent.ACTION_UP:
if (!isMoved) {
v.performClick();
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
savedMatrix.set(matrix);
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - startPoint.x, event.getY()
- startPoint.y);
} else if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
}
}
isMoved = true;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(midPoint, event);
mode = ZOOM;
isMoved = false;
}
break;
}
imageView.setImageMatrix(matrix);
return true;
}
@SuppressLint("FloatMath")
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return (float) Math.sqrt(x * x + y * y);
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
你还没有给出你的onclick代码,所以我想那是可以的。 您正在从ontouch返回true,返回false在那里它将起作用
如果要执行onClick,那么必须从ontouch返回false。您还没有给出onClick代码,所以我认为这样可以。 您正在从ontouch返回true,返回false在那里它将起作用
当您返回true时,那么onClick method not execute如果您还想执行onClick,那么您必须从ontouch返回false。您可以使用以下逻辑来区分
ontouch()
和onClick()
宣布:
private static final int DurationOfClick = 2000; //duration of tap on screen
private long clickTime;
现在在onTouch(视图v,运动事件)
中写入条件
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
clickTime = Calendar.getInstance().getTimeInMillis();
break;
}
case MotionEvent.ACTION_UP: {
long duration = Calendar.getInstance().getTimeInMillis() - clickTime;
if(duration < DurationOfClick) {
//click event has occurred write ur code
}else{
//touch event has occurred write ur code
}
}
}
return true;
}
@覆盖
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:{
clickTime=Calendar.getInstance().getTimeInMillis();
打破
}
case MotionEvent.ACTION\u UP:{
长持续时间=Calendar.getInstance().getTimeInMillis()-单击时间;
if(持续时间<点击持续时间){
//单击事件已发生,请写入您的代码
}否则{
//发生触摸事件并写入ur代码
}
}
}
返回true;
}
您可以使用以下逻辑来区分onTouch()
和onClick()
宣布:
private static final int DurationOfClick = 2000; //duration of tap on screen
private long clickTime;
现在在onTouch(视图v,运动事件)
中写入条件
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
clickTime = Calendar.getInstance().getTimeInMillis();
break;
}
case MotionEvent.ACTION_UP: {
long duration = Calendar.getInstance().getTimeInMillis() - clickTime;
if(duration < DurationOfClick) {
//click event has occurred write ur code
}else{
//touch event has occurred write ur code
}
}
}
return true;
}
@覆盖
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:{
clickTime=Calendar.getInstance().getTimeInMillis();
打破
}
case MotionEvent.ACTION\u UP:{
长持续时间=Calendar.getInstance().getTimeInMillis()-单击时间;
if(持续时间<点击持续时间){
//单击事件已发生,请写入您的代码
}否则{
//发生触摸事件并写入ur代码
}
}
}
返回true;
}
无论是onClick()
还是onTouch()
都是手势检测器,有一个消费系统。每次您在设备的触觉上做一个手势时,附加到此特定视图的所有手势检测器(onClick()
,onTouch()
,onDoubleTap()
…)都将逐个调用。如果在GestureDetector的末尾返回true,则事件将被消耗,其他GestureDetector将不会被调用。如果返回false,则不会使用事件,并调用下一个GestureDetector
因此,为了执行onClick()
在onTouch()之后调用的onClick()
,请确保在它的末尾返回false。两个onClick()
和onTouch()
都是手势检测器,并且有一个消费系统。每次您在设备的触觉上做一个手势时,附加到此特定视图的所有手势检测器(onClick()
,onTouch()
,onDoubleTap()
…)都将逐个调用。如果在GestureDetector的末尾返回true,则事件将被消耗,其他GestureDetector将不会被调用。如果返回false,则不会使用事件,并调用下一个GestureDetector
因此,要执行onClick()
在onTouch()之后调用的onClick()
,请确保在其末尾返回false。下面的thnik代码将对您有所帮助,请尝试以下操作
ImageView image_name = (ImageView) findViewById(R.id.image); //Find your image here
image_name.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Log.d("test", "ontouch");
return false;
}
});
image_name.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.d("test", "onclick");
}
});
或者你可以使用android go-through的GestureDetector属性我下面的thnik代码对你有帮助,试试这个
ImageView image_name = (ImageView) findViewById(R.id.image); //Find your image here
image_name.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Log.d("test", "ontouch");
return false;
}
});
image_name.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.d("test", "onclick");
}
});
或者你可以使用android go-through的GestureDetector属性我正在使用GestureDetector并解决我的问题。谢谢你的建议这是我的答案
private GestureDetector gestureDetector;
gestureDetector = new GestureDetector(this, new SingleTapConfirm());
public boolean onTouch(View v, MotionEvent event) {
ImageView imageView = (ImageView) v;
imageView.setScaleType(ScaleType.MATRIX);
if (gestureDetector.onTouchEvent(event)) {
v.performClick();
} else {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
matrix.set(imageView.getImageMatrix());
// isMoved = false;
startPoint.set(event.getX(), event.getY());
savedMatrix.set(matrix);
mode = DRAG;
break;
case MotionEvent.ACTION_UP:
/*
* if (!isMoved) { v.performClick(); }
*/
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
savedMatrix.set(matrix);
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - startPoint.x,
event.getY() - startPoint.y);
} else if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
}
}
// isMoved = true;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(midPoint, event);
mode = ZOOM;
// isMoved = false;
}
break;
}
imageView.setImageMatrix(matrix);
}
return true;
}
@SuppressLint("FloatMath")
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return (float) Math.sqrt(x * x + y * y);
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
private class SingleTapConfirm extends SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent event) {
return true;
}
}
我正在使用手势检测器解决我的问题。谢谢你的建议这是我的答案
private GestureDetector gestureDetector;
gestureDetector = new GestureDetector(this, new SingleTapConfirm());
public boolean onTouch(View v, MotionEvent event) {
ImageView imageView = (ImageView) v;
imageView.setScaleType(ScaleType.MATRIX);
if (gestureDetector.onTouchEvent(event)) {
v.performClick();
} else {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
matrix.set(imageView.getImageMatrix());
// isMoved = false;
startPoint.set(event.getX(), event.getY());
savedMatrix.set(matrix);
mode = DRAG;
break;
case MotionEvent.ACTION_UP:
/*
* if (!isMoved) { v.performClick(); }
*/
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
savedMatrix.set(matrix);
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - startPoint.x,
event.getY() - startPoint.y);
} else if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
}
}
// isMoved = true;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(midPoint, event);
mode = ZOOM;
// isMoved = false;
}
break;
}
imageView.setImageMatrix(matrix);
}
return true;
}
@SuppressLint("FloatMath")
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return (float) Math.sqrt(x * x + y * y);
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
private class SingleTapConfirm extends SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent event) {
return true;
}
}
似乎您正在尝试通过触摸使ImageView既可单击也可移动。如果是这样的话,那么我建议研究SimpleStatureDetector。似乎您正在尝试通过触摸使ImageView既可单击也可移动。如果是这样的话,那么我建议研究SimpleStatureDetector。