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 android-developers+unsubscr...@googlegroups.com.
To post to this group, send email to android-developers@googlegroups.com.
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