Pokazywanie postów oznaczonych etykietą Udacity. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Udacity. Pokaż wszystkie posty

czwartek, 20 sierpnia 2020

Android Basics - User Interface

Tego kursu wcześniej nie słuchałam i jak teraz usłyszałam, że to dla kogoś, kto nigdy nie napisał ani jednej linijki kodu, to zaczęłam wątpić...

Ale dobrze, pomyślałam, przekonaj się, że to umiesz, a przy okazji może usłyszysz jakąś informację, o której nie wiesz. I tak dowiedziałam się o:

  • atrybucie android:textAppearance="?android:textAppearanceSmallInverse"  , którego mogę użyć, gdy nie będę wiedzieć jaki rozmiar czcionki wybrać
  • atrybucie layout_weight, który może wystąpić w LinearLayout przy layout_width="0dp", a jego wartość określa jaką częścią całości jest dany element (sumuje się wartości tego atrybutu u wszystkich dzieci rodzica i proporcjonalnie rozdysponowuje się miejsce)
  • RelativeLayout - gdy robiłam kurs mniej podstawowy, ten layout był pominięty, zastąpiony ConstraintLayout, okazuje się, że są bardzo podobne a atrybutem typu android:layout_toLeftOf lub  android:layout_below można ustawiać elementy obok siebie

Tak więc:
  • da się sensownie podzielić ekran bez wartości procentowych Guideline w ConstraintLayout
  • to, co ma być wyświetlane na ekranie nie musi być od razu w całoścu widoczne - mogę użyć ScrollView i wewnątrz niego zaprojektować ciekawy układ elementów

Liczyłam na to, że dowiem się coś ciekawego o projektowaniu ekranów. Początkowo byłam sceptyczna, bo nie jestem aż tak początkująca, ale ogólnie warto było obejrzeć, ponieważ pojawiło się wiele przykładów i często omawiane było, dlaczego warto zastosować takie a nie inne podejście.

Kurs, o którym piszę znajduje się tutaj.

czwartek, 13 sierpnia 2020

Zmiana myślenia

Choć pozornie nie ma to nic wspólnego z programowaniem, od 4 tygodni realizuję program Droga Artysty. Bardzo polecam, to chyba najlepszy program rozwojowy, w jakim brałam udział. A możę pierwszy, za który wzięłam się na poważnie?

Tak czy inaczej - on oraz mój zespół Mastermind pomogli mi odkryć moją największą blokadę.

Ja NIE MOGĘ być programistą

Taka myśl, za każdym razem w mojej głowie. I nie chodzi o to, że nie będę dobrym programistą, czy idealnym, że nie w jakomś języku. Wcale. Nie mogę i już. Nie moja ścieżka, nie moje miejsce. NIE. Wstęp wzbroniony, możesz sobie siedzieć  IT, zajmować się czymkolwiek, ale tego nie wolno dotknąć. Jak Drzewo Poznania Dobra i Zła. A ja się słuchałam, nie moje, to nie. Czy kusiło? Nie wiem. Lubiłam inne rzeczy, lubiłam to, co robiłam.

Aż do środy, 3 tygodnie temu, kiedy uświadomiłam sobie, skąd to się wzięło i dlaczego to jest takie złe.

A zatem się z tego uwalniam, wróciłam do kursu, zaplanowałam kolejne. Wymyśliłam jak wykorzystam wiedzę w praktyce. 

Jest lepiej, serio. Jeśli Cię coś blokuje i nie masz z kim pogadać - napisz do mnie, zrozumiem Cię :)


Zapiszę sobie jeszcze co sobie przypomniałam powtarzając pierwszy moduł kursu (już to umiałam, tylko zapomniałam):

  • Używaj najprostrzego layoutu w kolejności:
    • Frame
    • Linear
    • Constrain
  • Ustawianie tekstu w TextView:
    • setText - wpisuje nową wartość
    • append - dodaje wartość do tego co już było

poniedziałek, 23 lipca 2018

Jak dodać odtwarzacz audio?

  1. Dodaj do pliku build.gradle -> dependencies
    compile 'com.google.android.exoplayer:exoplayer:r2.2.0'
  2. Dodaj do swojej aktywności
    implements View.OnClickListener, ExoPlayer.EventListener
  3. Dodaj do swojej aktywności obsługującej audio zmienne ExoPlayer
    private SimpleExoPlayer mExoPlayer;
    private SimpleExoPlayerView mPlayerView;
    private static MediaSessionCompat mMediaSession;
    private PlaybackStateCompat.Builder mStateBuilder;
    private NotificationManager mNotificationManager;
  4. Zainicjalizuj wstępnie zmienne
    mPlayerView = (SimpleExoPlayerView) findViewById(R.id.playerView);
    mPlayerView.setPlayer(mExoPlayer);
    initializeMediaSession();
    initializePlayer(Uri.parse(audioPath));

  5. Zaimplementuj inicjalizację MediaSession
     mMediaSession = new MediaSessionCompat(this, this.getClass().getSimpleName());
    mMediaSession.setFlags(
            MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
                    MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
    mMediaSession.setMediaButtonReceiver(null);
    mStateBuilder = new PlaybackStateCompat.Builder()
            .setActions(
                    PlaybackStateCompat.ACTION_PLAY |
                    PlaybackStateCompat.ACTION_PAUSE |
                    PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS |
                    PlaybackStateCompat.ACTION_PLAY_PAUSE);
    mMediaSession.setPlaybackState(mStateBuilder.build());
    mMediaSession.setCallback(new MySessionCallback());
    mMediaSession.setActive(true);
  6. Zaimplementuj podklasę MySessionCallback
            @Override
            public void onPlay() {
                mExoPlayer.setPlayWhenReady(true);
            }

            @Override
            public void onPause() {
                mExoPlayer.setPlayWhenReady(false);
            }

            @Override
            public void onSkipToPrevious() {
                mExoPlayer.seekTo(0);
            }
  7. Zaimplementuj inicjalizację playera
    if (mExoPlayer == null) {
        // Create an instance of the ExoPlayer.
        TrackSelector trackSelector = new DefaultTrackSelector();
        LoadControl loadControl = new DefaultLoadControl();
        mExoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
        mPlayerView.setPlayer(mExoPlayer);

        // Set the ExoPlayer.EventListener to this activity.
        mExoPlayer.addListener(this);
       
        // Prepare the MediaSource.
        String userAgent = Util.getUserAgent(this, "ClassicalMusicQuiz");
        MediaSource mediaSource = new ExtractorMediaSource(mediaUri, new DefaultDataSourceFactory(
                this, userAgent), new DefaultExtractorsFactory(), null, null);
        mExoPlayer.prepare(mediaSource);
        mExoPlayer.setPlayWhenReady(true);
    }
  8. Zaimplementuj funkcję zamykania playera
    mNotificationManager.cancelAll();
    mExoPlayer.stop();
    mExoPlayer.release();
    mExoPlayer = null;
  9. Dodaj funkcję zamykania playera do odDestroy()
        super.onDestroy();
        releasePlayer();
        mMediaSession.setActive(false);
  10. Zaimplementuj funkcję onPlayerStateChanged()
    if((playbackState == ExoPlayer.STATE_READY) && playWhenReady){
        mStateBuilder.setState(PlaybackStateCompat.STATE_PLAYING,
                mExoPlayer.getCurrentPosition(), 1f);
    } else if((playbackState == ExoPlayer.STATE_READY)){
        mStateBuilder.setState(PlaybackStateCompat.STATE_PAUSED,
                mExoPlayer.getCurrentPosition(), 1f);
    }
    mMediaSession.setPlaybackState(mStateBuilder.build());
    showNotification(mStateBuilder.build());
  11. Zaimplementuj MediaReceiver
    public static class MediaReceiver extends BroadcastReceiver {
        public MediaReceiver() {
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            MediaButtonReceiver.handleIntent(mMediaSession, intent);
        }
    }
  12. Dodaj do manifestu aktywność obsługującą odtwarzacz
    <activity android:name=".QuizActivity"
        android:launchMode="singleTop"/>
    <receiver android:name=".QuizActivity$MediaReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
  13. Przygotuj layout uwzględniający SimpleExoPlayerView
     <com.google.android.exoplayer2.ui.SimpleExoPlayerView
            android:id="@+id/playerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dp"
            android:layout_marginRight="0dp"
            android:layout_marginBottom="0dp"
            android:layout_marginLeft="0dp"/>

niedziela, 22 lipca 2018

Jak przechowywać dane - json

Jedną z możliwości przechowywania danych jest plik w formacie .json (JavaScript Object Notation).

Cechy w porównaniu z XML i JAML
  • dostęp do danych w formacie JSON jest bardziej naturalny z poziomu języka JavaScript niż dostęp do tych samych danych w formacie XML
  • nie jest już jednak tak naturalny dla Javy i wymaga stosowania specjalnych bibliotek
  • w nowszych wersjach standardów dopuszczana jest wymiana danych za pomocą JSON-a (np. w REST)
  • w praktyce zajmuje znacząco mniej miejsca niż analogiczny obiekt przesyłany za pomocą formatu XLM.
  • JSON jest łatwiejszy do analizowania składni niż jego nadzbiór YAML
Przykład (kurs android - udacity)

[

{

"name": "Toccata and Fugue in D minor",

"id": 0,

"uri": "asset:///toccata_fugue.mp3",

"composer": "Johann Sebastian Bach",

"albumArtID": "bach"

},

{

"name": "Fur Elise",

"id": 1,

"uri": "asset:///fur_elise.mp3",

"composer": "Ludwig van Beethoven",

"albumArtID": "beethoven"

}
]














Jak zastosować?

Stworzyć obiekt .java, który będzie odczytywał dane, np.:

private Sample(int sampleID, String composer, String title, String uri, String albumArtID) {
        mSampleID = sampleID;
        mComposer = composer;
        mTitle = title;
        mUri = uri;
        mAlbumArtID = albumArtID;
    }


piątek, 11 maja 2018

Czytać komentarze?

Komentarze dotyczące ocen aplikacji mogą być bardzo pomocne podczas tworzenia aplikacji.
Dzięki nim poznajemy różne oczekiwania klientów, możemy zobaczyć perspektywy, z jakich ludzie będą oceniać naszą aplikację.
Wiadomo, że nie uda nam się zadwolić każdego i że nie warto tego robić. Dzięki wiedzy na temat tego co może się podobać lub nie podobać użytkownikom:
  • zaprojektujemy UX dla wybranej grupy odbiorców, dobierzemy odpowiednie narzędzia przekazu
  • dopasujemy UI do tego co aktualnie najbardziej podoba się użytkownikom
  • opiszemy projekt tak, żeby instalowały go tylko zainteresowane osoby (unikniemy odinstalowania i zniechęcenia naszymi produktami)


Przejrzałam kilka aplikacji i ich komentarze - niestety bywało różnie. Część osób daje rzeczywiście wartościowy komentarz, ale często niestety spotykałam się z komentarzami bez sensu (w stylu "bla bla bla" lub "muj kot lubi ta aplikacje").

Bardzo wartościowe są opinie niezadowolonych użytkowników, zwłaszcza jeśli nie przeczytali czegoś dotyczącego działania aplikacji - bo dobra aplikacja nie potrzebuje instrukcji.

Chyba powinnam też zacząć komentować zainstalowane aplikacje.

sobota, 9 grudnia 2017

Co mogę i powinnam wiedzieć o moim użytkowniku?

Przy projektowaniu aplikacji warto dokładnie zastanowić się kim jest i jaki jest mój potencjalny użytkownik - można wtedy dopasować aplikację do jego stylu życia.
Następnie można się zastanowić czego o użytkowniku może dowiedzieć się aplikacja - jak to wykorzystać na jego korzyść, jednocześnie nie nadużywając jego prywatności i zapewniając bezpieczeństwo jego danym.
  • Co robi?
    • czy w danym moemencie używa telefonu
    • czy mogę mu w danym momencie wysyłać powiadomienia
    • czym zajmuje się zazwyczaj - jak się dopasować do jego dnia
  • Gdzie jest?
    •  gdzie przebywa obecnie
  • Co znajduje się niedaleko?
    • gdzie mieszka
    • gdzie często bywa
    • jakie miejsca lubi odwiedzać
  • Kim jest?
    • co robi
    • co lubi
    • czego potrzebuje
    • kim są jego znajomi