Android ViewPager之小圆点动态滑动

效果图

GIF.gif

第一步、布局

主界面布局,ViewPager+6个小圆点

MainActivity.xml

<android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="7.5"
        android:layout_marginTop="10dp"
        android:id="@+id/viewpage">

    </android.support.v4.view.ViewPager>
    <LinearLayout
        android:id="@+id/llt_page_indicator"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        android:visibility="visible"
        android:background="@color/white">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="5dp"
            android:src="@drawable/circle_main" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="5dp"
            android:src="@drawable/circle_main" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="5dp"
            android:src="@drawable/circle_main" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="5dp"
            android:src="@drawable/circle_main" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="5dp"
            android:src="@drawable/circle_main" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="5dp"
            android:src="@drawable/circle_main" />
    </LinearLayout>

这里的可以通过drawable设置颜色样式

激活样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp"/>
    <solid android:color="#dfdedf"/>
    <size android:height="10dp" android:width="10dp"/>
</shape>

未激活样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp"/>
    <solid android:color="#a7a4a5"/>
    <size android:height="10dp" android:width="10dp"/>
</shape>

第二步、ViewPager滑动展示的界面

view

<?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:background="@color/white"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <ImageView
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:src="@drawable/img_home_guide_chat"
        android:id="@+id/iv"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="蜜语聊天"
        android:textColor="#f15795"
        android:id="@+id/tv1"
        android:textSize="20dp"
        android:textStyle="bold"/>
    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="只有情侣彼此能看到"
        android:textColor="#696466"
        android:layout_marginTop="10dp"
        android:textSize="20dp"/>

</LinearLayout>

第三步、继承PagerAdapter重写必须用的4个用法

public class AdapterViewpager extends PagerAdapter {
    
    private List<View> views;

    public AdapterViewpager(List<View> mViewList) {
        this.views = mViewList;
    }

    @Override
    public int getCount() {//必须实现
        return views.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {//必须实现
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {//必须实现,实例化
       
        ViewGroup parent = (ViewGroup) views.get(position).getParent();
        if (parent != null)
            parent.removeAllViews();

        container.addView(views.get(position));
        return views.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {//必须实现,销毁
        container.removeView(views.get(position));
    }
}

补充:一些方法

其中,getCount和isViewFromObject是必须覆写的方法。isViewFromObject是用来判断pager的一个view是否和instantiateItem方法返回的object有关联,因为instantiateItem方法返回值不一定是view,可以是任意对象。
而当我们覆写instantiateItem方法时,如果直接写container.addView(views.get(position))的话会报
java.lang.IllegalStateException:
The specified child already has a parent. You must call removeView() ..."造成程序结束。
提示我们要添加的View已经绑定一个父类,由于一个子view不能与两个父类相关,所以必须得解绑。
因此必须在此之前添加判断,如果已经绑定了一个父类,必须先解绑再添加到ViewGroup里:

ViewGroup parent = (ViewGroup) views.get(position).getParent();  
if (parent != null)  
    parent.removeAllViews();  

第四步、初始化

MainActivity.java

//viewpager的设置
        vpager_one = (ViewPager) findViewById(R.id.viewpage);
        aList = new ArrayList<View>();

        //设置第一个点未激活状态
        lltPageIndicator = (LinearLayout) findViewById(R.id.llt_page_indicator);
        lltPageIndicator.getChildAt(0).setEnabled(false);

        //循环添加viewpager
        for (int i = 0; i < 6; i++) {
            aList.add(getGuidePage(i));
        }

        //实现方法类
        mAdapter = new AdapterViewpager(aList);
        //添加
        vpager_one.setAdapter(mAdapter);

        //滑动监听
        vpager_one.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            //滚动过程中实现
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }
            //滚动成功后实现
            @Override
            public void onPageSelected(int position) {
                clearIndicatorFocusedState();
                lltPageIndicator.getChildAt(position).setEnabled(false);
            }
            //滚动成功前,即手指按下屏幕时
            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

实现方法类

//滑动消除小圆圈
    private void clearIndicatorFocusedState() {
        // TODO 自动生成的方法存根  
        int childCount = lltPageIndicator.getChildCount();
        for (int i = 0; i < childCount; i++) {
            lltPageIndicator.getChildAt(i).setEnabled(true);

        }
    }

    private View getGuidePage(int i) {
        // TODO 自动生成的方法存根
        View v = View.inflate(this, R.layout.view_one, null);
        ImageView ivGuidePage = (ImageView) v.findViewById(R.id.iv);
        tv1 = v.findViewById(R.id.tv1);
        tv2 = v.findViewById(R.id.tv2);

        switch (i) {
            case 0:
                ivGuidePage.setImageResource(R.drawable.img_home_guide_chat);

                break;
            case 1:
                ivGuidePage.setImageResource(R.drawable.img_home_guide_add);
                tv1.setText("立即添加另一半");
                tv2.setText("开启你们的恩爱之旅");
                break;
            case 2:
                ivGuidePage.setImageResource(R.drawable.img_home_guide_alarm);
                tv1.setText("远程闹钟");
                tv2.setText("让 TA 一键叫你起床");
                break;
            case 3:
                ivGuidePage.setImageResource(R.drawable.img_home_guide_distance);
                tv1.setText("距离感应");
                tv2.setText("你我距离一键感应");
                break;
            case 4:
                ivGuidePage.setImageResource(R.drawable.img_home_guide_game);
                tv1.setText("情侣二人游戏");
                tv2.setText("一起养宠物,一起养宝宝");
                break;
            case 5:
                ivGuidePage.setImageResource(R.drawable.img_home_guide_notify);
                tv1.setText("智能提醒");
                tv2.setText("让你不在错过 TA 的生日");
                break;
        }

        return v;

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,563评论 25 707
  • Android Studio JNI流程首先在java代码声明本地方法 用到native关键字 本地方法不用去实现...
    MigrationUK阅读 11,765评论 7 123
  • 你见过小学没毕业的人在夜大当老师吗?我的二舅曾经在夜大讲授《机电设计》和《金属材料学》,讲台上侃侃而谈的老师,可他...
    mimi播报阅读 449评论 3 3
  • 2017-08-22 人人合伙 王坤(坤哥) 日更182篇 创始人首先考虑公司的业务规划,包括未来的商业模式、...
    坤哥讲股权阅读 411评论 0 2
  • 今天是三月十一号,阴天,没有下雨,却格外的冷,明天就要离开了,我知道有些话你亲口说不出来,其实说分开简单,是不想你...
    肆爱阅读 253评论 0 1