Android動態(tài)給ViewPager添加Indicator導(dǎo)航
先看下效果
小圓點(diǎn)的形狀和顏色都是可以自己定義的,看需求
首先第一步,滑2個圓點(diǎn),一個是選中后的圓點(diǎn),一個是未選中的圓點(diǎn),看選中的圓點(diǎn)shape
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="@color/colorPrimary"/> </shape>
未選中的
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="@color/colorAccent"/> </shape>
是不是很簡單,就指定一個圓形,一個顏色
接下來就是定義一個selector,用來控制選中和非選中
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/indicator_checked_shape" android:state_enabled="true"/> <item android:drawable="@drawable/indicator_unchecked_shape" android:state_enabled="false"/> </selector>
然后就是mainActivity的布局文件,放置一個ViewPager,下面放置一個LinearLayout,用來裝小圓點(diǎ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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.duanlian.viewpagerindicatordemo.MainActivity"> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="170dp" /> <LinearLayout android:id="@+id/linear" android:layout_width="match_parent" android:layout_height="40dp" android:layout_below="@+id/viewpager" android:layout_marginTop="-40dp" android:gravity="center" android:orientation="horizontal"></LinearLayout> </RelativeLayout>
接下來就是MainActivity的代碼,其實(shí)很簡單,都有注釋,就不細(xì)說了
package com.duanlian.viewpagerindicatordemo; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import android.widget.LinearLayout; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ViewPager mViewPager; private LinearLayout mLinear; private List<ImageView> mList; private PagerAdapter mPagerAdapter; private int[] imageArray = {R.mipmap.banner1, R.mipmap.banner2, R.mipmap.banner3, R.mipmap.ic_launcher}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initPoint(); } private void initView() { mViewPager = (ViewPager) findViewById(R.id.viewpager); mLinear = (LinearLayout) findViewById(R.id.linear); //給ViewPager添加圖片顯示 mList = new ArrayList<>(); for (int i = 0; i < imageArray.length; i++) { ImageView imageView = new ImageView(this); imageView.setImageResource(imageArray[i]); mList.add(imageView); } mPagerAdapter = new PagerAdapter(mList); mViewPager.setAdapter(mPagerAdapter); //ViewPager切換的監(jiān)聽事件 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { position = position % mList.size();// 需要對position的值進(jìn)行重新賦值,否則會造成數(shù)組越界 // 更新小圓點(diǎn)的顯示 for (int i = 0; i < mList.size(); i++) { ImageView iv = (ImageView) mLinear.getChildAt(i); // 當(dāng)前滑到的是那一頁就讓第幾個小圓點(diǎn)處于選中狀態(tài) if (position == i) { iv.setEnabled(true); } else { iv.setEnabled(false); } } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); } /** * 初始化指示器 */ private void initPoint() { for (int i = 0; i < mList.size(); i++) { // 往llContainer添加一個小圓點(diǎn) ImageView iv = new ImageView(this); //設(shè)置背景 iv.setImageResource(R.drawable.indicator_viewpager_selector); //設(shè)置原點(diǎn)大小 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(30, 30); //如果是切好的圖片就直接自適應(yīng) // LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); iv.setLayoutParams(params); // 默認(rèn)第0個小圓點(diǎn)顯示紅色 if (i == 0) { iv.setEnabled(true); } else { iv.setEnabled(false); } //設(shè)置原點(diǎn)之間的間距 iv.setPadding(5, 5, 5, 5); //添加到LinearLayout中 mLinear.addView(iv); } } }
最后附上ViewPager的adapter
package com.duanlian.viewpagerindicatordemo; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.util.List; /** * viewPager的adapter */ public class PagerAdapter extends android.support.v4.view.PagerAdapter{ private List<ImageView> list; public PagerAdapter(List<ImageView> list) { this.list = list; } @Override public int getCount() { return list.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(list.get(position));//添加頁卡 return list.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(list.get(position));//刪除頁卡 } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android使用ViewPager實(shí)現(xiàn)導(dǎo)航
- Android中TabLayout+ViewPager 簡單實(shí)現(xiàn)app底部Tab導(dǎo)航欄
- Android自定義ViewPagerIndicator實(shí)現(xiàn)炫酷導(dǎo)航欄指示器(ViewPager+Fragment)
- Android 利用ViewPager+GridView實(shí)現(xiàn)首頁導(dǎo)航欄布局分頁效果
- Android 中 TabHost與ViewPager結(jié)合實(shí)現(xiàn)首頁導(dǎo)航效果
- ViewPager頂部導(dǎo)航欄聯(lián)動效果(標(biāo)題欄條目多)
- Android 開發(fā)之BottomBar+ViewPager+Fragment實(shí)現(xiàn)炫酷的底部導(dǎo)航效果
- Android ViewPager制作新手導(dǎo)航頁(動態(tài)加載)
- Android ViewPager導(dǎo)航小圓點(diǎn)實(shí)現(xiàn)無限循環(huán)效果
相關(guān)文章
詳解Android使用OKHttp3實(shí)現(xiàn)下載(斷點(diǎn)續(xù)傳、顯示進(jìn)度)
本篇文章主要介紹了詳解Android使用OKHttp3實(shí)現(xiàn)下載(斷點(diǎn)續(xù)傳、顯示進(jìn)度),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Android 再按一次退出程序的實(shí)現(xiàn)方法
抽空研究了一下"再按一次退出程序"的實(shí)現(xiàn)方式,直接上代碼(請自動忽略無關(guān)代碼)2014-01-01Android端內(nèi)數(shù)據(jù)狀態(tài)同步方案VM-Mapping詳解
這篇文章主要介紹了Android端內(nèi)數(shù)據(jù)狀態(tài)同步方案VM-Mapping詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Android實(shí)現(xiàn)開機(jī)自動啟動Service或app的方法
這篇文章主要介紹了Android實(shí)現(xiàn)開機(jī)自動啟動Service或app的方法,結(jié)合實(shí)例形式分析了Android開機(jī)自啟動程序的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07Android 7.0以上版本實(shí)現(xiàn)應(yīng)用內(nèi)語言切換的方法
本篇文章主要介紹了Android 7.0以上版本實(shí)現(xiàn)應(yīng)用內(nèi)語言切換的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02詳解android在mob平臺實(shí)現(xiàn)qq登陸和分享
這篇文章主要介紹了詳解android在mob平臺實(shí)現(xiàn)qq登陸和分享,對接入第三方平臺SDK感興趣的同學(xué)們,可以參考下2021-04-04Android使用OKHttp包處理HTTP相關(guān)操作的基本用法講解
這篇文章主要介紹了Android使用OKHttp包處理HTTP相關(guān)操作的基本用法講解,包括操作如何利用OKHttp操作HTTP請求與處理緩存等內(nèi)容,需要的朋友可以參考下2016-07-07android視頻截屏&手機(jī)錄屏實(shí)現(xiàn)代碼
本篇文章主要介紹了android視頻截屏&手機(jī)錄屏實(shí)現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-07-07Android實(shí)現(xiàn)沉浸式導(dǎo)航欄實(shí)例代碼
通過本文給大家分享android實(shí)現(xiàn)沉浸式導(dǎo)航欄實(shí)例代碼,代碼非常實(shí)用,需要的朋友可以參考下2016-05-05