Xây dựng Intro Slider trong ứng dụng Android là một cách tuyệt vời để giới thiệu các tính năng nổi bật của ứng dụng. Trong bài viết này chúng ta sẽ cùng nhau xây dựng Intro Slider cho ứng dụng Android để giúp cho ứng dụng Android của bạn mang lại hiệu quả hơn đối với người dùng.
Nếu như việc thêm một màn hình tĩnh (Splash Screen) vào ứng dụng Android có vẻ trông khá nhàm chán thì tại sao bạn không thử thêm thanh trượt giới thiệu vào ứng dụng nơi mà người dùng có thể vuốt qua một vài trang trình bày trước khi vào ứng dụng.
Điểm qua một vài ứng dụng xây dựng Intro Slider cho ứng dụng Android chẳng hạn như Tra cứu trị trường, Zing MP3, My Viettel…
Bước 1: Bạn tạo một Activity mới như mình sẽ đặt tên là IntroActivity.java và đây sẽ là Activity khởi chạy đầu tiên khi mở ứng dụng, vậy bạn cũng cần mở tập tin AndroidManifest.xml và cấu hình lại như sau
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.teamvietdev.android.introslider"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".IntroActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"></activity> </application> </manifest>
Mở tập tin activity_intro.xml và sửa đổi mã như dưới đây để thêm thanh trượt, nút nhấn…
<?xml version="1.0" encoding="utf-8"?> <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" tools:context=".IntroActivity"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/layoutDots" android:layout_width="match_parent" android:layout_height="30dp" android:layout_alignParentBottom="true" android:layout_marginBottom="15dp" android:gravity="center" android:orientation="horizontal"/> <View android:layout_above="@id/layoutDots" android:layout_width="match_parent" android:layout_height="1dp" android:alpha=".5" android:background="@android:color/white" /> <Button android:id="@+id/btnSkip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_marginLeft="5dp" android:background="@null" android:text="Bỏ qua" android:textColor="@android:color/white" /> <Button android:id="@+id/btnNext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:background="@null" android:text="Tiếp tục" android:textColor="@android:color/white" /> </RelativeLayout>
Với mỗi trang giới thiệu chúng ta sẽ tạo một màn hình hiển thị riêng, như mình muốn tạo một thanh trượt bao gồm 3 màn hình giới thiệu vậy nên mình sẽ tạo 3 tập tin lần lượt layout_intro1.xml, layout_intro2.xml và layout_intro3.xml
Tập tin layout_intro1.xml như sau:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:orientation="vertical" android:background="#f64c73"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="130dp" android:layout_height="130dp" android:src="@drawable/icon_intro1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Chung tay bảo vệ môi trường" android:layout_marginTop="25dp" android:textColor="@android:color/white" android:textSize="20dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="18dp" android:paddingLeft="40dp" android:paddingRight="40dp" android:text="Bảo vệ môi trường là trách nhiệm của mỗi cá nhân..." android:textAlignment="center" android:textColor="@android:color/white" android:textSize="18dp" /> </LinearLayout> </LinearLayout>
Tập tin layout_intro2.xml như sau:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:orientation="vertical" android:background="#20d2bb"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="130dp" android:layout_height="130dp" android:src="@drawable/icon_intro2" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Những hành động thiết thực" android:layout_marginTop="25dp" android:textColor="@android:color/white" android:textSize="20dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="18dp" android:paddingLeft="40dp" android:paddingRight="40dp" android:text="Hãy bắt đầu bằng những hành động đơn giản..." android:textAlignment="center" android:textColor="@android:color/white" android:textSize="18dp" /> </LinearLayout> </LinearLayout>
Tập tin layout_intro3.xml như sau:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:orientation="vertical" android:background="#3395ff"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="130dp" android:layout_height="130dp" android:src="@drawable/icon_intro3" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cùng nhau bảo vệ môi trường" android:layout_marginTop="25dp" android:textColor="@android:color/white" android:textSize="20dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="18dp" android:paddingLeft="40dp" android:paddingRight="40dp" android:text="Cùng kêu gọi mọi người chung tay bảo vệ môi trường..." android:textAlignment="center" android:textColor="@android:color/white" android:textSize="18dp" /> </LinearLayout> </LinearLayout>
Giao diện hiển thị màn hình giới thiệu chúng ta vừa thiết kế lần lượt như sau:
Bước 2: Tạo một lớp có tên PrefManager.java nhằm mục đích khi ứng dụng khởi động chúng ta sẽ kiểm tra nếu ứng dụng được khởi chạy lần đầu tiên thì mới hiển thị màn hình giới thiệu, ngược lại thì sẽ mở màn hình chính.
package com.teamvietdev.android.introslider; import android.content.Context; import android.content.SharedPreferences; public class PrefManager { private SharedPreferences pref; private SharedPreferences.Editor editor; private Context context; private int PRIVATE_MODE = 0; private static final String PREF_NAME = "config"; private static final String IS_FIRST_TIME_LAUNCH = "isFirstTime"; 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); } }
Bước 3: Tiếp tục bạn mở tập tin IntroActivity.java và sửa đổi mã như dưới đây để thực hiện xây dựng Intro Slider cho ứng dụng Android.
package com.teamvietdev.android.introslider; 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 IntroActivity 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); setContentView(R.layout.activity_intro); if (Build.VERSION.SDK_INT >= 21) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } prefManager = new PrefManager(this); if (!prefManager.isFirstTimeLaunch()) { launchHomeScreen(); finish(); } viewPager = (ViewPager) findViewById(R.id.viewPager); dotsLayout = (LinearLayout) findViewById(R.id.layoutDots); btnSkip = (Button) findViewById(R.id.btnSkip); btnNext = (Button) findViewById(R.id.btnNext); layouts = new int[]{ R.layout.layout_intro1, R.layout.layout_intro2, R.layout.layout_intro3}; addBottomDots(0); 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) { int current = getItem(+1); if (current < layouts.length) { 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("•")); 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(IntroActivity.this, MainActivity.class)); finish(); } ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { addBottomDots(position); if (position == layouts.length - 1) { btnNext.setText("Hoàn tất"); btnSkip.setVisibility(View.GONE); } else { btnNext.setText("Tiếp tục"); btnSkip.setVisibility(View.VISIBLE); } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }; 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); } } 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); } } }
Bạn tạo tập tin array.xml trong thư mục res > value và thêm đoạn mã sau vào:
<?xml version="1.0" encoding="utf-8"?> <resources> <array name="array_dot_active"> <item>#d1395c</item> <item>#14a895</item> <item>#2278d4</item> </array> <array name="array_dot_inactive"> <item>#f98da5</item> <item>#8cf9eb</item> <item>#93c6fd</item> </array> </resources>
Cuối cùng hãy chạy trương trình trên để kiểm tra xem kết quả thực hiện như thế nào.
Lời kết: Như vậy việc xây dựng Intro Slider cho ứng dụng Android tuy đơn giản nhưng giúp cho ứng dụng Android của bạn mang lại hiệu quả lớn tới người dùng. Ngoài ra bạn có thể xem thêm nhiều bài viết khác trong chủ đề lập trình Android tại Team Việt Dev.
(Tác giả: Team Việt Dev)