Here is the code I use:
private class RotationGestureDetector {
private static final int INVALID_POINTER_ID = -1;
private float fX, fY, sX, sY;
private int ptrID1, ptrID2;
private float mCurrentAngle = 0f;
private View mView;
public RotationGestureDetector(View view) {
mView = view;
ptrID1 = INVALID_POINTER_ID;
ptrID2 = INVALID_POINTER_ID;
}
public void resetAngle() {
mCurrentAngle = 0f;
}
public boolean onTouchEvent(MotionEvent event){
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
ptrID1 = event.getPointerId(event.getActionIndex());
break;
case MotionEvent.ACTION_POINTER_DOWN:
if(ptrID1 != INVALID_POINTER_ID) {
ptrID2 = event.getPointerId(event.getActionIndex());
try {
sX = event.getX(event.findPointerIndex(ptrID1));
sY = event.getY(event.findPointerIndex(ptrID1));
fX = event.getX(event.findPointerIndex(ptrID2));
fY = event.getY(event.findPointerIndex(ptrID2));
}
catch (IllegalArgumentException e)
{
ptrID1 = event.getPointerId(event.getActionIndex());
sX = event.getX(event.findPointerIndex(ptrID1));
sY = event.getY(event.findPointerIndex(ptrID1));
fX = event.getX(event.findPointerIndex(ptrID2));
fY = event.getY(event.findPointerIndex(ptrID2));
}
float pivotX = (fX + sX) / 2;
float pivotY = (fY + sY) / 2;
Log.d(TAG, "fX: " + fX + " fX: " + fY + " sX: " + sX + "
sY: " + sY);
Log.d(TAG, "Pivot X: " + pivotX + " Pivot Y: " + pivotY);
mView.setPivotX(pivotX); // !!!! Here WebView changes its
position in layout
mView.setPivotY(pivotY);
break;
}
case MotionEvent.ACTION_MOVE:
if(ptrID1 != INVALID_POINTER_ID && ptrID2 !=
INVALID_POINTER_ID){
float nfX, nfY, nsX, nsY;
nsX = event.getX(event.findPointerIndex(ptrID1));
nsY = event.getY(event.findPointerIndex(ptrID1));
nfX = event.getX(event.findPointerIndex(ptrID2));
nfY = event.getY(event.findPointerIndex(ptrID2));
float angle = angleBetweenLines(fX, fY, sX, sY, nfX, nfY,
nsX, nsY);
mCurrentAngle += angle;
mView.animate().rotation(-mCurrentAngle).setDuration(0).start();
}
break;
case MotionEvent.ACTION_UP:
ptrID1 = INVALID_POINTER_ID;
break;
case MotionEvent.ACTION_POINTER_UP:
ptrID2 = INVALID_POINTER_ID;
break;
case MotionEvent.ACTION_CANCEL:
ptrID1 = INVALID_POINTER_ID;
ptrID2 = INVALID_POINTER_ID;
break;
}
return true;
}
private float angleBetweenLines (float fX, float fY, float sX, float sY,
float nfX, float nfY, float nsX, float nsY)
{
float angle1 = (float) Math.atan2( (fY - sY), (fX - sX) );
float angle2 = (float) Math.atan2( (nfY - nsY), (nfX - nsX) );
float angle = ((float)Math.toDegrees(angle1 - angle2)) % 360;
if (angle < -180.f) angle += 360.0f;
if (angle > 180.f) angle -= 360.0f;
return angle;
}
}
вторник, 17 мая 2016 г., 20:20:03 UTC+3 пользователь Pavel Vasilyev написал:
>
> Hi all,
>
> I'm trying to rotate WebView (actually don't think there is a difference
> with any Views) by rotation gesture with two fingers.
> I use the following code:
> mView.animate().rotation(-mCurrentAngle).setDuration(0).start();
>
> I get fingers' relative coordinates by MotionEvent.getX(pointerIndex);
>
> The problem appears if I'm trying to change pivot point. WebView suddenly
> starts changing its view in layout after I set pivot point.
>
> I had the same problem with scaling and tried solutions from this topic:
> http://stackoverflow.com/questions/14415035/setpivotx-works-strange-on-scaled-view
> And it helped. But not for rotation.
>
> Does any body know is it possible to rotate view with changed pivot button?
>
--
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/android-developers/f285b852-0e81-4968-8fa1-f4d1699b1710%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.