Created
October 14, 2013 13:02
-
Star
(119)
You must be signed in to star a gist -
Fork
(34)
You must be signed in to fork a gist
-
-
Save bjoernQ/6975256 to your computer and use it in GitHub Desktop.
Revisions
-
bjoernQ created this gist
Oct 14, 2013 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,27 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.mobilej.overlay" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" /> <application android:label="SystemOverlay" > <activity android:name="de.mobilej.overlay.Main" android:exported="true" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="de.mobilej.overlay.OverlayShowingService" android:exported="false" /> </application> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> </manifest> This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,17 @@ package de.mobilej.overlay; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class Main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent svc = new Intent(this, OverlayShowingService.class); startService(svc); finish(); } } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,132 @@ 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("Overlay button"); overlayedButton.setOnTouchListener(this); overlayedButton.setAlpha(0.0f); 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 = 0; topLeftParams.height = 0; 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(); } }