Różnica pomiędzy alpha a visibility dla widoków (np przycisków) w Androidzie

Widzieliście kiedyś w sklepie Play aplikację typu: odblokowywanie odciskiem palca? Z tym, że przykładaliśmy palec do ekranu? Nie trudno domyślić się sztuczki, jaka jest tam zastosowana, czyli gdzieś jest niewidoczny przycisk, po kliknięciu którego aplikacja zadziała, bądź nie. Jednakże chcąc to samemu zaimplementować można stracić trochę czasu, próbując ustawić wartość .setVisibility() na odpowiednim widoku. Do tego typu zastosowań przydaje się metoda .setAlpha() przyjmująca wartości od 0 do 255, gdzie zero oznacza całkowitą przezroczystość. No dobrze, to w takim razie do czego .setVisibility()? Przyjmuje ona 3 parametry:

View.VISIBLE;
View.INVISIBLE;
View.GONE;
Działanie pierwszego jest oczywiste, przycisk ma pozostać normalnie widoczny. Czym się różnią drugi i trzeci? W przypadku w którym zostanie wybrana niewidzialność, nasz obiekt zniknie, ale zajmowane przez niego miejsce pozostanie puste, tak jak by dalej tam był, tylko po prostu niewidzialny. Z kolei, jeśli wybierzemy View.GONE, obiekt zniknie całkowicie. Stworzyłem małe demo obrazującego jak to działa:
Jak widać, wszystkie opcje są włączone, z kolei jeśli wybierzemy GONE dla dwóch pierwszych przycisków:
Dlaczego trzeci przycisk zmienił swoją postać? Fragment xml mam nadzieję wszystko wyjaśni:


android:id=”@+id/button3″
android:layout_below=”@+id/button2″
android:layout_alignParentLeft=”true”
android:layout_alignParentStart=”true”
android:layout_alignRight=”@+id/button2″
android:layout_alignEnd=”@+id/button2″ />
Miał odnosić się do prawej strony przycisku numer dwa, a skoro nie ma przycisku numer dwa, to został mu tylko wrap_content
Metoda .setEnabled() jest raczej oczywista, po prostu włącz bądź wyłącz. Ciekawie robi się w sytuacji, w której połączymy ją z metodą .setAlpha(), ponieważ taka kombinacja, przy opcji visibility jako visible, powoli nam osiągnąć to, o czym pisałem we wstępie, czyli powstanie nasz ukryty przycisk. Jednakże już visibilty jako invisible, zaburzy tą konstrukcję.
Mam nadzieję, że zmieszczone tutaj informację trochę rozjaśnią problemy z dziwnym zachowaniem przycisków w niektórych sytuacjach. Stworzyłem aplikację z którą można trochę poeksperymentować i zobaczyć jak zachowają się przyciski w różnych sytuacjach. Link do repozytorium.
Pozdrawiam!

Google Now coraz lepsze, czyli żegnaj prywatności

Zerkałem dzisiaj na lewy ekran mojego Nexusa, żeby zobaczyć, czy Google Now wyłapał jakieś ciekawe artykuły z sieci. Zauważyłem tam nową informację:

Użyteczne? Jak najbardziej, faktycznie poszukiwałem tego przedmiotu. Tylko, że na komputerze, jakiś tydzień wcześniej. Przekazano całkiem sporo informacji, miedzy innymi o tym, czy to nie fake obniżka, tzn np najniższa cena w sklepie od tygodnia. Jestem zalogowany na to samo konto w wielu miejscach, dlatego nie jest to może dziwne, tylko czy tak trochę niepokojące? Bo jeśli tak dogłębnie się nad tym zastanowić, to Google wie wszystko o mojej działalności na komputerze, może po za tym, co robię w pracy, tam nie korzystam z prywatnego konta. Ale prywatnie, wie wszystko, wie jakiej muzyki słucham, bo korzystam z ich usług, jakie tematy lubię, jedna wielka big data. Znalazłem nawet na stronach Google spis lokalizacji gdzie się znajdowałem o której godzinie. Można by powiedzieć, żegnaj prywatności. Bo oczywiście, skoro te dane gdzieś są, to można je wykraść, skoro są na serwerach amerykańskich, to oczywiście amerykańskie służby wiedzą wszystko o wszystkich, etc. Google może je dowolnie czytać nasze maile. No dobra, nazywam się Michał Gellert, macie mnie. I co? I nic.. Bez problemu możecie dowiedzieć się o mnie więcej. Ale tak naprawdę, po co? Jesteśmy tłumem użytkowników, jeśli nie masz wroga, który z całych sił chce cię zniszczyć i jeśli nie popełnisz tak oczywistych idiotyzmów jak wrzucenie zdjęcia karty płatniczej do sieci, to tak naprawdę, można spać spokojnie. A co zyskujemy w zamian? Słyszałem kiedyś, że w planach Google jest podsyłanie nam gotowych ofert, kiedy będziemy czegoś szukać, poprzez nauczenie się tego co lubimy. Osobiście nienawidzę zakupów, słabo mi na samą myśl. Takie gotowe oferty, to coś co zaoszczędzi mnóstwo moich stresów. Nawet reklamy które nas interesują są lepsze od wiszącego dwa tygodnie na moim Skype najlepszego sposobu na haluksy (lekarze go nienawidzą). Zyskujemy mnóstwo tego typu rzeczy, które możnaby zamnkąć w dwóch słowach: czas i wygoda. Dla mnie to uczciwa wymiana.

Pozdrawiam!

Cardboard i całe to 3D

Wchodzę dzisiaj na bloga i okazuje się, że ostatni wpis popełniłem ponad 2 miesiące temu. Ależ ten czas leci, w między czasie zdążył przewinąć się licznik oznaczający lata, w związku z tym na początek, wszystkiego najlepszego w nadchodzącym roku! Spełnienia wszystkich planów noworocznych, tysięcy przetestowanych linii kodu, o jakości tak dobrej, że Uncle Bob chciałby je umieścić jako przykłady w swoich książkach. Fantastycznych przygód i dalekich podróży, choć jak wiadomo, nie każdy lubi się ruszać z biura. Teraz fantastyczne przygody w trójwymiarze może zapewnić nam tekturka, telefon i dwie plastikowe soczewki. W serwisach aukcyjnych ceny zestawu bez telefonu zaczynają się od jakichś 15 zł z przesyłką z Polski. Mowa o Google Cardboard, czyli okularach rozszerzonej rzeczywistości. Pomysł w swojej prostocie jest genialny, każdy z Nas ma przecież smartfona, najczęściej z Androidem (nie wiem jak wygląda sprawa Cardboard dla innych systemów), więc dlaczego go nie wykorzystać? Zwłaszcza, że ceny okularów 3D z ekranikami mogą dochodzić do tysięcy złotych. Noo i tak naprawdę nie jesteśmy skazani na tekturkę. w cenie około 100 złotych można już nabyć plastikowe okularki z możliwością włożenia smartfona. Warto sobie wypróbować tekturkę, a potem zastanowić się, czy chcemy czegoś lepszego 😉

Google Cardboard w pełnej krasie
Napisałem powyżej, że pomysł jest genialny, wytłumaczę czemu. Android stał się popularny, ponieważ lądował w telefonach za 300 złotych. Tzn, był tani i dostępny dla każdego, koszt wypróbowania telefonu z systemem operacyjnym był relatywnie niski. To się zwróciło, ponieważ w tym momencie ten system zasila ponad miliard urządzeń. Podobnie z rozszerzoną rzeczywistością, nie każdego stać na gadżet za 1000 złotych, nie każdy by go kupił, a tutaj koszt to jakieś 15 złotych, a zabawa naprawdę przednia. Oczywiście, zostało również udostępnione API umożliwiające tworzenie aplikacji na okularki.
Teraz kilka słów o tym jak to działa. Do sterowania używamy głowy tzn rozglądamy się i widzimy rzeczy, kiedy na nie patrzymy, to najczęściej wystarczy, aby je aktywować. Do pomocy mamy też magnes z prawej strony urządzenia, zachowuje się jak suwak, wystarczy przesunąć i urządzenie również zareaguje. Aby wrócić należy przechylić głowę mocno w bok. Było na to kilka innych koncepcji, szczegóły w tym interesującym filmiku.
Pora na wrażenia.. Są naprawdę spoko, urządzenie reaguje na ruch głowy, można wpaść na kilka ciekawych pomysłów aplikacji. Wydawało by się, że dotyk przyszłości, ale czy już na niego czas? Hełmy rozszerzonej rzeczywistości istnieją już na rynku naprawdę długo, pierwszy pojawił się w 1961 r. Plusem nowego pomysłu jest, że jest dostępny praktycznie dla każdego, oraz udostępniono API dla chętnych programistów, ale czy to wystarczy? Rozmawiałem ostatnio z programistą, który zajmuje się tworzeniem aplikacji na tego typu urządzenia i on postawił sprawę w ten sposób, żeby naprawdę nie było widać pikseli i wszystko wyglądało gładko potrzebujemy ekranu 16k. A żeby wyrenderować obraz 16k w 60 fps, (chodzi o zastosowanie w grach) potrzebujemy petaflopsa mocy obliczeniowej. Tak, teraz osiągnęliśmy kilka teraflopsów. Innymi słowy potrzebny jest skok o rząd wielkości.
W związku z tym hit, czy kit? Cóż, ciężko stwierdzić i osobiście nie zastanawiam się nad tym, tylko wkładam swoje Google i coś sobie fajnego porobię 😉 Aktualnie nie mam czasu zająć się programowaniem dla tego „urządzenia” (nie wiem sam, jak je nazwać :)) ale nie wykluczam, że w wolnej chwili, czemu nie. Wszakże wrażenia z korzystania i możliwości są naprawdę super.
Pozdrawiam!

Zmiana density (dpi) w androidzie bez roota

Dzisiaj opiszę jak zmienić DPI bez rootowania telefonu i utraty danych. Wbrew pozorom jest bardzo proste, ale miałem pewne problemy korzystając z tej metody z niektórymi aplikacjami(np. Swiftkey), z kolei klasycznie, przestawiając w pliku build.prop było w porządku. Cóż, ten sposób jest dobry, kiedy szukamy idealnego ustawienia dla siebie 😉 pozwala szybko się przestawiać. Nie mniej, warto ustawić interesujące nas DPI i uruchomić kilka aplikacji, zobaczyć, czy wyglądają i działają w porządku. Warto też pamiętać o tym, że widgety głupieją i czasem znikną z ekranu, tak samo jak foldery z aplikacjami (najczęściej zdarza się to przy zmianie w górę czyli z mniejszej cyfry na większą). Dla porządku napiszę, żadnej odpowiedzialności z mojej strony za cokolwiek. Zmiany na własną odpowiedzialność. Zaczynamy:

1. Aby zadziałało muszą być zainstalowane sterowniki adb, telefon musi mieć włączone debugowanie, oraz oczywiście musi być widoczny w systemie
2. Uruchamiamy wiersz polecenia jako administrator
3. Komenda adb devices zwraca nam informację o podłączonych urządzeniach, najlepiej, żeby podłączone było jedno i żadnych emulatorów
4. Wpisujemy: adb shell wm density 480 && adb reboot 
5. 480 możemy zastąpić liczbą dpi jakie nas interesuje
5. Jeśli zadziałało, telefon uruchomi się od nowa ze zmienionym dpi
5. Operację możemy powtarzać wielokrotnie, aż do uzyskania interesującego wyniku.
6. Jeśli się rozmyślimy i będziemy chcieli przywrócić standardowe dpi, czyli to zapisane w pliku build.prop: adb shell wm density reset && adb reboot

Tak wygląda cała instrukcja, łatwizna prawda? 😉 Efekty zmian można obejrzeć poniżej:

klasyczne DPI Nexus 5, czyli 480 (klasyczne fullHD)
dpi 350, jak widać zmieniła się nam siatka na 5 aplikacji w poziomie

 

dpi 400, ustawione w moim telefonie, wg mnie wygląda najlepiej na Nexusie 5.
Noo i na koniec, co tak właściwie oznacza DPI? Otóż jest to skrót od „dots per inch”, czyli punkty na cal. Oznacza jaka ilość pikseli przypada na cal powierzchni w naszym urządzeniu. Są do tego odpowiednie standardy, ale modyfikacja tych wartości naprawdę może poprawić wygląd i przyjemność korzystania z naszych urządzeń.
Pozdrawiam!

Android 6.0 Marshmallow, nowości, trzy zgrzyty + dwa fixy. Multiwindow, a także density.

Premiera finalnego wydania Androida Marshmallow już za nami, emocje opadły, dla porządku wrzucę główne nowości:

– nowa kontrola uprawnień (np można zainstalować facebooka i zabronić mu przeglądania kontaktów), a nie tak jak kiedyś, jeśli instalujesz aplikację, zgadzasz się na wszystko
– doze, czyli lepsze zarządzanie baterią, tzn telefon uczy się kiedy go nie używasz i w tym czasie nie zbiera powiadomień, znacznie ogranicza ruch w sieci i w ten sposób oszczędza baterię
– kopie zapasowe ustawień, w tym momencie więcej rzeczy jest przechowywanych na serwerze Google, wystarczy tylko zalogować się do aplikacji i dane się synchronizują.
– lepsza edycja tekstu, z poziomu zaznaczenia możliwość włączenia np. tłumacza
– natywne wsparcie czytnika linii papilarnych

I w sumie..tyle. Zaraz, zaraz, czegoś tutaj brakuje:
W wersjach developerskich mieliśmy przecież multiwindow. A do tego był zapowiedziany Now on tap. Z rzeczy które mnie jeszcze osobiście denerwują jest density na poziomie 480. Wszystkie elementy designu są olbrzymie.

Co z Now on tap? Niestety, nie dostępne w naszym kraju. Szkoda, funkcja naprawdę fajna, natychmiastowe wyszukiwanie danych w zależności od kontekstu ekranu. Np, pytam żony, czy może pójdzie na pizzę, ona pyta gdzie, a ja przytrzymuję klawisz home i już wiem, gdzie są najbliżej zjem pizzę. Szkoda, niestety musimy poczekać.

Co z density? Cóż jest pewien sposób na zmianę, który działa zawsze, ale jest niestabilny (kiedyś go opiszę). Pozostaje edycja pliku build.prop.

A co z multiwindow? Otóż udało mi się znaleźć sposób, opisuje jak tego dokonać (oczywiście, nie biorę odpowiedzialności za ewentualne uszkodzenia itp, etc…).

Aby zacząć w komputerze muszą znajdować się sterowniki do fastboot, komputer musi być podłączony przez usb. Sposób nie wymaga roota.

1. Instalujemy Androida 6.0, (testowałem ten sposób na Nexusie 5)
2. Uruchamiamy telefon w trybie bootloader (POWER+VOL DOWN lub fastboot reboot-bootloader)
3. Instalujemy custom recovery, konkretnie TWRP, podaję link do TWRP dla Nexusa 5
3.1 Ważne, aby zaraz po zainstalowaniu, wybrać z menu Bootloadera opcję recovery, inaczej Google usunie nam naszego customowego i wrzuci swojego zaraz przy pierwszym uruchomieniu
3.2 Uwaga, po zakończeniu wszystkich operacji, po wychodzeniu z recovery twrp pyta się, czy zrootować telefon, cóż w wersji twrp-2.8.7.1 ta opcja powoduje bootloop (sprawdzone empirycznie)
4. W menu recovery wybieramy Mounts i klikamy na System
5. Jeśli nie odpalona to odpalamy konsolę, np klikając Shift+PPM i wybierając opcję: „otwórz okno polecenia tutaj”
6. W wierszu polecenia wywołujemy:
adb pull /system/build.prop
7. To polecenie skopiuje nam z telefonu do miejsca gdzie otwarliśmy konsolę plik build.prop, nie zamykamy konsoli
8. Edytujemy plik build.prop jak tekst (osobiście używam i polecam Notepad++)
9. Znajdujemy takie linie:
ro.sf.lcd_density=480
ro.build.type=user
10. Edycja pierwszej z nich pozwala na zmianę density (moja ulubiona wartość to 400)
11. Edycja drugiej z user na userdebug spowoduje, że w opcjach programistycznych, po włączeniu urządzenia pojawi się coś takiego (zwróćcie uwagę na inny kształt menu, tak się prezentuje density 400):


12. Zapisujemy plik
13. W konsoli wywołujemy po kolei:
adb push build.prop /system/
adb shell
cd system
chmod 644 build.prop
14. Uruchamiamy urządzenie normalnie
15. Po włączeniu w opcjach programistycznych cieszymy się multiwindow!

Należy pamiętać, że multiwindow jest w dalszym ciągu opcją rozwojową, w związku z tym mogą zdarzać się problemy (czytałem, że czasem battery drain).

Po tych poprawkach jest już trochę lepiej, nie mniej dalej brakuje motywów, czy możliwości edycji ikon na pasku. Cóż, czekamy na dalszy rozwój 😉

Pozdrawiam!

Snackbar vs Toast

Wraz z Androidem 5.0 pojawił się Material Design, a razem z nim API do krótkiego wyświetlania powiadomień o nazwie Snackbar. Można na nim łatwo zaimplementować przycisk, co w przypadku Toast nie było już takie proste. Jednak mimo to Toast nie otrzymało statusu @Deprecated, czyli można stosować obydwa elementy, najlepiej w zależności od kontekstu w którym chcemy użyć krótkiego powiadomienia. Po za kontekstem, ważny może być również design i ogólny ux podczas korzystania z aplikacji. Nie spotkałem się z dokładnym przedstawienie kiedy używać którego, podpowiedzią może być to, że Snackbara wystarczy przesunąć aby zniknął, z kolei Toast miał ograniczony czas widoczności i po prostu musi swoje na ekranie wisieć.

Najprostsza implementacja wygląda w ten sposób.

Snackbar:
Snackbar.make(rl, „Snackbar”, Snackbar.LENGTH_LONG).show();

gdzie rl to RelativeLayout na którym ma być wyświetlony Snackbar.

Toast:
Toast.makeText(getApplicationContext(), „Toast”, Toast.LENGTH_LONG).show();

Jak widać, różnic zbyt wielu nie ma, Snackbar odnosi się do layoutu, z kolei Toast do contentu.
Kod który tutaj wkleiłem to implementacja Snackbara z biblioteki AndroidDesignSupportLibrary, o której już wspominałem. Tak wygląda to w najprostszej postaci:

Projekt na githubie.

Pozdrawiam!

Jak zrobić piękną aplikację

Na pewno każdy już zauważył następującą tendencję, że im aplikacja jest ładniejsza, tym ma więcej pobrań. Content jest oczywiście bardzo ważny, ale o wiele lepiej nam korzystać z czegoś co jest przyciąga wzrok, nie jednokrotnie godząc się nawet z częściowym ukryciem potrzebnej funkcjonalności pod jakąś piękną animacją. Czasem jednak coś jest piękne, ale bezużyteczne. Ważne, aby znaleźć złoty środek pomiędzy tymi dwoma wartościami. Ale nie o tym chciałem pisać. Pytanie które chciałem dzisiaj zadać, to jak ważny jest design dla programisty Android? Odpowiedź: coraz ważniejszy. Nie każdy ma jednak talent plastyczny, aby stworzyć piękną grafikę. Ja osobiście, mam taki problem, często wychodzą mi jakieś niedopasowane kolorami i kształtami szkarady. Jednak jest na to sposób, gotowce. Użyłem jednego w swojej poprzedniej aplikacji, dlatego chciałem dzisiaj przedstawić kilka przykładów, oraz podać miejsca gdzie szukać inspiracji.
Zaczynamy od animacji której sam osobiście użyłem ostatnio, czyli:

Ten twórca stworzył jeszcze jedną, bardzo podobną:

Prawda, że są ładne? Znalazłem je na stronie android-arsenal. Godnym polecenia miejscem, gdzie możemy szukać jest również strona dribbble. O to dwa piękne cuda które tam znalazłem:

Implementacja tego typu rozwiązań jest najczęściej bardzo prosta. I stosunkowo niewielkim kosztem można naprawdę bardzo polepszyć wygląd swojej aplikacji. Przy czym jak pisałem we wstępie, nie należy zapominać o funkcjonalności 😉
Pozdrawiam!

Kontrola biletów Wrocław

Mieszkańcy Wrocławia! Tak właściwie, to dla Was jest skierowany ten wpis. Chciałbym mianowicie podzielić się swoim ostatnim dziełem jakim jest aplikacja „Kontrola biletów Wrocław”. Aplikacja nie jest szczególnie rozbudowana, ale wydaje mi się, że przydatna. Pobiera ze strony wroclaw.pl dane o aktualnych kontrolach MPK i prezentuje je w ładnej formie. Myślę, że każdemu taka informacja może się przydać 😉 Oto jak działa:
A tutaj link skąd można ją pobrać
Mam nadzieję, że się przyda, ja na pewno będę z niej korzystał 😉
Pozdrawiam!

Animacja zmiany activity

Zauważyliście, że różni producenci stosują czasem różne animacje nowego activity w aplikacjach? Dzisiaj pokażę, jak ujednolicić animację, zwłaszcza wtedy kiedy tworzymy jakiś kreator, jest ona całkiem intuicyjna, zresztą, sami zobaczcie:

Dzisiejszy wpis będzie opowiadał o utworzeniu tej animacji od zera w nowym projekcie, tak aby początkujący poradzili sobie bez problemu, z kolei pro users, znajdą to, czego potrzebują.
Zaczynamy od utworzenia nowego projektu w AndroidStudio, ja pierwszą aktywność nazwałem FirstActivity.

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
    }

}

Po utworzeniu projektu, tworzymy następne Activity klikając File/New/Activity/Blank Activity. Nazwałem je SecondActivity. Kod jest analogiczny jak powyżej, oczywiście inna nazwa klasy i inny parametr metody setContentView. 

Teraz przechodzimy do layoutu i dodajemy, można przez przeciąganie, button. Layout dla pierwszego Activity wygląda tak:

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
    xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent”
    android:layout_height=”match_parent” android:paddingLeft=”@dimen/activity_horizontal_margin”
    android:paddingRight=”@dimen/activity_horizontal_margin”
    android:paddingTop=”@dimen/activity_vertical_margin”
    android:paddingBottom=”@dimen/activity_vertical_margin” tools:context=”.FirstActivity”>

    <TextView android:text=”@string/hello_world” android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:id=”@+id/textView2″ />

    <Button
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:text=”@string/next”
        android:id=”@+id/nextBtn”
        android:onClick=”nextClick”
        android:layout_below=”@+id/textView2″
        android:layout_alignParentLeft=”true”
        android:layout_alignParentStart=”true” />

</RelativeLayout>

Layout dla drugiego Activity, jest oczywiście analogiczny, tylko tutaj zamiast next, mamy prev. Czyli pod wywołaniami onClick znajdują się metody nextClick i prevClick. Oto jak je zaimplementować:

public void nextClick(View view) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
        overridePendingTransition(0, 0);
    }

Metoda overridePendingTransition, to właśnie ta metoda, która odpowiada za animacje pomiędzy Activity. Dokumentacja znajduje się tutaj:
overridePendingTransition doc
Jak widzimy, pod parametrami enter anim oraz exit anim mamy w tym momencie zero i zero. Oznacza to tyle, że nie będzie żadnej animacji przejścia, czyli taki oto efekt:

Ok, a teraz dodamy animacje przejścia ekranu.
Klikamy na folder res, wybieramy new i android resource directory. Nazwiemy sobie nasz katalog anim. Następnie, tworzymy w tym katalogu 4 pliki:

left_in.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”0″
        android:toXDelta=”100%p”
        android:duration=”300″/>
</set>  

left_out.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”0″
        android:toXDelta=”-100%p”
        android:duration=”300″/>
</set> 

right_in.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”100%p”
        android:toXDelta=”0″
        android:duration=”300″/>
</set>  

right_out.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”-100%p”
        android:toXDelta=”0″
        android:duration=”300″/>
</set> 

Teraz tak, w metodzie nextClick zamieniamy parametry na:
overridePendingTransition(R.anim.right_in, R.anim.left_out);
Z kolei w metodzie prevClick:
overridePendingTransition(R.anim.right_out, R.anim.left_in);

I już, gotowe 😉 Animacja działa, możemy ją zwolnić lub przyspieszyć parametrem duration, u mnie trwa 300ms. Albo zmienić sposób rozchodzenia się obrazów metodami fromX oraz toX.
Podaję jeszcze link na githuba z tą właśnie animacją:
github migellal

Pozdrawiam!

TextInputLayout, czyli animowany EditText

To już kolejny wpis o bibliotece:
Android Design Support Library
Dzisiaj chciałem skupić się na bardzo ładnie animowanym polu typu EditText, a mianowicie:

Prawda, że ładne? Zwłaszcza, że możemy dowolnie dobrać sobie te kolory. Ale do kodu. Aby uzyskać taki efekt potrzebujemy obudować nasze pole EditText czymś takim:

<android.support.design.widget.TextInputLayout
        android:layout_width=”match_parent”
        android:layout_height=”wrap_content”
        android:theme=”@style/TextInputTheme”
        android:id=”@+id/usernameTIL” >

<EditText
            android:id=”@+id/usernameET”
            android:layout_width=”match_parent”
            android:layout_height=”wrap_content”
            android:textSize=”23sp”
            android:hint=”@string/username” />

</android.support.design.widget.TextInputLayout>

Oczywiście, o czym wspominałem w poprzednim wpisie, musimy dodać bibliotekę do gradle:

compile 'com.android.support:design:22.2.0′

Kod który wkleiłem wygląda jakby opisywał się sam, więc nie będę się nad nim rozwodził, ale pokażę w jaki sposób ustawić sobie kolory na takie, które nas interesują i pasują do projektu. Wszystko kryje w pliku styles.xml, dodajemy tam:

<style name=”TextInputTheme” parent=”TextAppearance.AppCompat”>
        <item name=”android:textColorHint”>@color/primary</item>
        <item name=”colorAccent”>@color/accent</item>
        <item name=”colorControlNormal”>@color/controlNormal</item>
        <item name=”colorControlActivated”>@color/controlActivated</item>
    </style>

Tutaj również wszystko jest samo-opisowe, a jeśli nie jest, to zapraszam do dokumentacji, bądź samodzielnych prób. Te mają to do siebie, że czasem możemy zmienić inny element niż chcieliśmy, ale w efekcie osiągnąć coś innego, ciekawszego niż planowaliśmy. Przynajmniej mi, czasem się tak zdarza.

Ostatnią rzeczą o której chciałem powiedzieć jest efekt uzyskany po wykonaniu po stronie javy tego kodu:

setErrorEnabled(true);
setError(getString(R.string.error_message));

Dzięki temu, możemy ustalić, aby wymagane było uzupełnienie naszego pola. W przypadku jeśli ktoś przejdzie do następnego elementu, zostanie w polu EditText wyświetlona informacja zawarta w stringu error_message. Tutaj również pojawia się ładna animacja, zresztą, sprawdźcie sami.

Pozdrawiam!