'Background'에 해당되는 글 1건

  1. 2010.04.13 Technical Arcticle 2 : Window backgrounds & UI Speed 187
Android/정리2010. 4. 13. 13:31

Window Backgrounds & UI Speed

일부 안드로이드 어플리케이션들은 UI toolkit 뛰어넘는 성능을 요구되며 그렇게 하기 위한 가지 방법이 있다. 문서에서 당신은 그리기와 액티비티가 화면에 보여지는 시간을 빠르게 하는 방법을 발견하게 될것이다. 두가지 기술은 모두 윈도우의 백그라운드 그리기(window’s background drawable) 특성에 기인한다.

Window background 다소 오해하게 하는 용어이다. 당신이 setContentView() Activity에서 호출하여 UI 설정하면 안드로이드는 Activity 윈도우에 당신의 뷰를 추가한다. 하지만 윈도우에는 당신이 추가한 뷰만 있는 것이 아니다. 여기서 가장 중요한 하나는 뷰구조의 가장 상위에는 DecorView 있다는 것이다.

A typical Android view hierarchy

DecorView 실제로 윈도우의 background drawable 가지고 있는 뷰이다. 당신의 액티비티에서 getWindow().setBackgroundDrawable() 호출함으로써 DecorView background drawable 변경하게 된다. 이는 현재 구현된 안드로이드에 아주 국한된 내용이며 향후 버전이나 디바이스에서 변경될수 있다.

당신이 표준안드로이드 테마를 사용한다면 디폴트 background drawable 당신의 액티비티에 셋팅된다. T-Mobile G1에서 현재 ColorDrawable 사용되고 있다. 대부분의 애플리케이션에서 이미지는 동작하고 남겨진다. 이는 반대로 당신의 어플리케이션에 그리기 성능에 영향을 줄수 있다. 항상 전체화면에 불투명한 그림을 그리는 예제가 있다.

An opaque user interface doesn't need a window background 

그림은 ImageView 의해 커버되는 윈도우의 배경이 없는 스크린샷이다. 애플리케이션은 최대한 빠르게 다시그리기를 하도록 구현되었다. 44 fps 속도로 그려지고 있다. 이와 같이 속도를 개선하기 위한 쉬운방법은 background drawable 제거하는것이다. UI 불투명하기 때문에 배경을 그리는 것은 낭비적이다. 따라서 배경의 제거는 성능향상에 효과적이다.

Remove the background for faster drawing

새버전의 애플리케이션은 51fps까지 향상되었다. 개선된 차이는 T-Mobile G1 메모리버스의 속도 향상으로 쉽게 설명된다.

커스텀테마를 사용하여 배경을 제거하는 것을 쉽게 있다. 먼저 res/values/themes.xml 만들고 아래와 같이 내용을 추가하라.

<resources>
   
<style name="Theme.NoBackground" parent="android:Theme">
       
<item name="android:windowBackground">@null</item>
   
</style>
</resources>

그러고 android:theme=”@style/Theme.NoBackground”속성을 당신의 <activity/> <application/>테그에 추가하면 된다. 크릭은 MapView, WebView fullscreen 사용하는 어플에서 많이 사용된다.

불투명 뷰와 안드로이드 : 최적화방식은 안드로이드 UI툴킷이 현재 불투명한 자식뷰들에 의해 숨겨진 뷰의 그리기에 대해 충분히 스마트하지 않기 때문에 필요하다. 이런 최적화가 구현되지 않은 주된 이유는 간단하다 안드로이드 애플리케이션내에서 불투명한 뷰는 아주 조금 사용되기 때문이다.

윈도우 배경을 변경하기 위해 테마를 사용하는 것은 액티비티의 시작을 인지하는 성능을 개선하기 위한 최고의 방법이다. 트릭은 커스텀 백그라운드(texture logo) 사용하는 액티비티에만 적용이 가능하다. Shelves애플리케이션이 좋은 예제가 된다.

Textured backgrounds are good candidates for window's background

애플리케이션시 나무느낌배경을 XML이나 onCreate에서 설정하면 사용자는 어두운 배경이나 디폴트테마를 가지고 시작될것이다. 나무느낌배경은 콘텐트뷰의 inflation이후에 표시될것이며, 첫번째 layout/drawing 수행될것이다. 이것은 부작용을 야기하고 애플리케이션이 로드되는데 시간이 걸린다는 느낌을 받게 될것이다.

반면에 애플리케이션이 테마에 나무느낌배경을 정의하면 애플리케이션이 시작되자마자 시스템에 의해 로드된다. 사용자는 디폴트테마를 절대로 볼수 없으며 애플리케이션이 로드중이라는 느낌도 받지 않을것이다. 메모리와 디스크의 사용을 제한하기 위해 res/drawable/background_shelf.xml 정의되어 연결된다:

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
   
android:src="@drawable/shelf_panel"
   
android:tileMode="repeat" />

drawable 테마에서 참조된다.

<resources>
   
<style name="Theme.Shelves" parent="android:Theme">
       
<item name="android:windowBackground">@drawable/background_shelf</item>
       
<item name="android:windowNoTitle">true</item>
   
</style>
</resources>

동일한 트릭이 T-Mobile G1 탑재된 Google Map애플리케이션에도 사용되었다. 애플리케이션이 적재되면 MapView tile 로딩되는 것을 바로 볼수 있다.

때때로 최고의 트릭은 또한 최고로 단순한것이다. 따라서 당신이 불투명한 UI 커스텀배경을 사용하는 액티비티를 만들어야 윈도우배경을 변경해야 함을 기억하라.

Download the source code of the first example.

Download the source code of Shelves.

 

Posted by 삼스