티스토리 뷰

 안드로이드 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);
		}
	}
}

마무리

 위와 같은 코드를 이용하여 간단하게 처리할 수 있습니다. 상속 받고, 레이아웃 처리 부분만 주의한다면 쉽게 적용이 가능합니다.




댓글