摘要:項目需要添加多張引導頁,所以在網上搜集了一些資料並整理好。
Step1
添加一個GuideActivity.
其實這個引導頁無非就是一個Activity,里面有一個ViewPager而已。多張圖片放進去,裝進ViewPager里面。
注意:這里Activity中千萬不要設置圖片資源,不然會報OOM異常。多張圖片會導致內存溢出。
==>源碼如下:
①GuideActivity的Kotlin源碼
class GuideActivity : AppCompatActivity(), ViewPager.OnPageChangeListener { private var vp: ViewPager? = null private var imageIdArray: IntArray? = null//圖片資源的數組 private var viewList: MutableList<View>? = null//圖片資源的集合 private var vg: ViewGroup? = null//放置圓點 //實例化原點View private var iv_point: ImageView? = null private var ivPointArray: Array<ImageView?>? = null //最后一頁的按鈕 private var ib_start: Button? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportRequestWindowFeature(Window.FEATURE_NO_TITLE) setContentView(R.layout.activity_guide) MainApplication.getInstance().addActivity(this) StatusBarUtils.setWindowStatusBarColor(this, R.color.headline) ib_start = findViewById(R.id.guide_ib_start) as Button ib_start!!.setOnClickListener { val intent:Intent=Intent(this@GuideActivity,NavigationMainActivity::class.java) intent.putExtra("openAPP",true) overridePendingTransition(R.anim.slide_right_in,R.anim.slide_left_out) startActivity(intent) finish() } //加載ViewPager initViewPager() //加載底部圓點 initPoint() } /** * 加載底部圓點 */ private fun initPoint() { //這里實例化LinearLayout vg = findViewById(R.id.guide_ll_point) as ViewGroup //根據ViewPager的item數量實例化數組 ivPointArray = arrayOfNulls(viewList!!.size) //循環新建底部圓點ImageView,將生成的ImageView保存到數組中 val size = viewList!!.size for (i in 0..size - 1) { iv_point = ImageView(this) iv_point!!.layoutParams = ViewGroup.LayoutParams(50, 50) iv_point!!.setPadding(20, 0, 20, 150)//left,top,right,bottom ivPointArray!![i] = iv_point!! //第一個頁面需要設置為選中狀態,這里采用兩張不同的圖片 if (i == 0) { iv_point!!.setBackgroundResource(R.mipmap.icon_point_pre) } else { iv_point!!.setBackgroundResource(R.mipmap.icon_point) } //將數組中的ImageView加入到ViewGroup vg!!.addView(ivPointArray!![i]) } } /** * 加載圖片ViewPager */ private fun initViewPager() { vp = findViewById(R.id.guide_vp) as ViewPager //實例化圖片資源 imageIdArray = intArrayOf(R.mipmap.intro_school, R.mipmap.intro_discovery_1, R.mipmap.intro_discovery_2 ,R.mipmap.intro_discovery_3,R.mipmap.intro_ask_1,R.mipmap.intro_ask_2,R.mipmap.intro_ask_3,R.mipmap.intro_mew_coin) viewList = ArrayList() //循環創建View並加入到集合中 val len = imageIdArray!!.size for (i in 0..len - 1) { //new ImageView並設置全屏和圖片資源 val imageView = ImageView(this) viewList!!.add(imageView) } //View集合初始化好后,設置Adapter vp!!.adapter = GuidePageAdapter(viewList) vp!!.offscreenPageLimit=9 //設置滑動監聽 vp!!.setOnPageChangeListener(this) } override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { } /** * 滑動后的監聽 * @param position */ override fun onPageSelected(position: Int) { //循環設置當前頁的標記圖 val length = imageIdArray!!.size for (i in 0..length - 1) { ivPointArray!![position]!!.setBackgroundResource(R.mipmap.icon_point_pre) if (position != i) { ivPointArray!![i]!!.setBackgroundResource(R.mipmap.icon_point) } } //判斷是否是最后一頁,若是則顯示按鈕 if (position == imageIdArray!!.size - 1) { ib_start!!.visibility = View.VISIBLE } else { ib_start!!.visibility = View.GONE } } override fun onPageScrollStateChanged(state: Int) { } }
②activity_guide布局代碼:
<?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="com.guangdamiao.www.mew_android_debug.navigation.GuideActivity"> <android.support.v4.view.ViewPager android:id="@+id/guide_vp" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> <LinearLayout android:id="@+id/guide_ll_point" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true" android:layout_marginBottom="150pt" android:gravity="center_horizontal"> </LinearLayout> <Button android:layout_width="500pt" android:layout_height="55pt" android:id="@+id/guide_ib_start" android:text="進入大學喵" android:textSize="30pt" android:layout_centerHorizontal="true" android:layout_above="@+id/guide_ll_point" android:background="@drawable/button_shape_apply" android:visibility="gone"/> </RelativeLayout>
Step2
第二步就是寫這個GuidePageAdapter了。
注意在instanticateItem(ViewGroup container,int position)中設置背景圖片,提高加載速度,解決OOM問題。
源碼如下:
public class GuidePageAdapter extends PagerAdapter { private List<View> viewList; private int[] mResIds=new int[]{ R.mipmap.intro_school, R.mipmap.intro_discovery_1, R.mipmap.intro_discovery_2, R.mipmap.intro_discovery_3, R.mipmap.intro_ask_1, R.mipmap.intro_ask_2, R.mipmap.intro_ask_3, R.mipmap.intro_mew_coin, }; public GuidePageAdapter(List<View> viewList) { this.viewList = viewList; } /** * @return 返回頁面的個數 */ @Override public int getCount() { if (viewList != null){ return viewList.size(); } return 0; } /** * 判斷對象是否生成界面 * @param view * @param object * @return */ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * 初始化position位置的界面 * @param container * @param position * @return */ @Override public Object instantiateItem(ViewGroup container, int position) { //在此設置背景圖片,提高加載速度,解決OOM問題 View view=viewList.get(position); int count=getCount(); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); view.setBackgroundResource(mResIds[position%count]); view.setLayoutParams(params); container.addView(viewList.get(position)); return viewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewList.get(position)); } }
Step3
第三步就是在啟動頁中設置跳轉引導頁了。
引導頁一般是第一次安裝APP后才會出現,這里可以寫一個sharePreferences文件記錄是不是第一次安裝。
最后利用intent跳轉到引導頁就可以了。