2010-12-16 14 views
7

Muszę przeskalować obrazy tła TabWidget, aby zachować proporcje.
Używam TabHost z TabWidget. Używam następnie setBackgroundDrawable do ustawienia obrazów.TabHost/TabWidget - obraz w tle skali?

Znalazłem krótką odpowiedź tutaj - Background in tab widget ignore scaling. Jednak nie jestem pewien, gdzie dodać nowy kod Drawable. (Praca z przykładem HelloTabWidget, żaden z moich modułów nie używa RelativeLayout i nie widzę żadnego układu dla "tabcontent".)

Znalazłem również ten wątek - Android: Scale a Drawable or background image?. Zgodnie z tym, brzmi to tak, jakbym musiał wstępnie skalować moje obrazy, co jest sprzeczne z celem ich skalowania.

Znalazłem również inny wątek, w którym ktoś podzielił klasę Szuflady, aby nie skalować, lub skalował się prawidłowo. Nie mogę go teraz znaleźć, ale wydaje mi się, że jest to DUŻO, kiedy powinieneś być w stanie zrobić coś prostego, jak mTab.setScaleType (centerInside).

Oto mój kod:

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/main_background"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/>   
    <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0"/> 
    </LinearLayout> 
</TabHost> 

Główna działalność:

 tabHost.setOnTabChangedListener(new OnTabChangeListener() { 
      TabHost changedTabHost = getTabHost(); 
      TabWidget changedTabWidget = getTabWidget(); 
      View changedView = changedTabHost.getTabWidget().getChildAt(0); 

      public void onTabChanged(String tabId) { 
       int selectedTab = changedTabHost.getCurrentTab(); 
       TabWidget tw = getTabWidget(); 

       if(selectedTab == 0) { 
        //setTitle("Missions Timeline"); 
        View tempView = tabHost.getTabWidget().getChildAt(0); 
        tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_timeline_on)); 
        tempView = tabHost.getTabWidget().getChildAt(1); 
        tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_map_off)); 
        tempView = tabHost.getTabWidget().getChildAt(2); 
        tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_search_off)); 
        tempView = tabHost.getTabWidget().getChildAt(3); 
        tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_news_off)); 
        tempView = tabHost.getTabWidget().getChildAt(4); 
        tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_license_off)); 
          //ImageView iv = (ImageView)tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon); 
          //iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_timeline_on)); 
          //iv = (ImageView)tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon); 
          //iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_off)); 
        } else if (selectedTab == 1) { 
         //setTitle("Spinoffs Around You"); 
         View tempView = tabHost.getTabWidget().getChildAt(0); 
         tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_timeline_off)); 
         tempView = tabHost.getTabWidget().getChildAt(1); 
         tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_map_on)); 
         tempView = tabHost.getTabWidget().getChildAt(2); 
         tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_search_off)); 
         tempView = tabHost.getTabWidget().getChildAt(3); 
         tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_news_off)); 
         tempView = tabHost.getTabWidget().getChildAt(4); 
         tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_license_off)); 
} 

Próbowałem też 9patch obrazów, ale wiatr się zbyt mała.

Jaki jest najlepszy sposób, aby to osiągnąć?

Odpowiedz

0

Podejrzewam, że powodem, dla którego próbujesz znaleźć gotowy do użycia sposób skalowania obrazu w tle, jest to, że nie uważa się go za dobrą praktykę. Skalowanie obrazów ma tendencję do wprowadzania artefaktów i pasm, które mogą sprawiać, że twój interfejs będzie wyglądał paskudnie. Wyjątkiem jest sytuacja w obrębie Widoku obrazu, ale uważam, że obsługa skalowania, którą zapewnia ta klasa, ma na celu w szczególności obsługę zdjęć lub treści internetowych (np. Obrazów, które nie zostały dostarczone z aplikacją).

Układ interfejsu użytkownika powinien być zaprojektowany w taki sposób, aby wszystkie obrazy tła oparte na zasobach były wstępnie skalowane do właściwej rozdzielczości dla gęstości/rozmiaru ekranu urządzenia. Innymi słowy, powinieneś dostarczać wiele wersji każdego losowania, aby zaspokoić gęstość i gęstość wielu ekranów, stosując konwencję nazewnictwa folderów zasobów opisaną w przewodniku dev dev. Supporting Multiple Screens.

Interfejs użytkownika powinien być tak rozplanowany, aby można było manipulować niewielkimi różnicami w rozmiarze ekranu pomiędzy urządzeniami bez konieczności skalowania obrazów tła zawartych w nich widoków. Oczywiście nie wiem, jak wygląda proponowany interfejs użytkownika, więc trudno jest podać konkretne sugestie, ale generalnie używam prostych kolorów tła lub ShapeDrawable s, aby dynamicznie wypełniać przestrzeń między widokami.

Jednakże, jeśli naprawdę jesteś pewien, że chcesz przeskalować obrazy tła pomimo powyższego przepowiadania :-), dlaczego nie spróbować użyć istniejącego ciągnięcia za pomocą ScaleDrawable?

Jeśli znasz wysokość i szerokość zarówno w widoku i tło obrazu rozciągliwej, można zrobić coś takiego:

Drawable backgroundDrawable = getResources().getDrawable(R.drawable.tab_license_off); 
tempView.setBackgroundDrawable(
    new ScaleDrawable(
     backgroundDrawable, 
     Gravity.CENTER, 
     tempView.getWidth()/backgroundDrawable.getIntrinsicWidth(), 
     tempView.getHeight()/backgroundDrawable.getIntrinsicHeight()); 
Powiązane problemy