본문 바로가기
프로그래밍 놀이터/안드로이드, Java

How to implement a Floating Activity in an Android App.

by 돼지왕 왕돼지 2015. 3. 8.
반응형


 How to implement a Floating Activity in an Android App.

 

출처 : http://cases.azoft.com/android-tutorial-floating-activity/


만들고자 하는것.


- Floating Activity ( Transparent ) 

- 단말의 orientation 에 상관없이 화면의 약 2/3 를 차지하며, center 에 위치하는 것.



만드는 과정


- Activity size 와 location 계산하기.

- Activity 를 transparent 하게 만들기.

- Background 가 touch 를 받지 않도록 하기.




1. Activity size 계산하기


ActionBar 를 사용하는 경우에 ActionBar 는 항상 동일한 위치에 존재하기 때문에

Activity resize 를 시도하면 실패한다.


그래서 ActionBar 를 그리기 전에 무언가 조치를 취해야 한다.


@Override

public void onAttachedToWindow() {

super.onAttachedToWindow();


final View view = getWindow().getDecorView();

final WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view.getLayoutParams();


lp.gravity = Gravity.CENTER;


lp.width = mActivityWindowWidth;

lp.height = mActivityWindowHeight;

getWindowManager().updateViewLayout(view, lp);

}


위의 경우를 Compat ActionBar 와 함께 실행시키면..


ActionBarView can only be used with android:layout_width="match_parent" (or fill_parent).


와 같은 에러와 마딱뜨리게 된다.


이 경우 ActionBarSherlock 과 연계해서 ActionBarView 의 onMeasure 에서 위의 에러를 던지는 부분을 주석처리해줘야 한다.


만약 ActionBar 때문에 문제가 된다면, 기본 ActionBar 를 사용하지 않고 View 로 대신하는 것도 한 방법이겠다.

( 이 부분은 테스트가 되지 않았다. )




2. Transparency 더하기.


<item name="android:windowIsTranslucent">true</item>

 

위의 theme 을 더해준다.


문제는 4.3 버전의 Nexus 7 에서는 위와 같은 코드가 다 작동했지만,

4.4.2 버전의 Nexus 7 에서는 Transparent 를 통해 아래 깔린 Activity 가 보이지 않는다.


Kitkat optimization 부터는 새로운 optimization algorithm 이 추가되어 상관없지만,

그 이전버전에서는 Activity 는 WindowManager 의 변화와 상관없이 full-screen mode 로 작동하기 때문에

아래 깔린 Activity 를 잉여 Activity 로 여기고 그리지 않는 것이다.


따라서 translucent 하나의 속성으로 되는 것이 아니라, 아래의 theme 들도 추가되어야 한다.


<item name="android:windowIsFloating">true</item>

<item name="android:windowCloseOnTouchOutside">false</item>

<item name="android:colorBackgroundCacheHint">@null</item>

<item name="android:backgroundDimEnabled">true</item>







반응형

댓글