Sunday, October 8, 2017

Cara Membuat Intro Slider App dengan Android Studio

Cara Membuat Intro Silder App dengan Android Studio
Intro Silder
Berikut ini saya akan membagikan sebuah tutorial Cara Membuat Intro Silder App dengan Android Studio. Apasih Intro Slider itu? Intro Slider adalah menu awal yang muncul saat membuka aplikasi berupa slide yang pada umumnya berisi gambar dan teks. Seperti Splash Screen, namun Intro Slider memiliki slide yang berisi penjelasan dari aplikasi tersebut. Kalian bisa menekan tombol skip/lewati atau next/lanjut dan bisa juga digeser untuk menuju halaman utama aplikasi.

Untuk lebih jelasnya saya akan mendemonstrasikannya, saya buatkan sample aplikasi yang berisi beberapa Intro Slider dengan tombol skip & next dan kalian juga dapat menggesernya. Saya asumsikan kalian sudah paham dalam membuat project baru dengan Android Studio. Langsung saja kita buat! Ikuti langkah-langkah dibawah ini:
  • Pertama kalian buat project baru di Android Studio dari File ⇒ New Project. Lalu kalian pilih Empty Activity dan klik lanjut.
  • Download terlebih dahulu drawable untuk icon Intro Slider DISINI. File itu berisi beberapa gambar menarik yang diperlukan untuk project ini. Tempatkan file tersebut ke dalam folder drawable.
  • Masukkan beberapa kode warna pada res/values/colors.xml. Berikut adalah palet warna yang sudah saya berikan untuk mendesain layar Intro Slider. Untuk setiap layar kita membutuhkan tiga warna yaitu warna latar belakang dan dua warna titik saat aktif / tidak aktif.


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <!-- Screens background color-->
    <color name="bg_screen1">#f64c73</color>
    <color name="bg_screen2">#20d2bb</color>
    <color name="bg_screen3">#3395ff</color>
    <color name="bg_screen4">#c873f4</color>
    <!-- dots inactive colors -->
    <color name="dot_dark_screen1">#d1395c</color>
    <color name="dot_dark_screen2">#14a895</color>
    <color name="dot_dark_screen3">#2278d4</color>
    <color name="dot_dark_screen4">#a854d4</color>
    <!-- dots active colors -->
    <color name="dot_light_screen1">#f98da5</color>
    <color name="dot_light_screen2">#8cf9eb</color>
    <color name="dot_light_screen3">#93c6fd</color>
    <color name="dot_light_screen4">#e4b5fc</color>
    <array name="array_dot_active">
        <item>@color/dot_light_screen1</item>
        <item>@color/dot_light_screen2</item>
        <item>@color/dot_light_screen3</item>
        <item>@color/dot_light_screen4</item>
    </array>
    <array name="array_dot_inactive">
        <item>@color/dot_dark_screen1</item>
        <item>@color/dot_dark_screen2</item>
        <item>@color/dot_dark_screen3</item>
        <item>@color/dot_dark_screen4</item>
    </array>
</resources>
  • Kemudian kalian tambahkan teks berikut pada strings.xml.


<resources>
    <string name="app_name">Intro Slider</string>
    <string name="title_activity_welcome">Home Screen</string>
    <string name="next">NEXT</string>
    <string name="skip">SKIP</string>
    <string name="start">GOT IT</string>
 
    <string name="slide_1_title">Hello Food!</string>
    <string name="slide_1_desc">The easiest way to order food from your favourite restaurant!</string>
 
    <string name="slide_2_title">Movie Tickets</string>
    <string name="slide_2_desc">Book movie tickets for your family and friends!</string>
 
    <string name="slide_3_title">Great Discounts</string>
    <string name="slide_3_desc">Best discounts on every single service we offer!</string>
 
    <string name="slide_4_title">World Travel</string>
    <string name="slide_4_desc">Book tickets of any transportation and travel the world!</string>
 
    <string name="play_again_desc">To see the welcome slider again, goto Settings -> apps -> welcome slider -> clear data</string>
    <string name="play_again">Play Again</string>
</resources>
  • Lalu kalian tambahkan juga teks ini ke dalam dimens.xml.


<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
    <dimen name="fab_margin">16dp</dimen>
    <dimen name="dots_height">30dp</dimen>
    <dimen name="dots_margin_bottom">20dp</dimen>
    <dimen name="img_width_height">120dp</dimen>
    <dimen name="slide_title">30dp</dimen>
    <dimen name="slide_desc">16dp</dimen>
    <dimen name="desc_padding">40dp</dimen>
</resources>
  • Terakhir di folder yang sama, kalian tambahkan juga teks ini ke styles.xml.


<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
    <dimen name="fab_margin">16dp</dimen>
    <dimen name="dots_height">30dp</dimen>
    <dimen name="dots_margin_bottom">20dp</dimen>
    <dimen name="img_width_height">120dp</dimen>
    <dimen name="slide_title">30dp</dimen>
    <dimen name="slide_desc">16dp</dimen>
    <dimen name="desc_padding">40dp</dimen>
</resources>
  • Setelah semua yang ada di folder values kita edit, sekarang kita buat class dengan nama PrefManager.java.


package id.azhar.introslider;
 
import android.content.Context;
import android.content.SharedPreferences;
 
/**
 * Created by Azhar Rivaldi on 07/10/2017.
 */
 
public class PrefManager {
    SharedPreferences pref;
    SharedPreferences.Editor editor;
    Context _context;
 
    // shared pref mode
    int PRIVATE_MODE = 0;
 
    // Shared preferences file name
    private static final String PREF_NAME = "tajwid-welcome";
 
    private static final String IS_FIRST_TIME_LAUNCH = "IsFirstTimeLaunch";
 
    public PrefManager(Context context) {
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }
 
    public void setFirstTimeLaunch(boolean isFirstTime) {
        editor.putBoolean(IS_FIRST_TIME_LAUNCH, isFirstTime);
        editor.commit();
    }
 
    public boolean isFirstTimeLaunch() {
        return pref.getBoolean(IS_FIRST_TIME_LAUNCH, true);
    }
 
}
  • Berikutnya kita akan membuat layout slide untuk tampilan saat aplikasi dibuka. Disini saya buat 4 layout dengan isi yang sama berupa gambar dan teks. Empat layout itu saya beri nama welcome_side1.xml, welcome_side2.xml, welcome_side3.xml dan welcome_side4.


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/bg_screen1">
 
    <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:gravity="center_horizontal"
       android:orientation="vertical">
 
        <ImageView
           android:layout_width="@dimen/img_width_height"
           android:layout_height="@dimen/img_width_height"
           android:src="@drawable/ic_food" />
 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/slide_1_title"
           android:textColor="@android:color/white"
           android:textSize="@dimen/slide_title"
           android:textStyle="bold" />
 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_marginTop="20dp"
           android:paddingLeft="@dimen/desc_padding"
           android:paddingRight="@dimen/desc_padding"
           android:text="@string/slide_1_desc"
           android:textAlignment="center"
           android:textColor="@android:color/white"
           android:textSize="@dimen/slide_desc" />
 
    </LinearLayout>
</RelativeLayout>



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/bg_screen2">
 
    <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:gravity="center_horizontal"
       android:orientation="vertical">
 
        <ImageView
           android:layout_width="@dimen/img_width_height"
           android:layout_height="@dimen/img_width_height"
           android:src="@drawable/ic_movie" />
 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/slide_2_title"
           android:textColor="@android:color/white"
           android:textSize="@dimen/slide_title"
           android:textStyle="bold" />
 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_marginTop="20dp"
           android:paddingLeft="@dimen/desc_padding"
           android:paddingRight="@dimen/desc_padding"
           android:text="@string/slide_2_desc"
           android:textAlignment="center"
           android:textColor="@android:color/white"
           android:textSize="@dimen/slide_desc" />
 
    </LinearLayout>
 
</RelativeLayout>



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/bg_screen3">
 
    <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:gravity="center_horizontal"
       android:orientation="vertical">
 
        <ImageView
           android:layout_width="@dimen/img_width_height"
           android:layout_height="@dimen/img_width_height"
           android:src="@drawable/ic_discount" />
 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/slide_3_title"
           android:textColor="@android:color/white"
           android:textSize="@dimen/slide_title"
           android:textStyle="bold" />
 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_marginTop="20dp"
           android:paddingLeft="@dimen/desc_padding"
           android:paddingRight="@dimen/desc_padding"
           android:text="@string/slide_3_desc"
           android:textAlignment="center"
           android:textColor="@android:color/white"
           android:textSize="@dimen/slide_desc" />
 
    </LinearLayout>
 
</RelativeLayout>



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/bg_screen4">
 
    <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:gravity="center_horizontal"
       android:orientation="vertical">
 
        <ImageView
           android:layout_width="@dimen/img_width_height"
           android:layout_height="@dimen/img_width_height"
           android:src="@drawable/ic_travel" />
 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/slide_4_title"
           android:textColor="@android:color/white"
           android:textSize="@dimen/slide_title"
           android:textStyle="bold" />
 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_marginTop="20dp"
           android:paddingLeft="@dimen/desc_padding"
           android:paddingRight="@dimen/desc_padding"
           android:text="@string/slide_4_desc"
           android:textAlignment="center"
           android:textColor="@android:color/white"
           android:textSize="@dimen/slide_desc" />
 
    </LinearLayout>
 
</RelativeLayout>

Jika sudah, sekarang kembali lagi membuat class dengan nama WelcomeActivity.java untuk menampilkan Intro Silder.


package id.azhar.introslider;
 
/**
 * Created by Azhar Rivaldi on 07/10/2017.
 */
 
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
 
public class WelcomeActivity extends AppCompatActivity {
 
    private ViewPager viewPager;
    private MyViewPagerAdapter myViewPagerAdapter;
    private LinearLayout dotsLayout;
    private TextView[] dots;
    private int[] layouts;
    private Button btnSkip, btnNext;
    private PrefManager prefManager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        // Checking for first time launch - before calling setContentView()
        prefManager = new PrefManager(this);
        if (!prefManager.isFirstTimeLaunch()) {
            launchHomeScreen();
            finish();
        }
 
        // Making notification bar transparent
        if (Build.VERSION.SDK_INT >= 21) {
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
 
        setContentView(R.layout.activity_welcome);
 
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        dotsLayout = (LinearLayout) findViewById(R.id.layoutDots);
        btnSkip = (Button) findViewById(R.id.btn_skip);
        btnNext = (Button) findViewById(R.id.btn_next);
 
 
        // layouts of all welcome sliders
        // add few more layouts if you want
        layouts = new int[]{
                R.layout.welcome_slide1,
                R.layout.welcome_slide2,
                R.layout.welcome_slide3,
                R.layout.welcome_slide4};
 
        // adding bottom dots
        addBottomDots(0);
 
        // making notification bar transparent
        changeStatusBarColor();
 
        myViewPagerAdapter = new MyViewPagerAdapter();
        viewPager.setAdapter(myViewPagerAdapter);
        viewPager.addOnPageChangeListener(viewPagerPageChangeListener);
 
        btnSkip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                launchHomeScreen();
            }
        });
 
        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // checking for last page
                // if last page home screen will be launched
                int current = getItem(+1);
                if (current < layouts.length) {
                    // move to next screen
                    viewPager.setCurrentItem(current);
                } else {
                    launchHomeScreen();
                }
            }
        });
    }
 
    private void addBottomDots(int currentPage) {
        dots = new TextView[layouts.length];
 
        int[] colorsActive = getResources().getIntArray(R.array.array_dot_active);
        int[] colorsInactive = getResources().getIntArray(R.array.array_dot_inactive);
 
        dotsLayout.removeAllViews();
        for (int i = 0; i < dots.length; i++) {
            dots[i] = new TextView(this);
            dots[i].setText(Html.fromHtml("&#8226;"));
            dots[i].setTextSize(35);
            dots[i].setTextColor(colorsInactive[currentPage]);
            dotsLayout.addView(dots[i]);
        }
 
        if (dots.length > 0)
            dots[currentPage].setTextColor(colorsActive[currentPage]);
    }
 
    private int getItem(int i) {
        return viewPager.getCurrentItem() + i;
    }
 
    private void launchHomeScreen() {
        prefManager.setFirstTimeLaunch(false);
        startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
        finish();
    }
 
    //  viewpager change listener
    ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {
 
        @Override
        public void onPageSelected(int position) {
            addBottomDots(position);
 
            // changing the next button text 'NEXT' / 'GOT IT'
            if (position == layouts.length - 1) {
                // last page. make button text to GOT IT
                btnNext.setText(getString(R.string.start));
                btnSkip.setVisibility(View.GONE);
            } else {
                // still pages are left
                btnNext.setText(getString(R.string.next));
                btnSkip.setVisibility(View.VISIBLE);
            }
        }
 
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
 
        }
 
        @Override
        public void onPageScrollStateChanged(int arg0) {
 
        }
    };
 
    /**
     * Making notification bar transparent
     */
    private void changeStatusBarColor() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        }
    }
 
    /**
     * View pager adapter
     */
    public class MyViewPagerAdapter extends PagerAdapter {
        private LayoutInflater layoutInflater;
 
        public MyViewPagerAdapter() {
        }
 
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
            View view = layoutInflater.inflate(layouts[position], container, false);
            container.addView(view);
 
            return view;
        }
 
        @Override
        public int getCount() {
            return layouts.length;
        }
 
        @Override
        public boolean isViewFromObject(View view, Object obj) {
            return view == obj;
        }
 
 
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            View view = (View) object;
            container.removeView(view);
        }
    }
}

Kemudian untuk layoutnya activity_welcome.xml.


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:showIn="@layout/activity_welcome">
 
 
    <android.support.v4.view.ViewPager
       android:id="@+id/view_pager"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />
 
    <LinearLayout
       android:id="@+id/layoutDots"
       android:layout_width="match_parent"
       android:layout_height="@dimen/dots_height"
       android:layout_alignParentBottom="true"
       android:layout_marginBottom="@dimen/dots_margin_bottom"
       android:gravity="center"
       android:orientation="horizontal"></LinearLayout>
 
    <View
       android:layout_width="match_parent"
       android:layout_height="1dp"
       android:alpha=".5"
       android:layout_above="@id/layoutDots"
       android:background="@android:color/white" />
 
    <Button
       android:id="@+id/btn_next"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_alignParentRight="true"
       android:background="@null"
       android:text="@string/next"
       android:textColor="@android:color/white" />
 
    <Button
       android:id="@+id/btn_skip"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_alignParentLeft="true"
       android:background="@null"
       android:text="@string/skip"
       android:textColor="@android:color/white" />
 

    </RelativeLayout>

Langkah terakhir kalian ubah AndroidManifest.xml menjadi seperti ini:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="info.androidhive.introslider">
 
    <application
       android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:supportsRtl="true"
       android:theme="@style/AppTheme">
        <activity android:name="info.androidhive.introslider.WelcomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
           android:name="info.androidhive.introslider.MainActivity"
           android:label="@string/title_activity_welcome"
           android:theme="@style/AppTheme.NoActionBar"></activity>
    </application>
 
</manifest>

Kalau semua tidak ada yang terlewat silahkan kalian Run dengan Emulator Android Studio atau menggunakan device yang kalian punya. Jika berhasil maka tampilannya akan seperti ini:
Cara Membuat Intro Slider App dengan Android Studio
Intro Slider App
Sebelum mencoba tutorial ini saya harapkan kalian sudah paham dan mengerti bagaimana cara menggunakan Android Studio. Ini hanya sample saja, jadi kalian bisa menerapkannya ke aplikasi lain yang kalian buat
Bagaimana menurut kalian? Cukup mudah? Atau Sulit? Jika kalian merasa kesulitan, silahkan berikan komentar kalian pada kolom yang disediakan. Tutorial ini saya ambil dari Androidhive.

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Cara Membuat Intro Slider App dengan Android Studio ini. Siapa tahu ada yang membutuhkan.

Gabung juga di Channel BBM Rivaldi 48. Ada banyak informasi penting lainnya yang tidak saya publikasikan website Rivaldi 48 ini. Join di Channelnya dengan kode PIN: C004C7E92. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada.

Terima Kasih...

19 comments

  1. mas thanks tuturialnya, klo mau digabungin sama web view gimnana caranya ya biar waktu klik skip atau got it ke buka url webnya

    ReplyDelete
    Replies
    1. kakak bikin activity yg berisi webview. jadi setelah intro selesai, arahin javanya ke activity webview

      Delete
  2. coding di main activity nya gak ada ya om gak bisa running punya saya

    ReplyDelete
  3. kalau eror di drawablenya gimana ya ?

    ReplyDelete
  4. itu string.xml nya ngga salah gan ? kok sama spt yg dimens.xml

    ReplyDelete
  5. prefmanager buat apa ya kak?

    ReplyDelete
    Replies
    1. buat nyimpen session. jadi setelah diteken tombol skip, intro slidernya gak kebuka lagi. langsung ke splash/menu utama

      Delete
  6. Mas kalau di androidx kok pada error ya padahal sebagian udah saya sesuaikan dengan versi androidx.

    ReplyDelete
    Replies
    1. migrate to androidX, jangan lupa XML juga diganti androidX gak cuma Java/Kotlinnya

      Delete
  7. bang supaya slidenya muncul disetiap buka aolikasi gimana ya?
    saya coba bikin webview pakai slide, jadi cuma muncul saat pertama instal aplikasi

    ReplyDelete

Silahkan tinggalkan komentar jika Anda punya saran, kritik, atau pertanyaan seputar topik pembahasan. Gunakan bahasa yang bijak dan santun. Terima Kasih.
EmoticonEmoticon