Я пытаюсь сделать кликабельное изображение. На самом деле он доступен для кликов, поэтому я могу вызвать Intent после того, как пользователь коснется изображения. Но я пытаюсь изменить изображение на ощупь.
Я хочу следующее:
Некоторые из этих функций работают со следующим кодом:
final ImageView v = (ImageView) findViewById(R.id.profileImage);
v.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.setImageResource(R.drawable.ic_contact_picture_down);
break;
}
case MotionEvent.ACTION_CANCEL:{
v.setImageResource(R.drawable.ic_contact_picture);
break;
}
case MotionEvent.ACTION_UP: {
takePhoto();
v.setImageResource(R.drawable.ic_contact_picture);
break;
}
}
return true;
}
});
Изображение правильно изменяется на изображение2. Итак, ACTION_DOWN работает. ACTION_UP вызывается, если пользователь отключает изображение. Но это также называется, если отладка выполняется вне изображения. Если это произойдет, я хочу переключиться на обратный образ1, но не вызывать функцию takePhoto(). ACTION_CANCEL никогда не вызывается, что я считал кандидатом на вышеуказанный случай.
Вы можете попробовать использовать Rect
чтобы удерживать границы ImageView
а затем использовать ACTION_MOVE
Например, объявите объект Rect
,
private Rect rect;
Затем в вашем setOnTouchListener()
инициализируйте Rect
и проверьте с помощью ACTION_MOVE
,
v.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN: {
// Declare the bounds of the rect
rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
v.setImageResource(R.drawable.ic_contact_picture_down);
break;
}
case MotionEvent.ACTION_MOVE:{
if(!rect.contains((int)arg1.getX(), (int)arg1.getY())) {
// Outside the bounds
v.setImageResource(R.drawable.ic_contact_picture);
}
break;
}
case MotionEvent.ACTION_UP: {
takePhoto();
v.setImageResource(R.drawable.ic_contact_picture);
break;
}
}
return true;
}
});
Извините, я не тестировал это, но думаю, вы можете получить идею :)