2010-12-16 2 views
7

Мне нужно масштабировать фоновые изображения TabWidget, чтобы они поддерживали соотношение сторон.
Я использую TabHost с TabWidget. Затем я использую setBackgroundDrawable для установки изображений.TabHost/TabWidget - масштабировать фоновое изображение?

Я нашел здесь близкий ответ - Background in tab widget ignore scaling. Однако я не уверен, где добавить новый код Drawable. (Работа с примером HelloTabWidget, ни один из моих модулей не использует RelativeLayout, и я не вижу никакого макета для «tabcontent».)

Я также нашел эту тему - Android: Scale a Drawable or background image?. По его словам, похоже, что мне придется предварительно масштабировать мои изображения, что наносит ущерб всей цели сделать их масштабируемыми.

Я также нашел другую тему, в которой кто-то подклассифицировал класс Drawable, чтобы он не масштабировался или не масштабировался должным образом. Я не могу найти его сейчас, но это похоже на LOT, чтобы пройти, когда вы просто должны сделать что-то простое, например mTab.setScaleType (centerInside).

Вот мой код:

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> 

Основная деятельность:

 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)); 
} 

Я также попытался 9patch изображения, но ветер слишком мал.

Итак, что является лучшим способом для этого?

ответ

0

Я подозреваю, что причина, по которой вы изо всех сил пытаетесь найти готовый способ сделать фоновое изображение, заключается в том, что его обычно не считают хорошей практикой. Масштабирование изображений имеет тенденцию вводить артефакты и бандажи, которые могут сделать ваш пользовательский интерфейс выглядящим противным. Исключение из этого заключается в Imageview, но я бы сказал, что поддержка масштабирования, предоставляемая этим классом, больше предназначена для поддержки таких вещей, как фотографии или веб-контент (т. Е. Изображения, которые вы не отправили с вашим приложением).

Ваш макет интерфейса должен быть спроектирован таким образом, чтобы любые изображения на основе ресурсов были предварительно масштабированы до правильного разрешения для плотности/размера экрана устройства. Другими словами, вы должны предоставлять несколько версий каждого из них, чтобы обслуживать множество плотностей и размеров экрана, используя соглашение об именах каталогов ресурсов, описанное в руководстве для разработчиков Supporting Multiple Screens.

Пользовательский интерфейс должен быть выложен таким образом, чтобы любые небольшие различия в размере экрана между устройствами можно было обрабатывать без необходимости масштабирования фоновых изображений его содержащихся представлений. Очевидно, я не знаю, как выглядит ваш предлагаемый пользовательский интерфейс, поэтому трудно сделать какие-либо конкретные предложения, но обычно я использую простые цвета фона фона или ShapeDrawable s для динамического заполнения пространства между представлениями.

Однако, если вы действительно уверены, что хотите масштабировать свои фоновые изображения, несмотря на проповедь выше :-), почему бы не попробовать использовать ScaleDrawable для обертывания существующего чертежа?

Если вы знаете, высоту и ширину как ваш взгляд и Drawable фоновое изображение, то вы можете сделать что-то вроде:

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