2016-08-17 17 views
-1

私はこのコードをインターネット上で見つけました。システムオーバーレイボタンを回転させる方法

システムオーバーレイボタンが作成され、画面上で移動できます。

どうすればこのボタンを回転できるようにすることができますか?

おそらく2本の指の回転として。

Package de.mobilej.overlay; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.PixelFormat; 
import android.os.IBinder; 
import android.view.Gravity; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 
import android.view.WindowManager; 
import android.view.WindowManager.LayoutParams; 
import android.widget.Button; 
import android.widget.Toast; 

public class OverlayShowingService extends Service implements OnTouchListener, OnClickListener { 
private View topLeftView; 

private Button overlayedButton; 
private float offsetX; 
private float offsetY; 
private int originalXPos; 
private int originalYPos; 
private boolean moving; 
private WindowManager wm; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 

    overlayedButton = new Button(this); 
    overlayedButton.setText("TEST TEST TEST TEST TEST TEST TEST TEST TEST"); 
    overlayedButton.setOnTouchListener(this); 
    overlayedButton.setBackgroundColor(0x55fe4444); 
    overlayedButton.setOnClickListener(this); 

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); 
    params.gravity = Gravity.LEFT | Gravity.TOP; 
    params.x = 0; 
    params.y = 0; 
    wm.addView(overlayedButton, params); 

    topLeftView = new View(this); 
    WindowManager.LayoutParams topLeftParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); 
    topLeftParams.gravity = Gravity.LEFT | Gravity.TOP; 
    topLeftParams.x = 0; 
    topLeftParams.y = 0; 
    topLeftParams.width = 10; 
    topLeftParams.height = 10; 
    wm.addView(topLeftView, topLeftParams); 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (overlayedButton != null) { 
     wm.removeView(overlayedButton); 
     wm.removeView(topLeftView); 
     overlayedButton = null; 
     topLeftView = null; 
    } 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     float x = event.getRawX(); 
     float y = event.getRawY(); 

     moving = false; 
     int[] location = new int[2]; 
     overlayedButton.getLocationOnScreen(location); 

     originalXPos = location[0]; 
     originalYPos = location[1]; 

     offsetX = originalXPos - x; 
     offsetY = originalYPos - y; 

    } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
     int[] topLeftLocationOnScreen = new int[2]; 
     topLeftView.getLocationOnScreen(topLeftLocationOnScreen); 
     System.out.println("topLeftY="+topLeftLocationOnScreen[1]); 
     System.out.println("originalY="+originalYPos); 

     float x = event.getRawX(); 
     float y = event.getRawY(); 
     WindowManager.LayoutParams params = (LayoutParams) overlayedButton.getLayoutParams(); 

     int newX = (int) (offsetX + x); 
     int newY = (int) (offsetY + y); 

     if (Math.abs(newX - originalXPos) < 1 && Math.abs(newY - originalYPos) < 1 && !moving) { 
      return false; 
     } 

     params.x = newX - (topLeftLocationOnScreen[0]); 
     params.y = newY - (topLeftLocationOnScreen[1]); 
     wm.updateViewLayout(overlayedButton, params); 
     moving = true; 
    } else if (event.getAction() == MotionEvent.ACTION_UP) { 
     if (moving) { 
      return true; 
     } 
    } 

    return false; 
} 

@Override 
public void onClick(View v) { 
    Toast.makeText(this, "Overlay button click event", Toast.LENGTH_SHORT).show(); 

}} 
+0

あなたが投稿したコードでマルチタッチを使用してビューを回転するにまともな質問は、あなたの質問には本当に関連していないですし、これを自分で解決しようとする試みを行っているようには見えません。スタックオーバーフローの人々はあなたのためのコードを書いていません、彼らはあなたを修正するのに役立ちます。 – Tibrogargan

+0

@Tibrogarganコードは、タッチを使ってシステムオーバーレイアイテムをどのように回転させるかという問題に非常に関連しています。スタックオーバーフローは、開始する場所や詳細な情報を得る場所など簡単なもので答えられる質問をするためのものです。敵対的な環境にしないでください。 – LoungeKatt

答えて

0

システムオーバーレイを回転することは、ビューを回転させることと同じです。あなたはタッチを傍受し、それをビューの回転に変換することから始めます。

2本の指のタッチの回転を実現するには、動きの大きさを取得し、それをビューを回転させるべき角度の数に変換します。

回転度を取得したら、それをレイアウトに適用します。

ありrotation and scaling and move using multi touch in android

関連する問題