码迷,mamicode.com
首页 > 移动开发 > 详细

Android用户引导页实现,圆点实现动画效果

时间:2016-04-20 23:51:19      阅读:880      评论:0      收藏:0      [点我收藏+]

标签:

当前市面上比较流行的应用,用户引导页已经是一个必不可缺的功能点了,简单的介绍下应用的基础功能或者版本升级功能点介绍。

那么常用的用户引导页是如何实现的呢?这篇文章就说说我个人用到的,并且觉得使用不错的效果。

1、首先定义布局文件guide_layout.xml文件,主要使用ViewPager做页面显示,使用一个圆点布局显示圆点,圆点根据图片数目动态添加。

guide_layout.xml文件的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@mipmap/start_bg">
    
    <android.support.v4.view.ViewPager
        android:id="@+id/vp_guide" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <Button
        android:id="@+id/btn_skip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:text="@string/jump_to_begin"
        android:textSize="16sp"
        android:padding="10dp"
        android:background="@color/light_gray"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"/>
    
    <Button 
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        android:text="@string/begin_use"
        android:textSize="16sp"
        android:padding="10dp"
        android:background="@color/light_gray"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="60dp"/>
        
    <RelativeLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="30dp">
        
        <!-- 线性布局用来显示引导页的圆点,使用代码给布局中添加圆点 -->
        <LinearLayout 
            android:id="@+id/ll_point_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            
        </LinearLayout>
        
        <!-- 表示当前显示的引导页,覆盖在待选中的圆点之上 -->
        <View 
            android:id="@+id/view_guide_point"
            android:layout_width="12dp"
            android:layout_height="12dp"
            android:background="@drawable/shape_point_white"/>
        
    </RelativeLayout>
    
</RelativeLayout>

2、使用android中shape属性,定义圆点的背景资源。
shape_point_gray.xml的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <solid android:color="@android:color/white" />

</shape>
3、activity文件中,定义引导页加载的图片数组,根据数组的长度动态添加知识圆点。
GuideActivity的代码如下:
package com.study.tracy.activity;

      import android.content.Intent;
      import android.support.v4.view.ViewPager;
      import android.support.v4.view.ViewPager.OnPageChangeListener;
      import android.util.Log;
      import android.view.View;
      import android.view.View.OnClickListener;
      import android.view.ViewTreeObserver.OnGlobalLayoutListener;
      import android.widget.Button;
      import android.widget.ImageView;
      import android.widget.LinearLayout;
      import android.widget.LinearLayout.LayoutParams;
      import android.widget.RelativeLayout;

      import com.study.tracy.R;
      import com.study.tracy.adapter.GuideAdapter;
      import com.study.tracy.base.BaseActivity;
      import com.study.tracy.constants.FlagConstants;
      import com.study.tracy.utils.DensityUtils;
      import com.study.tracy.utils.SharedPrefUtils;

      import java.util.ArrayList;

public class GuideActivity extends BaseActivity {

   private ViewPager vpGuide;

   private LinearLayout llPointGroup;     //引导圆点的父控件

   private View guidePoint;   //选中的圆点

   private Button startBtn;   //开始体验按钮

   private Button skipBtn;    //跳过按钮

   // 引导页背景图片的id数组
   private static final int[] mImageIds = new int[] {R.mipmap.user_guide01,
         R.mipmap.user_guide02, R.mipmap.user_guide03 , R.mipmap.user_guide04, R.mipmap.user_guide05};
   private int mPointWidth = 0;// 圆点间的距离
   private ArrayList<ImageView> mImageViewList;

   private String from;

   @Override
   public void initViews() {
      this.setContentView(R.layout.guide_layout);
//    获取从哪里进来的入口
      from = getIntent().getStringExtra("from");

      vpGuide = (ViewPager) findViewById(R.id.vp_guide);
      llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group);
      guidePoint = findViewById(R.id.view_guide_point);
      startBtn = (Button) findViewById(R.id.btn_start);
      skipBtn = (Button) findViewById(R.id.btn_skip);
   }


   @Override
   public void initDatas() {
      BaseActivity.isOpenDistanceBack = false;
      mImageViewList = new ArrayList<ImageView>();

//    初始化引导页的三个页面
      ImageView imageView = null;
      for (int i = 0; i < mImageIds.length; i++) {
         imageView = new ImageView(this);
         imageView.setBackgroundResource(mImageIds[i]); // 设置引导页的背景图片
         mImageViewList.add(imageView);
      }

      for (int i = 0; i < mImageIds.length; i++) {
         Log.d("Point View", "第" + i + "个圆点");
         View point = new View(this);
//       设置引导页默认圆点背景
         point.setBackgroundResource(R.drawable.shape_point_gray);

         LayoutParams params = new LayoutParams(DensityUtils.dp2px(this, 12), DensityUtils.dp2px(this, 12));
         if(i > 0){
            params.leftMargin = DensityUtils.dp2px(this, 10); //从第二个圆点开始设置左间距
         }
         point.setLayoutParams(params);

         llPointGroup.addView(point); //将圆点添加到线性布局中
      }

      // 获取视图树, 对layout绘制结束事件进行监听
      llPointGroup.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {

               public void onGlobalLayout() {
                  Log.d("llPointLayout", "llPointLayout绘制结束!");
                  llPointGroup.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                  if(mPointWidth == 0){
                     mPointWidth = llPointGroup.getChildAt(1).getLeft()
                           - llPointGroup.getChildAt(0).getLeft();
                     Log.d("圆点需要移动的距离:", mPointWidth + "");
                  }
               }
            });

   }

   @Override
   public void initListeners() {
      vpGuide.setAdapter(new GuideAdapter(mImageViewList));
      vpGuide.setOnPageChangeListener(new GuidePageListener());
      startBtn.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            skipToActivity();
         }
      });

      skipBtn.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            skipToActivity();
         }
      });

   }

   private void skipToActivity() {
      // 更新引导页是否显示为true,下次进入就不显示
      SharedPrefUtils.getInstance().setBoolean(FlagConstants.USER_GUIDE, true);

      // 跳转到登录的Activity中
      Intent intent = null;
//    if("setting".equals(from)){
//       intent = new Intent(GuideActivity.this, SettingActivity.class);
//    }else {
      intent = new Intent(GuideActivity.this, LoginActivity.class);
//    }
      startActivity(intent);
      finish();
   }


   class GuidePageListener implements OnPageChangeListener {

      // 滑动状态发生变化
      public void onPageScrollStateChanged(int arg0) {}

      /**
       * position : 当前的位置
       * positionOffset :    位置移动的百分比
       * positionOffsetPixels:   位置移动的px像素点
       */
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
         int len = (int) (mPointWidth * positionOffset + position * mPointWidth);
         RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) guidePoint.getLayoutParams();
         params.leftMargin = len; //设置选中圆点在父控件中的左间距

         guidePoint.setLayoutParams(params);       //重新给选中圆点设置布局参数
      }

      public void onPageSelected(int position) {
         if(position == mImageIds.length - 1){
//          最后一个页面,设置开始体验按钮显示
            startBtn.setVisibility(View.VISIBLE);
         }else{
            startBtn.setVisibility(View.INVISIBLE);
         }
      }

   }

}
4、viewpager的适配器adapter,给每个pager页面添加对应位置的图片资源
package com.study.tracy.adapter;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.ArrayList;

public class GuideAdapter extends PagerAdapter {

   private ArrayList<ImageView> mImageViewList;
   
   public GuideAdapter(ArrayList<ImageView> mImageViewList) {
      this.mImageViewList = mImageViewList;
   }

   @Override
   public int getCount() {
      return mImageViewList.size();
   }

   @Override
   public boolean isViewFromObject(View view, Object object) {
      return view == object;
   }
   
   @Override
   public void destroyItem(ViewGroup container, int position, Object object) {
      container.removeView((View)object);
   }
   
   @Override
   public Object instantiateItem(ViewGroup container, int position) {
      container.addView(mImageViewList.get(position));
      return mImageViewList.get(position);
   }

}

Android用户引导页实现,圆点实现动画效果

标签:

原文地址:http://www.cnblogs.com/qu-xinyang/p/5414883.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!