zoukankan      html  css  js  c++  java
  • Android开发实战之ViewPager实现向导界面

     当我们更新应用,或者第一次进入应用时都会有一个向导界面,介绍这个app的内容和使用方式。

    如果你细心你会发现其实这就是个viewpager,本篇博文将介绍应用的向导界面是如何制作的。希

    望本篇博文对你的学习和生活有所帮助。

    好了不多说,放上效果图:

    需要注意的是,下方的圆点跟随着viewpager滑动,当滑动到最后一张的时候,开始体验按钮出现了。

    viewpager的基础我就不多说了,如果你不是很明白,可以查看我的上一篇博客:http://www.cnblogs.com/lovelyYakir/p/5797153.html。

    我就重点介绍一下下方圆点更随着viewpager滑动是如何实现的。

    **第一次进入**

    关于是否是第一次进入,实现方式比较简单,用过使用SharedPreferences保存使用状态,将他封装到工具类中便于使用:

    
    
    public class SplashUtils {
    public static void setBoolean(Context context,String key, Boolean value) {
    SharedPreferences sharedPreferences=context.getSharedPreferences(Constants.CONFIGFILE,Context.MODE_PRIVATE);
    SharedPreferences.Editor editor=sharedPreferences.edit();
    editor.putBoolean(key,value);
    editor.commit();
    }
    public static Boolean getBoolean(Context context,String key,Boolean dfValue) {
    SharedPreferences sharedPreferences=context.getSharedPreferences(Constants.CONFIGFILE,Context.MODE_PRIVATE);
    return sharedPreferences.getBoolean(key,dfValue);
    }
    }
     

    需要注意的是,getBoolean方法最后一个参数无论是true,是false,都不会影响到我们的取值,所以可以写,也可以不写。

    **小圆点随ViewPager滑动**

    实现思路:当viewpager滑动的时候,红点随着滑动量而移动。需要监听viewpager的滑动。

    关于红点,如果你有UI,可以叫UI帮你画,如果没有UI,那就只能自己画了。

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <!--半径-->
        <corners android:radius="10dip"></corners>
        <!--颜色-->
        <solid android:color="#ff0000"></solid>
    
    </shape>

    下面是XML:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v4.view.ViewPager
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/vp_gide">
            
        </android.support.v4.view.ViewPager>
    <RelativeLayout
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="30dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:id="@+id/ll_guide_point">
        </LinearLayout>
        <View
            android:layout_width="20px"
            android:layout_height="20px"
            android:id="@+id/guide_point"
            android:background="@drawable/red_point"/>
    </RelativeLayout>
        <Button
            android:id="@+id/btn_guide"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="50dip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始体验"
            android:textColor="@color/btn_text_color"
            android:background="@drawable/btn_select"
            android:visibility="gone"/>
    </RelativeLayout>

    好了布局算是完成了,开始处理逻辑模块,首先我们需要知道这个红色圆点的宽和高,但是我们知道,绘制完成一般是在oncreated()之后完成的。那么,我们就需要对这个

    view进行监听,当它绘制完成之后,拿到具体信息。

          //监听界面绘制完成
            viewPoint.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    
                @Override
                public void onGlobalLayout() {
                    //取消注册界面而产生的回调接口
                    viewPoint.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    //计算点于点之间的距离
                    pointDistance = linearLayoutGuide.getChildAt(1).getLeft()-linearLayoutGuide.getChildAt(0).getLeft();
                    Log.e("this", String.valueOf(pointDistance));
                }
            });

    灰色的点在LinearLayout中绘制:

        //获取点
                View pointView=new View(getApplicationContext());
                pointView.setBackgroundResource(R.drawable.gray_point);
                //设置灰色点的显示大小
                float dip=20;
                float distance=20;
                LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(
                        Density.dipTopx(getApplicationContext(),dip),
                        Density.dipTopx(getApplicationContext(),dip));//单位是px,不是dp,为了做适配需要装换
                //设置点与点的距离,第一个点除外
                if (i!=0) {
                    params.leftMargin = Density.dipTopx(getApplicationContext(),distance);//px
                }
                pointView.setLayoutParams(params);
    
    
                linearLayoutGuide.addView(pointView);

    滑动事件监听滑动距离,点更随滑动。

     viewPagerGuide.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    
                /**
                 *页面滑动调用,拿到滑动距离设置视图的滑动状态
                 * @param position 当前页面位置
                 * @param positionOffset 移动的比例值
                 * @param positionOffsetPixels 便宜的像素
                 */
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                    //计算红点的左边距
                    float leftMargrain=pointDistance*(position+positionOffset);
                    //设置红点的左边距
                    RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) viewPoint.getLayoutParams();
                    //对folat类型进行四舍五入,
                    params.leftMargin=Math.round(leftMargrain);
                    //设置位置
                    viewPoint.setLayoutParams(params);
    
                }
    
                @Override
                public void onPageSelected(int position) {
                     if (position==imagList.size()-1) {
                         buttonGuide.setVisibility(View.VISIBLE);
                     }
                    else {
                         buttonGuide.setVisibility(View.GONE);
                     }
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
    
                }
            });

    好了,一个向导界面就完成了。代码我注释的都很详细,这一篇博文还是主要对viewpager滑动事件的处理,希望本篇博文对你的学习和生活有所帮助,如果有写的不对的地方

    希望你能在下方留言评论,互相交流,互相学习。

  • 相关阅读:
    ACM常用算法及练习(2)
    ACM常用算法及练习(1)
    ACM进阶计划
    《算法艺术与信息学竞赛》题目-提交方式对照表
    ACM之Java速成(4)
    ACM之Java速成(3)
    ACM之Java速成(2)
    ACM之Java速成(1)
    uva 11520
    uva 10755
  • 原文地址:https://www.cnblogs.com/lovelyYakir/p/5804604.html
Copyright © 2011-2022 走看看