Source code
English translation
Возможно вы видели, что некоторые приложения, такие как winamp, Gimp и так далее имеют несколко раздельных окон. Мне было интересно, возможно ли такое же сделать на Android. Конечно, это можно сделать с использованием лэйаутов и прозрачных тем. Но мы не ищем легких путей.
Сначала определим стили:
"Theme.Transparent" стиль, наподобие того, что бы использован для заставки, но без "windowIsFloating". Благодаря этому первая "activity" заполняет весь экран. Для второй "activity": "Theme.Transparent.Floating". Т.о. вторая не заполнит весь экран и прикосновения к экрану будут доступны первой. Но нет. По умолчанию активности модальны. И прикосновения не будут доступны. Небольшие изменения:
Теперь мы видим экран устройства, две активности и первая из них доступна для прикосновений.
Есть еще одна вещь - взаимодействие между ними. При обычном раскладе мы используем
startActivityForResult. Но в нашем случае это непременимо. Простейший путь - использовать ресивер:
В результате:
Возможно для чего-нибудь будет полезно.
English translation
Возможно вы видели, что некоторые приложения, такие как winamp, Gimp и так далее имеют несколко раздельных окон. Мне было интересно, возможно ли такое же сделать на Android. Конечно, это можно сделать с использованием лэйаутов и прозрачных тем. Но мы не ищем легких путей.
Сначала определим стили:
<style name="Theme.Transparent" parent="android:Theme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
<style name="Theme.Transparent.Floating">
<item name="android:windowIsFloating">true</item>
</style>
"Theme.Transparent" стиль, наподобие того, что бы использован для заставки, но без "windowIsFloating". Благодаря этому первая "activity" заполняет весь экран. Для второй "activity": "Theme.Transparent.Floating". Т.о. вторая не заполнит весь экран и прикосновения к экрану будут доступны первой. Но нет. По умолчанию активности модальны. И прикосновения не будут доступны. Небольшие изменения:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
Теперь мы видим экран устройства, две активности и первая из них доступна для прикосновений.
Есть еще одна вещь - взаимодействие между ними. При обычном раскладе мы используем
startActivityForResult. Но в нашем случае это непременимо. Простейший путь - использовать ресивер:
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// The first activity wants to close this one
String operation = intent.getStringExtra("operation");
if(operation.equals("hide"))
finish();
}
};
В результате:
Возможно для чего-нибудь будет полезно.

Комментариев нет:
Отправить комментарий