Mam formularz, który dynamicznie generuję na podstawie danych, które otrzymuję z usługi internetowej. Ta usługa sieci Web zapewnia obrazy, które należy wykorzystać w tworzeniu elementów wejściowych. Mam trudności z ustawieniem progressDrawable
z RatingBar
. Choć XML jestem w stanie zastosować niestandardowy obraz przy użyciu następujących jako progressDrawable
:Konstruowanie paska ocen za pomocą obrazów załadowanych z Internetu
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+android:id/background" android:drawable="@drawable/custom_star" />
<item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/custom_star" />
<item android:id="@+android:id/progress" android:drawable="@drawable/custom_star" />
</layer-list>
gdzie custom_star
jest prosty obraz .png, a wraz z @android:style/Widget.RatingBar
jak styl RatingBar. Działa to dobrze:
ale ja chcąc zmienić custom_star
dynamicznie.
W kodzie, próbowałem ustawienie rozciągliwej postępu za pomocą bitmapy bezpośrednio:
Drawable d = new BitmapDrawable(getResources(), downloadedImage);
ratingBar.setProgressDrawable(d);
a także konstruowania layer-list
:
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] {
getResources().getDrawable(R.drawable.custom_star),
getResources().getDrawable(R.drawable.custom_star),
getResources().getDrawable(R.drawable.custom_star)
});
layerDrawable.setId(0, android.R.id.background);
layerDrawable.setId(1, android.R.id.secondaryProgress);
layerDrawable.setId(2, android.R.id.progress);
ratingBar.setProgressDrawable(layerDrawable);
Ani pracuje dla mnie; zarówno skutkować custom_star
odkształcalne pojawiające się raz, przeciągnął przez wymiarów RatingBar
:
pomysłów?
Update: Odpowiedź
Luksprog jest poniżej dokonał poprawę, ale nadal mam kilka problemów. Teraz odkształcalne gwiazda nie jest rozciągnięta i wartość można ustawić za pomocą dotyku, ale wydaje się, tak z 3/5 wybrany:
i 5/5 wybrany:
Uważam, że skalowanie obrazów można naprawić za pomocą kilku poprawek, ale denerwująco rysowanie secondaryProgress
wydaje się nie być ustawione - ciągnięcie używane dla wyszarzonych nie wybranych gwiazd. Bez tego nie jest to zbyt użyteczne.
Świetne rzeczy. To zdecydowanie działa dla mnie, chociaż nie mogę tego zrobić, aby ustawić secondaryProgress. Gwiazdy pojawiają się po kliknięciu, ale wyszarzone, niewybrane tło nie pojawiają się (używam innego losowania, R.drawable.star_off). – blork
Chociaż Twoje dokładne rozwiązanie nie działało dla mnie, sprawdziłem [kod źródłowy Androida dla ProgressBar] (http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/ android/2.3.3_r1/android/widget/ProgressBar.java /) zgodnie z sugestią, a wyodrębnianie metody tileify() zadziałało dla mnie świetnie. Dzięki! – blork
@blork Przepraszam za opublikowany przeze mnie kod (nie miałem zbyt dużo czasu), nie w pełni zreplikowałem tę metodę (w jakiś sposób straciłem flagę 'clip'). Jestem pewien, że udało ci się również sprawić, by gwiazdy miały właściwy rozmiar. 'RatingBar' ustawia swoją szerokość, mnożąc szerokość jednej z bitmap z liczbą gwiazdek (obliczając to w metodzie' onMeasure' niestandardowego 'RatingBar' powinno pokazywać odpowiednią ilość gwiazdek). – Luksprog