Плавное вращение Android с помощью SimpleOnGestureListener
У меня есть круг, который я хочу вращать. Я использую SimpleOnGestureListener для обработки жестов, особенно метода onScroll.
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
float lWidth = e1.getX() - centeralPointX;
float lHeight = e1.getY() - centeralPointY;
float lRadius = FloatMath.sqrt(lWidth * lWidth + lHeight * lHeight);
if ((lRadius <= bigCircleRadius) && (lRadius >= smallCircleRadius)) {
mLastAngle = (float) (Math.atan(lHeight / lWidth) * 180 / Math.PI)
+ step / 2;
float currWidth = e2.getX() - centeralPointX;
float currHeight = e2.getY() - centeralPointY;
mCurrentAngle = (float) (Math.atan(currHeight / currWidth) * 180 / Math.PI)
+ step / 2;
mAngle = mLastAngle - mCurrentAngle;
mLastAngle = mCurrentAngle;
// show angles
TextView lastANGLE, endANGLE, ANGLE;
lastANGLE = (TextView) findViewById(R.id.currentAngle);
lastANGLE.setText("last " + mLastAngle);
endANGLE = (TextView) findViewById(R.id.endAngle);
ANGLE = (TextView) findViewById(R.id.angle);
endANGLE.setText("current " + mCurrentAngle);
ANGLE.setText("ANGLE " + mAngle);
rotation = (float) (-mAngle - step / 2);
if (rotate != null && !rotate.hasEnded()) {
rotate.cancel();
rotate.reset();
}
rotate = RotateCircle(radius, radius);
words_layout.startAnimation(rotate);
return true;
} else
return false;
}
Но это не работает правильно. Я хочу, чтобы этот круг вращался плавно, но это не так. Как я могу это сделать? Я пытался использовать метод onFling, но он вращал мой круг после завершения движения. Но мне нужно вращать его во время движения.
2 ответа
Решение
Вы можете попытаться переопределить View.onTouchEvent(MotionEvent e)
как это:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastEventX = e.getX();
lastEventY = e.getY();
return true;
case MotionEvent.ACTION_MOVE:
// put your code to rotate here using lastEventX and lastEventY instead of e1.getX() and e1.getY()
return true;
}
return super.onTouchEvent(MotionEvent event);
}
Не вызывайте findViewByID() каждый раз, когда вызывается onScroll, для одних и тех же 3-х объектов снова и снова.