美文网首页Android知识程序员Android开发
Android ViewPager之小圆点动态滑动

Android ViewPager之小圆点动态滑动

作者: 侯蛋蛋_ | 来源:发表于2017-11-06 10:20 被阅读0次

    效果图

    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;
    
        }
    

    相关文章

      网友评论

        本文标题:Android ViewPager之小圆点动态滑动

        本文链接:https://www.haomeiwen.com/subject/opmkmxtx.html