2017-08-09 1 views
7

Hier ist, wie meine Einrichtung zum Drehen aussieht.Drehen Android Android-Layout-Ansicht über seine Mitte mit Touch-Listener

enter image description here

Ich höre Handlungs nach unten und auf dem Dreh Symbol bewegen und versuchen, den Drehwinkel zu berechnen und diesen Drehwinkels gesamtes Layout der Anwendung die EditText eingekapselt wird. Die angewendete Drehung muss ungefähr der Mitte des einkapselnden relativen Layouts entsprechen.

Hier ist, wie ich dies im TouchListener für Rotationssymbol erreichen möchte.

if(v == ivRotateSticker){ 


     //TODO grab xc and yc using (top and bottom)/2 and (left and right)/2 to grab center of sticker after each rotation 
     final float x = event.getX(); 
     final float y = event.getY(); 
     rlTextStickerLayout.getGlobalVisibleRect(myViewRect); 
     xc = myViewRect.width()/2; 
     yc = myViewRect.height()/2; 

     dx = scaleReceiver.getWidth() - myViewRect.width(); 
     dy = scaleReceiver.getHeight() - myViewRect.height(); 

     leftBound = scaleReceiver.getX(); 
     topBound = scaleReceiver.getY(); 

     switch (event.getAction()){ 

      case MotionEvent.ACTION_DOWN: 
       mViewAngle = rlTextStickerLayout.getRotation(); 
       mPrevAngle = Math.toDegrees(Math.atan2(x - xc, yc - y)); 

       break; 

      case MotionEvent.ACTION_MOVE: 

       Log.d("EventRegistered", " " + event.getRawX() + "--" + dx + " -- " + dy); 

       mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y)); 
       if (x >= leftBound && y >= topBound && x <= dx && y <= dy) { 
        float rot = (float) (mViewAngle + mCurrAngle - mPrevAngle); 
        rlTextStickerLayout.setRotation((float) (mViewAngle + mCurrAngle - mPrevAngle)); 
        Log.d("stickerRotation"," "+rot); 
       } 
       break; 

     } 

     return true; 

    } 

Aber die resultierende Rotation ist glitchy und nicht wie gewünscht glatt. Wenn ich den Aufkleber an einen anderen Ort verschiebe, wie aktualisiere ich das neue Zentrum für die Rotation, da die Drehung nach dem Bewegen des Aufklebers das Rotationszentrum dramatisch verändert. Wie kann ich eine viel reibungslosere Rotation erreichen?

Antwort

0
  1. Ansicht der Drehung auf die angegebenen Werte (90, 180, 270) in 1000ms animiert werden:

    view.animate(), Rotation (90f) .setDuration (1000) .start();. view.animate() .rotation (180f) .setDuration (1000) .start(); view.animate() .rotation (270f) .setDuration (1000) .start();

  2. Verwendung dieser Bibliothek können Sie ganze drehen Ansicht Hierarchie https://github.com/rongi/rotate-layout

Verwandte Themen