티스토리 뷰

 안드로이드 3.0 부터 하드웨어 버튼이 아닌 소프트웨어 네비게이션 버튼 사용도 가능하도록 변경되었습니다. 특히 넥서스 시리즈에 적용된 것이죠. 이런 소프트웨어 버튼은 View를 상속 받은 레이아웃 또는 위젯을 통해 컨트롤 할 수 있습니다. Low Profile 또는 네비게이션 버튼을 숨길 수 있습니다. 적용 방법도 간단하며 이미 구글에서 제작한 앱들 중 동영상을 재생하는 프로그램은 모두 적용되어 있으며, 이 소프트웨어 버튼을 숨길 수 있는 메소드를 제공합니다. View의 API를 확인하면 setSystemUiVisibility을 제공하고 있습니다. View를 상속받는 모든 Method는 사용이 가능합니다. 제가 작성한 예제는 LinearLayout을 사용하여 네비게이션 버튼을 숨기거나 약간 어둡게 처리하고, 전체화면으로 만드는 예제코드입니다. 동영상을 보는 어플은 꼭 적용되었으면..........

 여기에 사용된 setSystemUiVisibility은 Version 11(허니콤)이상에서 동작하게 됩니다. 그리고 소프트웨어 버튼이 없는 폰에서는 안드로이드 시스템에서 자동적으로 환경에 따라 동작하기에 Version 11이상에서 동작하도록 처리하면 문제 없이 동작합니다.


View API 페이지

 http://developer.android.com/reference/android/view/View.html#setSystemUiVisibility(int)

 View API페이지를 접속하시면 setSystemUiVisibility를 찾을 수 있으면 예제 코드도 작성되어 있습니다.


 setSystemUiVisibility에서 사용가능한 변수들 중에 제가 코드에서 사용한 변수들입니다.

 public static final int SYSTEM_UI_FLAG_LOW_PROFILE

 네비게이션 버튼과 상태바를 살짝 어둡게 처리합니다.

 public static final int SYSTEM_UI_FLAG_HIDE_NAVIGATION

 네비게이션 바를 숨깁니다.

 public static final int SYSTEM_UI_FLAG_FULLSCREEN

 화면을 전체 화면으로 처리합니다.


예제 코드

 각 버튼에 따라 행동을 처리하였고 LinearLayout을 사용하여 예제를 작성하였습니다.

@SuppressLint("NewApi")
public class NavigationLinearLayoutEvent extends GenericActivity {
	LinearLayout mLinear;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_softkeyevent2);
		
		mLinear = (LinearLayout)findViewById(R.id.linearLayout);
	}
	
	public void onClickListener(View v) {
		switch (v.getId()) {
		case R.id.hide_navigation:
			if(!versionCheck()) return ; 
			mLinear.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
			break;
			
		case R.id.low_profile:
			if(!versionCheck()) return ;
			mLinear.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
			break;
			
		case R.id.low_profile_hide_navigation:
			if(!versionCheck()) return ;
			mLinear.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
			break;
			
		case R.id.fullScreen:
			if(!versionCheck()) return ;
			mLinear.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
			break;
			
		case R.id.eventAll:
			if(!versionCheck()) return ;
			mLinear.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
			break;
		}
	}
	
	private boolean versionCheck() {
		return Build.VERSION.SDK_INT >= 11 ? true : false;
	}
}

결과 화면

 5개의 버튼을 통해 이벤트를 확인가능하며 Low Profile와 Full Screen은 네비게이션 버튼이 없는 폰에서도 정상 동작합니다.


 - 네비게이션 버튼을 숨기기


- Low Profile이 동작 상태

  상태바의 화면이 어둡게 변하고, 네비게이션 버튼이 아래와 같이 변경되었습니다.


- Full Screen 모드

  네비게이션 버튼과는 상관없이 원래 Full Screen 모드처럼 동작합니다.


- 네비게이션 버튼과 Full Screen

  상태입니다. 소스코드에서와 같이 Low Profile와 Hide Navigation을 함께 사용가능하며 Full Screen도 함께 사용이 가능한데 제가 테스트했을 때는 Low Profile이 Hide Navigation을 처리하고 다시 클릭시에 처리가 되었었습니다.


마무리

 이번 코드는 동영상 재생 어플에는 꼭 적용했으면 하여 올려봅니다. 이미 아시는 분들이야 적용해서 사용했을 태지만 소프트웨어 버튼으로 변경된 넥서스 시리즈와 최근에 SW 버튼이 적용된 몇몇 폰들을 위해서 적용해보는것도 좋을 것이라고 생각됩니다. 그리고 동영상 재생시에 네비게이션 버튼 만큼의 공간을 추가로 사용도 가능하구요. 이번 코드는 예제 코드는 위에 올려진 소스코드로 대체합니다. 




댓글