imageview не двигается на сенсорном событии Android - PullRequest
1 голос
/ 13 октября 2011

МОЙ просмотр изображений не перемещается, когда вызывается событие ontouch ... Хотя я могу видеть ACTION_UP и ACTION_MOVE, происходящие из следов журнала.

Вот мой код: -

public boolean onTouch(View v, MotionEvent motion) {



     float dy ;
     float dx;
     double r = 0;
     float angle = 0;

     switch(v.getId())
     {
        case R.id.arrow:
            switch(motion.getActionMasked())
            {
                case MotionEvent.ACTION_MOVE:
                    Log.w(this.getClass().getName(),"In MOTION MOVE");
                    mX1 = motion.getX();
                    mY1 = motion.getY();
                    break;

               case MotionEvent.ACTION_UP:

                  Log.w(this.getClass().getName(),"In MOTION UP");
                  mX2 = motion.getX();
                  mY2 = motion.getY();
                dy = -( mY2-mY1);
                dx = -(mX2-mX1);
                r = Math.atan2(dy, dx);
                   angle = (int)Math.toDegrees(r);
                   updateRotation(angle);
                   break;

               default:
                   break;
            }

            Log.d(this.getClass().getName(), "Value of angle in ontouch: " + Double.toString(angle));

            break;

        default:
            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.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);


    mImageView.setBackgroundDrawable(draw);
    }

=============================================== ==========

Редактировать 2: измененная функция

public boolean onTouch(View v, MotionEvent motion) {



     float dy ;
     float dx;
     double r = 0;


     switch(v.getId())
     {
        case R.id.arrow:
            switch(motion.getActionMasked())
            {
            case MotionEvent.ACTION_DOWN:
                mX1 = motion.getX();
                mY1 = motion.getY();
                break;

                case MotionEvent.ACTION_MOVE:
                    Log.w(this.getClass().getName(),"In MOTION MOVE");
                    mX1 = motion.getX();
                    mY1 = motion.getY();
                    break;

               case MotionEvent.ACTION_UP:

                  Log.w(this.getClass().getName(),"In MOTION UP");
                  mX2 = motion.getX();
                  mY2 = motion.getY();
                dy = -( mY2-mY1);
                dx = -(mX2-mX1);
                r = Math.atan2(dy, dx);
                   mAngle = (int)Math.toDegrees(r);
                   updateRotation();
                   break;

               default:
                   break;
            }

            Log.d(this.getClass().getName(), "Value of angle in ontouch: " + Float.toString(mAngle));

            break;

        default:
            break;
     }
    return true;
}

=============================================

Редактировать 3: - Странно то, что если я изменяю свое событие onTouch и выполняю все вычисления в ACTION_MOVE, просмотр изображений отвечает на каждое событие касания, но это не то, что я хочу, так как я не могу сделать правильное угловое вращение в событии ACTION_MOVE

1 Ответ

1 голос
/ 13 октября 2011

Ruchira,

Посмотрев на ваш код и работая со многими новинками onTouch, я могу вам сказать, что проблема определенно в вашем onTouchEvent().Вы записываете mX1 и mY1 в своем ACTION_MOVE без записи исходного события ACTION_DOWN.Это означает, что каждый раз, когда вы двигаете пальцем, метод onTouchEvent() считает, что это исходная позиция.Попробуйте вместо этого:

public boolean onTouch(View v, MotionEvent motion) {
     float dy ;
     float dx;
     double r = 0;
     float angle = 0;

     switch(v.getId())
     {
        case R.id.arrow:
            switch(motion.getActionMasked())
            {
               case MotionEvent.ACTION_DOWN:
                    mX1 = motion.getX();
                    mY1 = motion.getY();
                    break;
               case MotionEvent.ACTION_MOVE:
                    Log.w(this.getClass().getName(),"In MOTION MOVE");
               //Just to support real time rotation, you could:
                    mX2 = motion.getX();
                    mY2 = motion.getY();
                    //... some rotation code.
                    break;

               case MotionEvent.ACTION_UP:
                   Log.w(this.getClass().getName(),"In MOTION UP");
              // All of this should be fine.
                   mX2 = motion.getX();
                   mY2 = motion.getY();
                   dy = -( mY2-mY1);
                   dx = -(mX2-mX1);
                   r = Math.atan2(dy, dx);
                   angle = (int)Math.toDegrees(r);
                   updateRotation(angle);
                   break;

               default:
                   break;
            }

            Log.d(this.getClass().getName(), "Value of angle in ontouch: " + Double.toString(angle));

            break;

        default:
            break;
    }
    return true;
}

Это должно, по крайней мере, правильно отследить ваши номера, чтобы они действительно могли быть использованы.

Дополнительные замечания Самая распространенная ошибка заключается вубедитесь, что вы не установили ни одну из переменных отслеживания в финал.Если это так, код установит его один раз, но не снова ...

При работе с Drawables важно избавиться от исходного Drawable и его обратного вызова.Причиной этого является хорошо известная проблема, которая никогда не решалась в Android, потому что не было принято решения относительно того, когда именно это было необходимо, а когда - нет.По сути, Android в конечном итоге исчерпает память, но не обязательно скажет вам и просто не сможет обновить изображение.Вот как вы это делаете (при замене изображения).

Drawable trash = mImageView.getBackgroundDrawable();
if (trash != null)
{   trash.setCallback(null);
    trash.recycle();
    trash = null;
}
mImageView.setBackgroundDrawable(draw);

Наконец, вы должны сообщить изображению, что оно должно перерисовать себя.Это не всегда так, но чаще всего так и есть.mImageView.invalidate(); часто решает проблему и должен быть помещен в последнюю строку в вашем методе updateRotation().

FuzzicalLogic

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