вычисление угла вызывается несколько раз для события imageview при касании

#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 не реагирует на прикосновение. Он остается в исходном положении.