2017-08-09 18 views
7

Oto, jak wygląda mój zestaw do obracania.Obróć widok układu Android o jego środku za pomocą słuchacza dotykowego

enter image description here

Słucham działania w dół i przesunąć ikonę rotacji, próbując obliczyć kąt obrotu i stosowania, że ​​kąt obrotu do całego układu enkapsulacji EditText. Zastosowany obrót musi znajdować się wokół środka otaczającego względnego układu.

Oto, jak próbuję to osiągnąć w ikonie rotacji dla TouchListener.

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; 

    } 

Ale wynikowy obrót jest glitchy, a nie zgodnie z życzeniem gładki. Ponadto, jeśli przeniesię naklejkę do innej lokalizacji, w jaki sposób zaktualizuję nowe centrum obrotu, ponieważ obrót po przeniesieniu naklejki radykalnie zmienia środek obrotu. Jak mogę osiągnąć znacznie bardziej płynną rotację?

Odpowiedz

0
  1. View na obrót do animacji z określonymi wartościami (90, 180, 270) w 1000ms:

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

  2. Korzystanie z tej biblioteki można obracać cała hierarchia widok https://github.com/rongi/rotate-layout

Powiązane problemy