Вычисление угла вызывается несколько раз для просмотра изображения при касании - PullRequest
0 голосов
/ 12 октября 2011

У меня есть изображение, которое содержит изображение со стрелкой. Когда пользователь касается пальцем изображения, затем в зависимости от движения изображения из исходного положения я вычисляю угол (угловое смещение).

Изначально я тестирую этот код на эмуляторе, поэтому, когда я щелкаю мышью на изображении, поворачиваю изображение и удаляю мышь, я обнаруживаю, что функция для вычисления угла вызывается несколько раз. 1003 *

Я хочу, чтобы он вызывался ровно один раз, в зависимости от того, когда пользователь поворачивает изображение и оставляет палец.

Вот мой код: - Обратите внимание, что mTop - это мой просмотр изображений в приведенном ниже коде.

public boolean onTouch(View v, MotionEvent motion) {
    // TODO Auto-generated method stub

    if (motion.getAction() != MotionEvent.ACTION_DOWN &&
            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 Ответ

2 голосов
/ 12 октября 2011

Я не совсем уверен, что вы пытаетесь достичь, основываясь на том, что у вас здесь. Но я могу сказать вам, что ваш onTouch () получит много обратных вызовов с MotionEvent.ACTION_MOVE. По сути, все время, когда ваш палец касается экрана, этот метод будет вызываться снова и снова так быстро, как система может его вызвать.

Вероятно, вам придется выполнить вращение в случае MotionEvent.ACTION_UP, который вызывается только один раз, когда палец отрывается от экрана.

Edit:

У вас все еще есть оператор if в вашем коде?

    if (motion.getAction() != MotionEvent.ACTION_DOWN &&
        motion.getAction() != MotionEvent.ACTION_MOVE) {
    return false;
}

если да, то, вероятно, вам нужно удалить его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...