美文网首页
viewpager引导界面—红点移动

viewpager引导界面—红点移动

作者: Peakmain | 来源:发表于2018-10-12 13:55 被阅读0次
viewpager引导界面.gif

首先我们需要准备圆点图片

我这里就贴红色圆点的代码

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

布局

<?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=".MainActivity">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <Button
        android:id="@+id/btn_start_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="80dp"
        android:background="@drawable/btn_start_main_selector"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:text="开始体验"
        android:visibility="gone"
        android:textColor="@drawable/btn_start_main_textcolor_selector"
        android:textSize="20sp" />


    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="40dp">

        <LinearLayout
            android:id="@+id/ll_point_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" />

        <ImageView
            android:id="@+id/iv_red_point"
            android:background="@drawable/point_red"
            android:layout_width="10dp"
            android:layout_height="10dp" />
    </RelativeLayout>


</RelativeLayout>

代码较简单,我在代码中添加了注释,看代码即可

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private ViewPager viewpager;
    private Button btn_start_main;
    private LinearLayout ll_point_group;
    private ImageView iv_red_point;
    private ArrayList<ImageView> imageViews;
    /**
     * 两点的间距
     */
    private int leftmax;
    //圆点的大小
    private int pointwidth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        initView();
        //准备数据
        int[] data = new int[]{
                R.drawable.guide1,
                R.drawable.guide2,
                R.drawable.guide3
        };
        pointwidth = dip2px(10);
        imageViews = new ArrayList<>();
        for (int i = 0; i < data.length; i++) {
            ImageView imageView = new ImageView(this);
            //设置背景
            imageView.setBackgroundResource(data[i]);

            //添加到集合中
            imageViews.add(imageView);
            //创建点
            ImageView point = new ImageView(this);
            point.setBackgroundResource(R.drawable.point_normal);
            //每个点设置参数
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(pointwidth, pointwidth);
            if (i != 0) {
                //除了0之外所有的点向左移动10个像素点
                params.leftMargin = pointwidth;
            }
            point.setLayoutParams(params);
            //添加到点的线性布局中
            ll_point_group.addView(point);
        }
        //设置ViewPager的适配器
        viewpager.setAdapter(new MyPagerAdapter());
        iv_red_point.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                iv_red_point.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                leftmax = ll_point_group.getChildAt(1).getLeft() - ll_point_group.getChildAt(0).getLeft();
            }
        });

        //得到屏幕滑动的百分比
        viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            /**
             * 当页面回调了会回调这个方法
             * @param position 当前滑动页面的位置
             * @param positionOffset 页面滑动的百分比
             * @param positionOffsetPixels 滑动的像数
             */
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                //两点间滑动距离对应的坐标 = 原来的起始位置 +  两点间移动的距离
                int leftmargin = (int)(position * leftmax + (positionOffset * leftmax));
                //params.leftMargin = 两点间滑动距离对应的坐标
                RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) iv_red_point.getLayoutParams();
                params.leftMargin=leftmargin;
                iv_red_point.setLayoutParams(params);
            }
            /**
             * 当页面被选中的时候,回调这个方法
             * @param position 被选中页面的对应的位置
             */
            @Override
            public void onPageSelected(int position) {
                if(position==imageViews.size()-1){
                    //最后一个页面
                    btn_start_main.setVisibility(View.VISIBLE);
                }else{
                    //其他页面
                    btn_start_main.setVisibility(View.GONE);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private int dip2px(float dpVale) {
        final float scale = getResources().getDisplayMetrics().density;
        return (int) (dpVale * scale + 0.5f);
    }


    private void initView() {
        viewpager = (ViewPager) findViewById(R.id.viewpager);
        btn_start_main = (Button) findViewById(R.id.btn_start_main);
        ll_point_group = (LinearLayout) findViewById(R.id.ll_point_group);
        iv_red_point = (ImageView) findViewById(R.id.iv_red_point);
    }

    class MyPagerAdapter extends PagerAdapter {

        /**
         * 返回数据的总个数
         */
        @Override
        public int getCount() {
            return imageViews.size();
        }

        /**
         * 作用,getView
         * @param container ViewPager
         * @param position  要创业页面的位置
         * @return 返回和创建当前页面右关系的值
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            ImageView imageView = imageViews.get(position);
            //添加到容器中
            container.addView(imageView);
            return imageView;
        }

        /**
         * @param view   当前创建的视图
         * @param object 上面instantiateItem返回的结果值
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }


        /**
         * 销毁页面
         * @param container ViewPager
         * @param position  要销毁页面的位置
         * @param object    要销毁的页面
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
}

相关文章

网友评论

      本文标题:viewpager引导界面—红点移动

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