Android之圆点导航的两个案例(ViewPager)
案例一效果:

布局文件:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jogger.demo.ViewPagerActivity"> <android.support.v4.view.ViewPager
android:id="@+id/vp_guide"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v4.view.ViewPager> <LinearLayout
android:id="@+id/ll_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="40dp"
android:gravity="center"
android:orientation="horizontal"></LinearLayout> </RelativeLayout> Activity:
public class ViewPagerActivity extends FragmentActivity {
private ViewPager vp_guide;
private List<ImageView> mImgList;//导航图集合
private LinearLayout ll_container;//小圆点容器
private int mCurrentIndex = 0;//当前小圆点的位置
private int[] imgArray = {R.drawable.guidance1, R.drawable.guidance2, R.drawable.guidance3, R
.drawable.guidance4};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager);
vp_guide = (ViewPager) findViewById(R.id.vp_guide);
ll_container = (LinearLayout) findViewById(R.id.ll_container);
mImgList = new ArrayList<>();
for (int i = 0; i < imgArray.length; i++) {
ImageView imageView = new ImageView(this);//获取4个圆点
imageView.setImageResource(imgArray[i]);
mImgList.add(imageView);
ImageView dot = new ImageView(this);
if (i == mCurrentIndex) {
dot.setImageResource(R.drawable.page_now);//设置当前页的圆点
} else {
dot.setImageResource(R.drawable.page);//其余页的圆点
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout
.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
if (i > 0) {
params.leftMargin = 10;//设置圆点边距
}
dot.setLayoutParams(params);
ll_container.addView(dot);//将圆点添加到容器中
}
vp_guide.setAdapter(new MyAdapter(mImgList));
//添加监听
vp_guide.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int
positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
//根据监听的页面改变当前页对应的小圆点
mCurrentIndex = position;
for (int i = 0; i < ll_container.getChildCount(); i++) {
ImageView imageView = (ImageView) ll_container.getChildAt(i);
if (i == position) {
imageView.setImageResource(R.drawable.page_now);
} else {
imageView.setImageResource(R.drawable.page);
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
public class MyAdapter extends PagerAdapter {
private List<ImageView> mViewList;
public MyAdapter(List<ImageView> viewList) {
mViewList = viewList;
}
@Override
public ImageView instantiateItem(ViewGroup container, int position) {
ImageView view = mViewList.get(position);
container.addView(view);
return view;
}
@Override
public int getCount() {
return mViewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
}
}
案例二效果:

布局文件:
<?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:id="@+id/activity_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jogger.demo.ViewPagerActivity"> <android.support.v4.view.ViewPager
android:id="@+id/vp_guide"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v4.view.ViewPager> <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_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
</LinearLayout> <ImageView
android:id="@+id/iv_dot_now"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/page_now"/>
</RelativeLayout> </RelativeLayout> Activity:
public class ViewPagerActivity extends FragmentActivity {
private ViewPager vp_guide;
private List<ImageView> mImgList;//导航图集合
private LinearLayout ll_container;//小圆点容器
private int mCurrentIndex = 0;//当前小圆点的位置
private int mDotDis;//小圆点的距离
private ImageView iv_dot_now;//当前圆点
private int[] imgArray = {R.drawable.guidance1, R.drawable.guidance2, R.drawable.guidance3, R
.drawable.guidance4};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager);
vp_guide = (ViewPager) findViewById(R.id.vp_guide);
ll_container = (LinearLayout) findViewById(R.id.ll_container);
iv_dot_now = (ImageView) findViewById(R.id.iv_dot_now);
mImgList = new ArrayList<>();
for (int i = 0; i < imgArray.length; i++) {
ImageView imageView = new ImageView(this);//获取4个圆点
imageView.setImageResource(imgArray[i]);
mImgList.add(imageView);
ImageView dot = new ImageView(this);
dot.setImageResource(R.drawable.page);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout
.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
if (i > 0) {
params.leftMargin = 10;//设置圆点边距
}
dot.setLayoutParams(params);
ll_container.addView(dot);//将圆点添加到容器中
}
vp_guide.setAdapter(new MyAdapter(mImgList));
//添加监听
vp_guide.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int
positionOffsetPixels) {
// 滚动过程中
// 红色小圆点的移动距离=移动百分比*两个圆点的间距
// 更新小红点距离
int dis = (int) (mDotDis * positionOffset) + position * mDotDis;//
// 因为移动完一个界面后,百分比会归0,所以要加上移动过的单位position*mPointDis
//获取小圆点的布局属性,更新左边距
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) iv_dot_now
.getLayoutParams();
params.leftMargin = dis;// 修改左边距
// 重新设置布局参数
iv_dot_now.setLayoutParams(params);
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
// 监听layout方法结束的事件,位置确定之后获取圆点间距
// 视图树
iv_dot_now.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver
.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//视图树移除监听
iv_dot_now.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//计算得到小圆点距离
mDotDis = ll_container.getChildAt(1).getLeft() - ll_container.getChildAt(0)
.getLeft();
}
});
}
public class MyAdapter extends PagerAdapter {
private List<ImageView> mViewList;
public MyAdapter(List<ImageView> viewList) {
mViewList = viewList;
}
@Override
public ImageView instantiateItem(ViewGroup container, int position) {
ImageView view = mViewList.get(position);
container.addView(view);
return view;
}
@Override
public int getCount() {
return mViewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
}
}
Android之圆点导航的两个案例(ViewPager)的更多相关文章
- Android应用底部导航栏(选项卡)实例
现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其 ...
- android MIPI屏 导航栏丢失
/**************************************************************************** * android MIPI屏 导航栏丢失 ...
- Android 修改底部导航栏navigationbar的颜色
Android 修改底部导航栏navigationbar的颜色 getWindow().setNavigationBarColor(Color.BLUE); //写法一 getWindow().set ...
- Android两种为ViewPager+Fragment添加Tab的方式
在Android开发中ViewPager的使用是非常广泛的,而它不仅仅能够实现简单的开始引导页,还可以结合Fragment并添加Tab作为选项卡或为显示大批量页面实现强大的顺畅滑动 下面介绍两种为Vi ...
- Android Project和app中两个build.gradle配置的区别
Android 开发也挺长时间了,从开始就使用的AndroidStudio开发,但是说下来其实自己对AS(AndroidStudio简称)还真的是不了解不深入.好吧,其实我只知道AS是一个相当强大的工 ...
- Android 博客导航
Android 博客导航 一. 基础知识 Android 常用知识点 Android 常见问题解决 Android 常用控件 控件常用属性 Material Design 常用控件 二.常用知识点 动 ...
- Android Studio的project中两个build.gradle配置的区别
一般创建一个android项目后回出现两个gradle: build.gradle(Project):用来配置整个工程的 build.gradle(app):一个是用来配置app的 对compile和 ...
- Android Studio 代码导航快捷键总结
Android Studio 代码导航快捷键总结 这篇文章主要介绍了Android Studio 代码导航快捷键的相关资料,需要的朋友可以参考下 简评:作为一位 Android 开发者,Andro ...
- Android自定义组件系列【10】——随ViewPager滑动的导航条
昨天在用到ViewPager实现滑动导航的时候发现微信的导航条效果是跟随ViewPager的滑动而动的,刚开始想了一下,感觉可以使用动画实现,但是这个滑动是随手指时时变化的,貌似不可行,后来再网上搜了 ...
随机推荐
- netty基础--基本收发
使用maven构建一个基本的netty收发应用,作为其他应用的基础.客户端使用packet sender工具. 1 添加netty依赖 1 maven netty依赖 <dependency ...
- Zepto源码分析-form模块
源码注释 // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT l ...
- shiro不重启动态加载权限
最近一朋友让我帮他做一个后台权限管理的项目.我就在我原来的项目加加改改但是还是不理想,查了不少资料也走了不了弯路...... shiro基本的配置我就不多说了这个很简单自己查查资料就完成----下面是 ...
- 基于TF-IDF的新闻标签提取
基于TF-IDF的新闻标签提取 1. 新闻标签 新闻标签是一条新闻的关键字,可以由编辑上传,或者通过机器提取.新闻标签的提取主要用于推荐系统中,所以,提取的准确性影响推荐系统的有效性.同时,对于将标签 ...
- iOS中动态注入JavaScript方法。动态给html标签添加事件
项目中有这样一种需求,给html5网页中图片添加点击事件,并且弹出弹出点击的对应的图片,并且可以保持图片到本地 应对这样的需求你可能会想到很多方法来实现. 1. 最简单的方法就是在html5中添加图片 ...
- QT调用百度语音REST API实现语音合成
QT调用百度语音REST API实现语音合成 1.首先点击点击链接http://yuyin.baidu.com/docs/tts 点击access_token,获取access_token,里面有详细 ...
- Ceph Object Gateway Admin api 获取用户列表问题
按照官方文档使用Admin Ops API 获取用户列表 GET /admin/user时 返回{code: 403, message: Forbidden}这里有两个问题:首先用户列表的请求为 如下 ...
- C++判断一个数字是否为质数
关于素数的算法是程序竞赛比较重要的数论知识,我们来看通常会使用的几个算法. 我们先来复习几个基本概念: 质数:对于大于1的自然数,若除了1和它本身,没有别的因数,则称这个数为质数,质数也叫素数.反之, ...
- 友盟分享到微信 监听不执行 监听只执行onStart,(onResult,onError,onCancel 不执行)
最近在做一个项目 有一个需求是要分享项目中的一个商品 这对于我来说简直是 so easy (项目是三个人一起写的) 正好看到之前有同事写完了 我就拿过来用吧 一顿复制粘贴 大功告成 这个是监 ...
- Windows下安装Python扩展模块提示Unable to find vcvarsall.bat的问题
本文内容 Unable to find vcvarsall.bat的问题描述 问题分析 总结 提示: 如果你只是想知道自己需要安装哪个版本的Visual Studio请直接查看本文最后一个小节的内容. ...