티스토리 뷰
안드로이드 3.0 이후에 적용된 SW Navigation 버튼을 숨기거나 보여주거나 처리가 가능합니다. 이전글에서는 이 버튼을 숨기는 방법에 대해서 작성을 했었는데 이 번글에서는 Android 예제에 있는 동영상 플레이어 시 Navigation 처리 방식을 참고하여 View를 상속받아서 자동으로 사라지게 하는 방법을 예제로 작성해보았습니다. Android 동영상 플레이어 예제에서는 3000 ms 로 3초 후에 사라지게되어 있습니다. 제가 확인해본 시간으로는 최소 1000 ms 이상이 되어야 전체화면으로 변하고, Navigation 바가 정상으로 사라졌습니다. 1000 ms 이하로 하였을 경우에는 동작하지 않는 경우도 발견하였습니다.
사용한 예제
Android API Example - 동영상 예제
안드로이드 Navigation 예제 - http://thdev.net/382
안드로이드 View API - http://developer.android.com/reference/android/view/View.html
결과물
왼쪽이 그냥 보여질 경우이고, 오른쪽이 숨겼을 경우입니다. 동영상 재생시에는 오른쪽과 같은 화면이 보기 좋겠고, 화면을 터치하면 다시 왼쪽과 같이 보여지게 됩니다. 설정한 3000 ms의 시간이 흐르면 다시 오른쪽으로 돌아가게 됩니다.
주요 소스코드 - xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".NavigationUIChange" > <view class="net.thdev.navigationuichange.NavigationUIChange$ContentView" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="15dp" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/ic_launcher" /> </LinearLayout>
주요 소스코드 - java
public class NavigationUIChange extends Activity { ContentView mContentView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigationuichange); mContentView = (ContentView) findViewById(R.id.content); // 레이아웃에 선언한 content를 ContentView로 불러온다 } // View를 상속받고, View.OnSystemUiVisibilityChangeListener 를 상속받는 클래스를 생성 public static class ContentView extends View implements View.OnSystemUiVisibilityChangeListener { private int DELAY_TIME = 1000; int mLastSystemUiVis; // 자동으로 숨기기 위한 Runnable를 생성 Runnable mNavHider = new Runnable() { @Override public void run() { setNavVisibility(false); } }; public ContentView(Context context, AttributeSet attrs) { super(context, attrs); setOnSystemUiVisibilityChangeListener(this); setNavVisibility(false); } @Override public void onSystemUiVisibilityChange(int visibility) { Log.d("TAG", "onSystemUiVisibilityChange"); int diff = mLastSystemUiVis ^ visibility; mLastSystemUiVis = visibility; if ((diff & SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0 && (visibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { setNavVisibility(true); } } // newVis를 View의 상태에 따라서 설정 void setNavVisibility(boolean visible) { int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | SYSTEM_UI_FLAG_LAYOUT_STABLE; if (!visible) { newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION; } // DELAY_TIME 이후에 핸들러를 다시 동작 if (visible) { Handler h = getHandler(); if (h != null) { h.removeCallbacks(mNavHider); h.postDelayed(mNavHider, DELAY_TIME); } } // 새로운 UiVisibility 로 변경 setSystemUiVisibility(newVis); } } }마무리
위와 같은 코드를 이용하여 간단하게 처리할 수 있습니다. 상속 받고, 레이아웃 처리 부분만 주의한다면 쉽게 적용이 가능합니다.
'Android Develop' 카테고리의 다른 글
안드로이드 kitkat - adb에 추가된 screen recorder 기능 사용하기 (4) | 2013.11.11 |
---|---|
안드로이드 개발자 콘솔에서 구글 지역화 서비스 이용하기(Translation Service) (0) | 2013.10.21 |
안드로이드 support v7-appcompt를 통한 2.3.3에서 Actionbar 적용하기 (2) | 2013.09.16 |
Eclipse에서 add native support를 통한 Android NDK 빌드 환경 구축 (0) | 2013.08.15 |
안드로이드 메뉴 버튼이 항상 필요할까? 옵션적인 메뉴인데? (10) | 2013.07.12 |
댓글