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.

Reply via email to