直接上代码,首先是布局文件:
<?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.support.v4.view.ViewPager android:id="@+id/vp_guide" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="60dp" android:padding="5dp" android:text="立即进入" android:visibility="invisible"/> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" > <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_blue_point" android:layout_width="10dp" android:layout_height="10dp" android:background="@mipmap/activity_point_h" /> </RelativeLayout> </RelativeLayout>
操作代码:
package com.company.augus.guidepointdemo; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private static final int[] mImageIds = new int[] { R.mipmap.activity_one,R.mipmap.activity_two, R.mipmap.activity_three}; private ViewPager vpGuide; private ArrayList<ImageView> mImageViewList; private LinearLayout llPointGroup;// 引导圆点的父控件 private int mPointWidth;// 圆点间的距离 private View viewBluePoint;// 蓝点 private Button btnStart;// 进入 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); vpGuide = (ViewPager) findViewById(R.id.vp_guide); llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group); viewBluePoint = findViewById(R.id.view_blue_point); btnStart = (Button) findViewById(R.id.btn_start); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"enter",Toast.LENGTH_SHORT).show(); } }); initViews(); vpGuide.setAdapter(new GuideAdapter()); vpGuide.setOnPageChangeListener(new GuidePageListener()); } /** * 初始化界面 */ private void initViews() { mImageViewList = new ArrayList<ImageView>(); // 初始化引导页的3个页面 for (int i = 0; i < mImageIds.length; i++) { ImageView image = new ImageView(this); image.setBackgroundResource(mImageIds[i]);// 设置引导页背景 mImageViewList.add(image); } // 初始化引导页的灰色圆点 for (int i = 0; i < mImageIds.length; i++) { View point = new View(this); point.setBackgroundResource(R.mipmap.activity_point_n);// 设置引导页默认圆点 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(18, 18); if (i > 0) { params.leftMargin = 10;// 设置圆点间隔 } point.setLayoutParams(params);// 设置圆点的大小 llPointGroup.addView(point);// 将圆点添加给线性布局 } // 获取视图树, 对layout结束事件进行监听 llPointGroup.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { // 当layout执行结束后回调此方法 @Override public void onGlobalLayout() { llPointGroup.getViewTreeObserver().removeGlobalOnLayoutListener(this); mPointWidth = llPointGroup.getChildAt(1).getLeft()-llPointGroup.getChildAt(0).getLeft(); System.out.println("圆点距离:" + mPointWidth); } }); } /** * ViewPager数据适配器 * */ class GuideAdapter extends PagerAdapter { @Override public int getCount() { return mImageIds.length; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(mImageViewList.get(position)); return mImageViewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } /** * viewpager的滑动监听 */ class GuidePageListener implements ViewPager.OnPageChangeListener { // 滑动事件 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // System.out.println("当前位置:" + position + ";百分比:" + positionOffset // + ";移动距离:" + positionOffsetPixels); int len = (int) (mPointWidth * positionOffset) + position * mPointWidth; RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewBluePoint.getLayoutParams();// 获取当前蓝点的布局参数 params.leftMargin = len;// 设置左边距 viewBluePoint.setLayoutParams(params);// 重新给蓝点设置布局参数 } // 某个页面被选中 @Override public void onPageSelected(int position) { if (position == mImageIds.length - 1) {// 最后一个页面 btnStart.setVisibility(View.VISIBLE);// 显示立即进入的按钮 } else { btnStart.setVisibility(View.INVISIBLE); } } // 滑动状态发生变化 @Override public void onPageScrollStateChanged(int state) { } } }