一个简单的引导页,由ViewPager和PagerAdapter组成,供大家参考,具体内容如下

package com.xspacing.viewpager;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
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;
/**
 * 
 * @ClassName MainActivity.java
 * @Description TODO 引导页
 * @author Smile
 * @version v1.0
 * @date 2016年9月26日 
 */
public class MainActivity extends Activity {

  protected static final String TAG = "MainActivity";
  ViewPager mViewPager;
  List<ImageView> list;
  private LinearLayout mLinearLayout;

  // 两个小灰点的距离
  private int poitWidth;
  private ImageView mViewPress;
  private ImageView mViewNotPress;
  private Button btnStart;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initViews();
    initDatas();
  }

  private void initViews() {
    mViewPager = (ViewPager) findViewById(R.id.main_view_pager);
    mLinearLayout = (LinearLayout) findViewById(R.id.main_point);
    mViewPress = (ImageView) findViewById(R.id.main_red_point_press);
    btnStart = (Button) findViewById(R.id.main_btn);
  }

  private void initDatas() {
    list = new ArrayList<ImageView>();
    final int imageId[] = { R.drawable.a, R.drawable.b, R.drawable.c };
    for (int i = 0; i < imageId.length; i  ) {
      ImageView imageView = new ImageView(this);
      imageView.setBackgroundResource(imageId[i]);
      list.add(imageView);
      mViewNotPress = new ImageView(this);
      mViewNotPress.setImageResource(R.drawable.shape_grey_point_not_press);
      LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
          LinearLayout.LayoutParams.WRAP_CONTENT);
      if (i != 0) {
        layoutParams.leftMargin = 20;
      }
      mLinearLayout.addView(mViewNotPress, layoutParams);

    }

    // 由于在执行onCreate()的时候,界面还没有被绘制完成,所有拿不到poitWidth,
    // 要拿到视图树,监听视图的绘制完成,才能拿到poitWidth
    mViewPress.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

      @Override
      public void onGlobalLayout() {
        poitWidth = mLinearLayout.getChildAt(1).getLeft() - mLinearLayout.getChildAt(0).getLeft();
        Log.i(TAG, poitWidth   "");
      }
    });
    mViewPager.setAdapter(new ViewPgerAdapter(this, list));

    mViewPager.addOnPageChangeListener(new OnPageChangeListener() {

      // 当前选中的是第几个界面
      @Override
      public void onPageSelected(int position) {
        if (position==imageId.length-1) {
          btnStart.setVisibility(View.VISIBLE);
        }
        else {
          btnStart.setVisibility(View.GONE);
        }
      }

      // 界面滑动的时候,会不断地回调这个方法
      // 第二个参数是当前页面滑过的百分比(0.0到1.0)
      @Override
      public void onPageScrolled(int position, float offset, int arg2) {
        Log.i(TAG, "arg1:"   offset);
        // 小红点当前滑动的距离
        int width = (int) (poitWidth * offset   position * poitWidth);
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mViewPress.getLayoutParams();
        layoutParams.leftMargin = width;
        mViewPress.setLayoutParams(layoutParams);
      }

      @Override
      public void onPageScrollStateChanged(int arg0) {

      }
    });
  }

}
package com.xspacing.viewpager;

import java.util.List;

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

public class ViewPgerAdapter extends PagerAdapter {

  Context mContext;
  List<ImageView> list;

  public ViewPgerAdapter(Context context, List<ImageView> list) {
    this.mContext = context;
    this.list = list;
  }

  // 页数
  @Override
  public int getCount() {
    return list.size();
  }

  // 复用页卡
  @Override
  public boolean isViewFromObject(View view, Object obj) {
    return view == obj;
  }

  // 销毁页卡
  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView(list.get(position));
  }

  // 生成页卡
  @Override
  public Object instantiateItem(ViewGroup container, int position) {
    View view = list.get(position);
    container.addView(view);
    return view;
  }

}

shape文件

<?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="#C3C3C3"/>

</shape>
<?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="#44FF0000"/>

</shape>
<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="com.xspacing.viewpager.MainActivity" >

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

  <RelativeLayout
    android:id="@ id/main_relative"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="50dp" >

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

    <ImageView
      android:id="@ id/main_red_point_press"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@drawable/shape_red_point_press" />
  </RelativeLayout>

  <Button
    android:id="@ id/main_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="30dp"
    android:visibility="gone"
    android:layout_above="@id/main_relative"
    android:layout_centerHorizontal="true"
    android:text="开始体验" />

</RelativeLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

ViewPager+PagerAdapter实现带指示器的引导页的更多相关文章

  1. swift UI专项训练43 Swift实现APP引导页

    第一次加载APP的时候通常会采用引导页来展示特色或者告知用户如何使用。数据源继承自PageViewControllerDataSource,需要实现下面这两个方法:现在我们新建一个文件PageViewController,它的类型是UIPageViewController,继承PageViewControllerDataSource。在viewDidLoad中增加以下代码:前两页显示forward按钮,最后一页隐藏forward按钮,显示“开始体验”按钮。IOS的SDK中有一个类NSUserDefault

  2. fir.im Weekly - 进击的 Swift

    最近Swift开源了,众开发者们欢呼雀跃。本期fir.imWeekly准备了一些关于Swift的“新鲜”干货分享,也包括一些优秀的GitHub源码、开发工具和技术文章等等。同时,苹果启用了新的官网:Swift.org,Swift的GitHub主页:https://github.com/apple/swiftSwift3API设计准则勤快的@星夜暮晨翻译了苹果Swift官方网站博客的一篇文章:Swift3APIDesignGuidelines,了解Swift3特性,希望对你有所帮助。如何在iOS中实现一个可

  3. android – 在listview中添加viewpager作为滚动标题

    我试图在列表标题中添加Viewpager(使用支持库4),但它没有显示任何内容.这是我的代码请帮忙.它将在列表标题中不作为项目,因此它不应该是一个问题.解决方法listadapter之后的listview页眉和页脚显示.如果你尝试setadapter,并且看不到viewpager.检查viewpager的宽度和高度.如果viewpager的宽度或高度值为0.在viewgroup中创建LienarL

  4. 从ViewPager Fragments中隐藏Android应用程序中的软键盘

    我有一个Android应用程序,其中包含一个包含2个片段的ViewPager.第一个片段包含EditText字段.当应用程序启动时,该字段立即获得焦点并启动软键盘.第二个片段仅包含一个列表.当我从片段1滑动到片段2时,我希望键盘能够消失.我尝试过的任何东西似乎都没有用.键盘不仅保持在视图中,还继续更新片段1的EditText字段.我想我要么使用不正确的代码来隐藏键盘或将其放在错误的位置.如果任何人都可以发布正确实现的示例,将不胜感激!

  5. android – Slider Menu片段中的可交换选项卡

    我已经通过引用thistutorial实现了导航抽屉,现在我想要做的是在片段内显示滑动标签.即当我点击导航抽屉中的一个项目时,让我们说第一个项目,它应显示该项目的滑动标签.如果item1是Events,当我点击它时,它应该显示滑动标签.但我面临以下问题:–>如何在片段内实现视图寻呼机?

  6. android – 如何在ViewPager中使用cursorLoader?

    解决方法我无法评论,所以我正在写一个答案..您有一个实现LoaderCallbacks的活动.加载数据时,您的活动会收到onLoadFinished回调.在此方法中,您有一个应该在ViewPager中显示的Cursor.要显示Cursor中的数据,请在适配器上调用swapCursor方法.因此,每次加载数据时都不要创建适配器.创建一次,然后只需调用swapCursor即可.此外,每次都找不到ViewPager–findViewById是一个繁重的操作,它应该在创建视图层次结构后执行.所以,你的onLoad

  7. android – FragmentPagerAdapter不会在方向更改时重新创建片段吗?

    可能是其他一些解决方案?这些碎片有什么问题?

  8. android – Horizo​​ntalScrollView还是Carrousel?

    我在SO上找到的最接近的例子是here.这正是我需要的,但我已经测试了给出的答案,但它对我不起作用……但问题中的图像正是我想要的.任何人都可以指导我这样做吗?编辑2:根据你给出的两个例子,你看过this和this吗?这就是你要找的东西吗?

  9. 选项卡图标和文本均使用android设计支持库

    解决方法你是什么意思未被选中.你能分享一下你想要达到的目标以及你现在所处的位置.我不推荐你的做法.它做了很多不需要的东西来解决你的问题.我建议使用TabLayout类中的图标和文本,只需设置图标和文本.或者,如果需要,甚至是自定义布局,但使用TabLayout中的text1和图标.这样做有什么问题吗?

  10. Android在FragmentPagerAdapter中的Fragment中设置TextView文本

    更新:那么做这样的事情?

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部