#android #imageview
#Android #imageview
Вопрос:
У меня есть imageview, который содержит изображение со стрелкой.Когда пользователь прикасается пальцем к imageview, то в зависимости от перемещения imageview из исходного положения я вычисляю угол (угловое смещение).
Изначально я тестирую этот код на эмуляторе, поэтому, когда я нажимаю мышью на imageview, поворачиваю imageview и удаляю мышь, я обнаруживаю, что функция для вычисления угла вызывается несколько раз.Но это не то, что я хочу.
Я хочу, чтобы он вызывался ровно один раз в зависимости от того, когда пользователь поворачивает imageview и оставляет свой палец.
Вот мой код: — Пожалуйста, обратите внимание, что mTop — это мой imageview в приведенном ниже коде.
public boolean onTouch(View v, MotionEvent motion) {
// TODO Auto-generated method stub
if (motion.getAction() != MotionEvent.ACTION_DOWN amp;amp;
motion.getAction() != MotionEvent.ACTION_MOVE) {
return false;
}
// int angle = 0;
switch(motion.getAction())
{
case MotionEvent.ACTION_MOVE:
float dy = -( motion.getY()-mTop.getPivotY());
float dx = -(motion.getX()-mTop.getPivotX());
double r = Math.atan2(dy, dx);
int angle = (int)Math.toDegrees(r);
updateRotation(angle);
break;
}
return true;
}
public void updateRotation(double angle)
{
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.arrow);
int w = bitmap.getWidth();
int h = bitmap.getHeight();
String filePath = null;
Matrix mtx = new Matrix();
// Log.w(this.getClass().getName(),"The ANGLE IS %f",angle);
// Log.d("ANGLE IS ", Double.toString(angle));
Log.d(this.getClass().getName(), "Value: " Double.toString(angle));
if(angle > 90)
angle = 90;
mtx.postRotate((float) angle);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
Drawable draw =new BitmapDrawable(bitmap);
mTop.setBackgroundDrawable(draw);
}
====================================================
МОЙ измененный код для события Ontouch:-
switch(motion.getActionMasked())
{
case MotionEvent.ACTION_MOVE:
Log.w(this.getClass().getName(),"In MOTION MOVE");
dy = -( motion.getY()-mTop.getPivotY());
dx = -(motion.getX()-mTop.getPivotX());
r = Math.atan2(dy, dx);
break;
case MotionEvent.ACTION_UP:
angle = (int)Math.toDegrees(r);
updateRotation(angle);
break;
default:
break;
}
Комментарии:
1. Что такое mTop в приведенном выше коде
Ответ №1:
Я не совсем уверен, чего вы пытаетесь достичь, основываясь на том, что у вас есть здесь. Но я могу сказать вам, что ваш onTouch () получит много обратных вызовов с помощью MotionEvent.ACTION_MOVE. По сути, все время, пока ваш палец касается экрана, этот метод будет вызываться снова и снова так быстро, как только система сможет его вызвать.
Вероятно, вам придется выполнять поворот в случае с MotionEvent.ACTION_UP, который вызывается только один раз, когда палец отрывается от экрана.
Редактировать:
У вас все еще есть этот оператор if в вашем коде?
if (motion.getAction() != MotionEvent.ACTION_DOWN amp;amp;
motion.getAction() != MotionEvent.ACTION_MOVE) {
return false;
}
если это так, вам, вероятно, нужно его удалить
Комментарии:
1. Когда я перемещаю код поворота угла в ACTION_UP, imageview перестает реагировать на событие касания.
2. у вас все еще есть этот оператор if над переключателем? смотрите мое редактирование
3. добавление трассировок в ACTION_UP и ACTION_MOVE указывает на то, что эти события попадают. Но странно то, что imageview не реагирует на прикосновение. Он остается в исходном положении.