Frage

Ich brauche meine TabWidget Hintergrund Bilder skaliert werden, so dass sie Seitenverhältnis beibehalten.
Ich verwende einen TabHost mit einem TabWidget. Ich bin dann mit setBackgroundDrawable die Bilder zu setzen.

fand ich eine enge Antwort hier - Hintergrund in Tab Widget Skalierung ignorieren . Aber ich bin nicht sicher, wo die neue Drawable Code hinzuzufügen. (Arbeiten mit dem HelloTabWidget Beispiel keiner meiner Module verwenden RelativeLayout, und ich sehe kein Layout für „tabcontent“).

ich diesen Thread auch gefunden - Android: Maßstab ein Auslosungs oder Hintergrundbild? . Nach ihr, es klingt wie ich meine Bilder müsste den ganzen Zweck vorge skalieren, die sie skalierbar macht besiegt.

Ich fand auch einen anderen Thread, wo jemand die Auslosungs Klasse subclassed so wäre es auch nicht skalieren, oder es würde richtig skaliert werden. Ich kann es jetzt nicht finden, aber das scheint wie eine Menge durch zu gehen, wenn Sie sollten nur in der Lage sein, etwas einfach zu tun wie mTab.setScaleType (centerInside).

Hier ist mein Code:

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>

Haupttätigkeit:

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

ich 9patch Bilder auch versucht, aber sie aufzuwickeln zu klein zu sein.

Also, was ist der beste Weg, um dies zu realisieren?

War es hilfreich?

Lösung

Ich vermute, dass der Grund, warum Sie kämpfen, einen Out-of-the-box Weg zu finden, Hintergrundbild Skalierung durchzuführen ist, dass es im Allgemeinen nicht als gute Praxis gesehen hat. Skalieren von Bildern neigt Artefakte und Banding einzuführen, die UI-Look böse machen. Die Ausnahme ist, innerhalb einer Imageview, aber ich würde diese Klasse stellt die Skalierung Unterstützung argumentieren, ist mehr soll Unterstützung Dinge wie Fotos oder Web-Inhalte (das heißt Bilder, die Sie nicht mit Ihrer Anwendung ausgeliefert).

Ihr UI-Layout sollte derart gestaltet sein, dass alle Ressourcen-basierten Hintergrundbilder auf die richtige Auflösung für die Dichte / Bildschirmgröße des Geräts vorskaliert werden sollen. Mit anderen Worten sollten Sie mehrere Versionen jedes ziehbar gerecht zu werden für mehrere Rasterdichten und Größen mit der Ressource zur Verfügung stellen Ordner in der Mehrere Screens dev Führung zu unterstützen.

Die Benutzeroberfläche sollte dann angelegt werden, so dass jeder geringfügiger Unterschied der Bildschirmgröße zwischen Geräten kann, ohne dass maßstabsHinterGrundBilder von den darin enthaltenen Ansichten behandelt werden. Offensichtlich weiß ich nicht, was Ihr wie UI Aussehen vorgeschlagen, so ist es schwierig, konkrete Vorschläge zu machen, aber in der Regel verwende ich einfachen Hintergrund Block Farben oder ShapeDrawable s, um dynamisch den Raum zwischen den Ansichten füllen.

Allerdings, wenn Sie wirklich wirklich sicher, dass Sie Ihre Hintergrundbilder trotz der Predigt oben :-) maßstäblich, warum nicht versuchen, ein ScaleDrawable Ihre bestehende ziehbar einzuwickeln?

Wenn Sie die Höhe und Breite sowohl Ihre Ansicht und Hintergrundbild ziehbar kennen, dann können Sie so etwas wie:

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

Andere Tipps

Überprüfen Sie diese aus und lassen Sie mich wissen, ob es für Sie gearbeitet.

Individuelle Android Tab

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top