7

縦横比を維持するために、TabWidget の背景画像をスケーリングする必要があります。
TabWidget で TabHost を使用しています。次に、 setBackgroundDrawable を使用して画像を設定しています。

私はここで近い答えを見つけました - Background in tab widget ignore scaling。ただし、新しい Drawable コードをどこに追加すればよいかわかりません。(HelloTabWidget の例を使用すると、RelativeLayout を使用するモジュールはなく、「tabcontent」のレイアウトも表示されません。)

このスレッドも見つけました - Android: Scale a Drawable or background image? . それによると、画像を事前にスケーリングする必要があるように思えます。これは、画像をスケーリング可能にするという目的全体を無効にします。

また、誰かが 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));
}

9patch 画像も試してみましたが、小さすぎます。

それで、これについて行く最善の方法は何ですか?

4

2 に答える 2

1

これをチェックして、うまくいったかどうか教えてください。

カスタム Android タブ

于 2011-11-25T08:31:29.123 に答える
0

背景画像のスケーリングを実行するすぐに使える方法を見つけるのに苦労している理由は、それが一般的に良い習慣とは見なされていないためだと思います。画像をスケーリングすると、アーティファクトやバンディングが発生する傾向があり、UI の見栄えが悪くなります。これに対する例外は Imageview 内ですが、このクラスが提供するスケーリング サポートは、写真や Web コンテンツ (つまり、アプリに同梱されていない画像) などをサポートするためのものであると私は主張します。

UI レイアウトは、リソースベースの背景画像がデバイスの密度/画面サイズに適した解像度に事前にスケーリングされるように設計する必要があります。つまり、複数の画面のサポートに関する開発者ガイドで概説されているリソース フォルダーの命名規則を使用して、複数の画面密度とサイズに対応するために、各ドローアブルの複数のバージョンを提供する必要があります。

UI は、含まれるビューの背景画像をスケーリングする必要なく、デバイス間の画面サイズのわずかな違いを処理できるようにレイアウトする必要があります。提案された UI がどのように見えるかはもちろんわかりませんので、具体的な提案をするのは難しいですが、通常は単純な背景ブロックの色または を使用ShapeDrawableして、ビュー間のスペースを動的に埋めます。

ただし、上記の説教にもかかわらず、背景画像をスケーリングしたいと本当に確信している場合:-)、 a を使用し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());
于 2011-11-02T10:49:50.497 に答える