2012-03-15 7 views
27

Obecnie piszę projekt open source, który ma na celu przeniesienie słynnego motywu Holo do poprzednich wersji Androida (od 1,6 !!!)Jak mogę uzyskać taki sam niezdefiniowany pasek postępu jak ICS z 2 obrotowymi okręgami?

Wszystko działa dobrze i jestem naprawdę dumny z mojej pracy, ale Problemem, przed którym stoję teraz, jest sprawienie, by ProgressBar wyglądał zupełnie jak ICS.

, że stosuje się ten sam kod xml niż źródła Android (progress_medium_holo.xml)

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <rotate 
      android:drawable="@drawable/spinner_48_outer_holo" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:fromDegrees="0" 
      android:toDegrees="1080" /> 
    </item> 
    <item> 
     <rotate 
      android:drawable="@drawable/spinner_48_inner_holo" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:fromDegrees="720" 
      android:toDegrees="0" /> 
    </item> 
</layer-list> 

z tym samym PNG

spinner_76_outer_holo.png i spinner_76_inner_holo.png

enter image description here biały pic =>enter image description here

Niestety, mam tylko jedno kółko ...

Jeśli nie rozumiesz, co mam na myśli, można spróbować tej aplikacji na urządzeniu pre-ICS:

https://play.google.com/store/apps/details?id=com.WazaBe.HoloDemo

pełną źródło jest tutaj: https://github.com/ChristopheVersieux/HoloEverywhere

Dziękuję dużo za pomoc

enter image description here

+0

Czy możesz podać cały projekt jako plik zip? –

+0

Pełne źródło jest tutaj: https://github.com/ChristopheVersieux/HoloEverywhere –

+0

Podczas przeglądania twojego kodu źródłowego zastanawiałem się, dlaczego wziąłeś animację xmls do folderu układu. Umieść je w folderze anim, więc inni programiści nie będą zdezorientowani. –

Odpowiedz

12

Wystarczy znaleźć odpowiedź tutaj!

https://stackoverflow.com/a/8697806/327402

Bardzo przydatny post!

Rzeczywiście istnieje ograniczenie platformy, choć nie jest to coś, co można by pomyśleć. Problem polega na tym, że pre-API11, RotateDrawable zawierał jakiś surowy kod, który wymagałby, aby animacja obracała się zgodnie z ruchem wskazówek zegara, sprawdzając, czy toDegrees była większa niż ; jeśli nie, obaj zostali przymusowi równi wobec siebie. Jeśli zmodyfikowałeś swój przykład, aby drugi element poruszał się w kierunku do przodu (od 0 do 720, lub nawet od -720 do 0), oba obrazy byłyby animowane poprawnie na wszystkich platformach; choć zdaję sobie sprawę, że pokonuje cel tego, do czego dążysz.

Spójrz na wersję z pamięci podręcznej Google Codesearch ma RotateDrawable.inflate(), która jest wersją 2.3 metody użytej do przekształcenia XML w obiekt, a zobaczysz, co mam na myśli.

RotateDrawable.java ... kod naruszający prawa dotyczy linii 235 ...

float fromDegrees = a.getFloat(
      com.android.internal.R.styleable.RotateDrawable_fromDegrees, 0.0f); 
    float toDegrees = a.getFloat(
      com.android.internal.R.styleable.RotateDrawable_toDegrees, 360.0f); 

    toDegrees = Math.max(fromDegrees, toDegrees); //<--There's the culprit 

Dzieje bloku XML podobny do drugiego elementu, który tam masz, i zamienia ją w RotateDrawable że kończy się o tej samej wartości dla fromDegrees i toDegrees (w przypadku, 720), powodując, że obraz do po prostu stać w miejscu. Możesz to sprawdzić, ustawiając wartość początkową na pewną wartość, nie wielokrotność 360 (jak 765). Zobaczysz, że obraz nadal nie jest animowany, ale jest obrócony do początkowej współrzędnej.

Ta niezręczna kontrola została usunięta ze źródeł typu Honeycomb/ICS, dlatego można wykonywać rotacje wstecz na tych platformach. Także, to nie wygląda istnieje sposób, aby ustawić te wartości z kodu Java, więc zwyczaj RotateDrawableCompat może być w przyszłości :)

HTH

0

nie jestem pewien, ale myślę, że <rotate> tag wewnątrz warstwą liście jest po prostu nie jest kompatybilny z Androidem 1.6.

Patrząc w Donut (1.6) kod źródłowy widzę, że spinner jest realizowany w ten sposób (progress_medium.xml):

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/spinner_black_48" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:framesCount="12" 
    android:frameDuration="100" /> 

Można spróbować z kanału alfa Holo.

Nadzieja pomaga,
YuVI

+0

LayerDrawable: Od: API Level 1: Klasa Przegląd rozciągliwej, która zarządza szereg innych Drawables. Są one rysowane w kolejności tablicowej, więc element z największym indeksem zostanie narysowany na górze. Można go zdefiniować w pliku XML z elementem . Każdy możliwy do ściągnięcia w warstwie jest zdefiniowany w zagnieżdżonej http://developer.android.com/reference/android/graphics/drawable/LayerDrawable.html –

+0

Ok ... ale czy wypróbowałeś "animowany obrót"? – YuviDroid

4

W uzupełnieniu do odpowiedzi Profete162 za: Wiem, że Jake udało się ominąć to ograniczenie w swojej implementacji SherlockActionBar i sprawić, że obrócony obraz będzie widoczny. Patrząc na kod źródłowy dla abs__progress_medium_holo.xml wygląda na to, że po prostu obrócił wartości fromDegrees i toDegrees, chociaż może być czegoś więcej, czego nie jestem świadomy.

+0

Niestety, modyfikowanie z/do niczego nie zmienia ... –