TabHost / TabWidget - масштабировать фоновое изображение? - PullRequest
7 голосов
/ 16 декабря 2010

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

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

Я также нашел эту тему - Android: масштабировать рисованное или фоновое изображение? . В соответствии с этим, звучит так, будто мне придется предварительно масштабировать мои изображения, что лишает смысла делать их масштабируемыми.

Я также нашел другой поток, в котором кто-то подклассифицировал класс Drawable, чтобы он либо не масштабировался, либо корректно масштабировался. Я не могу найти его сейчас, но это похоже на МНОГО, когда вам нужно просто сделать что-то простое, например, 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));
}

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

Итак, как лучше всего это сделать?

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Проверьте это и дайте мне знать, сработало ли это для вас.

Пользовательская вкладка Android

0 голосов
/ 02 ноября 2011

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

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

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

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

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

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