2012-04-22 5 views
8

Я хочу сделать деятельность, которая может быть открыта над ЛЮБОЙ программой.Имея приложение, выполняющееся над другим приложением

Обычно, даже когда активность находится в диалоге, при переключении на мое приложение, вы видите мое приложение, а на заднем плане вы видите пусковую:

НО, я хочу приложение будет идти выше любого приложения, как это: (сделано в фотошопе):

Я видел этот вопрос Creating a system overlay window (always on top), но в ICS нет в Функция добавления макета. Кроме того, я хочу дать диалоговое окно из моего приложения, не сводя к минимуму другое приложение ...

+0

Вы нашли решение. Если да, пожалуйста, помогите мне в этом. – rup35h

ответ

21

есть много приложений, которые показывают плавающий вид поверх всего, как: airbrowser, LilyPad, Stick it, AirTerm, Смарт Taskbar, Aircalc ...

в любом случае, для того, чтобы достичь этой функции, вы должны иметь специальное разрешение, которое называется «android.permission.SYSTEM_ALERT_WINDOW», и использовать что-то вроде этого:

final WindowManager.LayoutParams param=new WindowManager.LayoutParams(); 
param.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 
final View view=findViewById(R.id.my_floating_view); 
final ViewGroup parent=(ViewGroup)view.getParent(); 
if(parent!=null) 
    parent.removeView(view); 
param.format=PixelFormat.RGBA_8888; 
param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; 
param.gravity=Gravity.TOP|Gravity.LEFT; 
param.width=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().width; 
param.height=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().height; 
final WindowManager wmgr=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
wmgr.addView(view,param); 
// TODO handle overlapping title bar and/or action bar 
// TODO you must add logic to remove the view 
// TODO you must use a special permission to use this method :android.permission.SYSTEM_ALERT_WINDOW 
// TODO if you wish to let the view stay when leaving the app, make sure you have a foreground service running. 
+0

И будет ли представление функционировать даже в ICS? –

+0

уверен. Я даже тестировал его примерно месяц назад. это не значит, что это устарело или что-то еще. просто не забудьте обработать специальные случаи, о которых я писал. обратите внимание, что некоторые из написанных мной вещей являются необязательными (например, часть «param.format», что делает фон прозрачным). не стесняйтесь играть с ними. о влиянии размытости, я не знаком с этим, но, безусловно, вы можете искать, как это сделать. –

+0

Спасибо вам большое! Он отлично работает! –

10

Я м один из разработчиков SDK Tooleap, и мы также рассмотрели эту проблему. В принципе, вам не нужно использовать SYSTEM_ALERT_WINDOW для отображения активности поверх другого. Вы можете просто отобразить обычную «сжатую» активность с прозрачным фоном.

Чтобы сделать «термоусаживаемую активность, изменить расположение окон деятельности Params высоты и ширина:

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.x = ...; 
params.y = ...; 
params.width = ...; 
params.height = ...; 

this.getWindow().setAttributes(params); 

Чтобы сделать прозрачный фон добавить к вашему определению активности в файле манифеста:

android:theme="@android:style/Theme.Translucent" 

Таким образом, вы можете создать иллюзию плавающего действия:

Обратите внимание, что будет возобновлено действие только переднего плана, а фоновое изображение - pau СЕПГ. Но для большинства приложений это не должно быть проблемой.

Теперь все, что остается, - это запуск плавающей активности.

Приведен пример приложения «плавающего» калькулятора с использованием регулярного действия. Обратите внимание, что действие под калькулятором относится к другому приложению.

Tooleap Calculator Screenshot

+0

Но это означает, что все, что вы делали, - это деятельность поверх действий другого приложения, поэтому, если вы нажмете кнопку «Назад», это повлияет на вашу деятельность, а не на другую. Чтобы сделать что-то, что действительно плавает и не обрабатывает то, что должно быть обработано позади, этот метод не будет работать ... –

+1

Все зависит от типа пользовательского опыта, которого вы пытаетесь достичь. Если вы хотите отобразить небольшую плавучую кнопку, которая не мешает активности под ней, то да, это не будет хорошим решением. Но если вы хотите отобразить небольшой экран, на который пользователь должен присутствовать, прежде чем продолжить работу (что-то вроде диалога), тогда небольшая активность может быть хорошим решением. – Danny

+1

hmmmm ... теперь, когда я перечитал вопрос, неясно, в чем именно нуждается поведение. Итак, вы правы. –