自定义Indicator控件设置XML属性介绍:

Android Viewpager Indicator是Android开发中最常用的控件之一,几乎所有的新闻类APP中都有使用,下面介绍其基本使用方法。

1. 首先一个indicator必须要与一个ViewPager关联在一起,所以它提供了一个setViewPager方法。
2 .它扩展了ViewPager.OnPageChangeListener接口,表示接管了ViewPager的Pager改变时的监听处理,这也是为什么为ViewPager设置OnPageChangeListener监听器时不能设置在ViewPager上而必须设置在indicator上的原因。

最终实现效果:

Java代码:

实现步骤:

首先我们创建一个集合,为了装ViewPager加载的图片控件,在定义一个Indicator的成员变量.

创建一个Handler设置为全局,通过Handler实现图片无限轮播,下面我会给大家详细的说明图片无限轮播的实现方法

 //创建一个集合装Viewpager加载的图片控件private List<View> mViews = new ArrayList<View>();private Indicator mIn;private Handler mHandler = new Handler();private ViewPager mViewPager;

然后在 onCreate()里实现:

  @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化viewpager的item数据,往集合里面放数据,方便ViewPager拿数据initData();//初始化控件ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);//初始化我的自定义控件mIn = (Indicator) findViewById(R.id.indicator);//设置ViewPager的监听器viewPager.setOnPageChangeListener(new MyPagerListner());//设置ViewPager适配器viewPager.setAdapter(new MyPagerAdapter());}

然后初始化ViewPager的 item数据,最后别忘记调用initData方法

    private void initData() {for (int x = 0; x < 4; x++) {//通过布局填充器,把一个布局XML文件转换为View对象View inflate = getLayoutInflater().inflate(R.layout.pager_item, null);//找到布局View里的ImageView控件对象ImageView imageview = (ImageView) inflate.findViewById(R.id.iv);//往ImageView控件里放图片imageview.setImageResource(R.mipmap.ic_launcher);//最后把布局View控件放到集合里mViews.add(inflate);}}

创建ViewPager适配器,重写4个方法,下面给大家介绍这4个方法的作用.

1:getCount()是设置ViewPager的item数量

2:isViewFromObject()固定的格式

3:destroyItem()防止内存溢出,溢出ImageView对象

4:instantiateItem()此方法类似于ListView中的getView,第一个参数是ViewPager的化身,第二个参数是item的位置

 class MyPagerAdapter extends PagerAdapter {@Overridepublic int getCount() {return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {position %= 4;//防止角标越界container.removeView(mViews.get(position));}@Overridepublic Object instantiateItem(ViewGroup container, int position) {position %= 4;//防止角标越界//从集合里拿对应位置的图片View view = mViews.get(position);//把ImageView的对象添加到Viewpagercontainer.addView(view);//返回View对象return view;}}

创建ViewPager的监听事件:

1:onPageScrolled()是滑动时调用

2:onPageScrollStateChanged()是选中时调用

3:onPageScrollStateChanged()是滑动状态改变时回调的方法

  class MyPagerListner implements ViewPager.OnPageChangeListener {/*** @param position             item位置* @param positionOffset       //偏移的百分比这个百分比永远接近于1* @param positionOffsetPixels //偏移量*/@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {Log.d("DS", "onPageScrolled回调");Log.i("ds", "position :" + position + "  positionOffset :" + positionOffset + "  positionOffsetPixels : " + positionOffsetPixels);//往自定义控件里放入item位置及偏移的百分比,是小点可以动态的跟着ViewPager滑动mIn.setoffest(position, positionOffset);}@Overridepublic void onPageSelected(int position) {Log.d("DS", "onPageScrolled    回调");}@Overridepublic void onPageScrollStateChanged(int state) {Log.d("DS", "onPageScrollStateChanged     回调    hhh");}}

在这里给大家呈现关于实现ViewPager图片自动轮播

 private void autoScroll() {mHandler.postDelayed(new Runnable() {@Overridepublic void run() {//获取当前的轮播的位置int currentItem = mViewPager.getCurrentItem();//从当前的图切换到另一张通过(currentItem + 1)就可以实现mViewPager.setCurrentItem(currentItem + 1);//通过mHandler请求延迟2秒mHandler.postDelayed(this, 2000);//调用触摸滑动事件方法onTouch();}}, 2000);}

关于实现触摸滑动的监听事件,它的作用是当你用手触摸ViewPager时它会监听你的手势,当你触碰到时就暂停轮播.

private void onTouch() {//通过mViewPager去设置触摸滑动的点击事件mViewPager.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_MOVE:mHandler.removeMessages(0);//移除回调函数和消息case MotionEvent.ACTION_DOWN:mHandler.removeCallbacksAndMessages(null);break;//当你触摸时停止自动滑动case MotionEvent.ACTION_UP:autoScroll();break;}return false;}});}}

Java布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.android.indicatorapp.MainActivity"><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="200dp"></android.support.v4.view.ViewPager><!--使用的自定义控件--><!--setNumber 我们自己设置的属性,决定空心圆的多少,一开始不要加上--><com.example.liuy.indicatorapp.Indicatorapp:setNumber="6"android:id="@+id/indicator"android:layout_width="200dp"android:layout_height="60dp"android:layout_alignBottom="@+id/viewpager"android:layout_centerHorizontal="true"/></RelativeLayout>

接下我们创建一个 Indicator这个类的实现以下步骤:

1.首先继承View,复写构造方法

public class Indicator extends View {//实心圆的画笔;private Paint mForePaint;//空心圆的画笔;private Paint mBgPaint;//规定圆的数量,默认是4个,如果有XML指定的数量,使用指定的private int mNumber = 4;//圆的半径,规定默认值为10,如果有XML指定的数量,使用指定的private int mRadius = 10;//定义圆(空心圆)的背景颜色,默认红色,如果有XML指定的数量,使用指定的private int mBgColor = Color.RED;//定义圆(实心圆)的背景颜色,默认蓝色,如果有XML指定的数量,使用指定的private int mkForeColor = Color.BLUE;

2.初始化画笔,该方法在Java代码添加控件时回调

   public Indicator(Context context, AttributeSet attrs) {super(context, attrs);//初始化画笔对象initPaint();//引用atts文件下,给自己定义控件设置属性,得到TypdeArray对象.//参数1:attrs固定    参数2:在values文件下XML里R.styleable.下写的name名字TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Indicator);//使用typedArray对象,把在自定义控件设置的属性和XML文件里的属性进行关联,才算完成//参数1:R.styleable.Indicator 你在attrs定义的名字   参数2:你要管理的成员变量名(最后=也是成员变量名)//注意你在XML文件里设置的类型属性获取时也要是对应的类型.(最后同步Gradle文件,否则在XML布局文件里依然没有办法引用)mNumber = typedArray.getInteger(R.styleable.Indicator_setNumber, mNumber);mRadius = typedArray.getInteger(R.styleable.Indicator_setRadius, mRadius);}

3.复写onMeasure,方法里调用 initPaint()方法

 @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);initPaint();}

4.将 mForePaint和 mBgPaint抽取成员变量

initPaint此代码是实现画圆:

 //初始化画笔对象private void initPaint() {//创建画笔的对象mForePaint = new Paint();//设置抗锯齿(如果不设置抗锯齿画出来的图会模糊)mForePaint.setAntiAlias(true);//设置画笔的样式,为实心mForePaint.setStyle(Paint.Style.FILL);//设置画笔的颜色mForePaint.setColor(mkForeColor);//设置画笔的宽度mForePaint.setStrokeWidth(2);//创建画笔的对象,用于画空心圆mBgPaint = new Paint();mBgPaint.setAntiAlias(true);mBgPaint.setStyle(Paint.Style.STROKE);mBgPaint.setColor(mBgColor);mBgPaint.setStrokeWidth(2);}

5.重写 onDraw方法.参数就是 canvas画板,直接使用,画两种类型的圆

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//画多个空心圆,为了使圆不重叠,所以对X轴坐标进行动态的修改for (int i = 0; i < mNumber; i++) {//canvas.drawCircle(230 + i * mRadius * 3, 20, mRadius, mBgPaint);}//画实心圆,为使实心圆能够进行X轴移动   参数1加上了偏移量canvas.drawCircle(230 + moffest, 20, mRadius, mForePaint);}

6.接受外界ViewPager的 Item位置,及偏移的百分比转换为偏移量:

 private float moffest;public void setoffest(int position, float positionOffset) {invalidate();//为了防止角标越界,取余数position %= mNumber;//给成员变量设置偏移量具体数据//因为从一个圆到另一个圆,要经过3个半径+偏移量*3个半径,也可以看出点的移动过程moffest = position * 3 * mRadius + positionOffset * 3 * mRadius;if (position == mNumber - 1) {moffest = position * 3 * mRadius;}//关键的一点,从新绘制自定义View的方法,十分常用.(不绘制看不成自定义控件的动态效果)invalidate();}
}

7.同步Gradle文件,否则在XML布局文件里依然没有办法引用

8.在values下创建一XML资源文件

9.在XML文件里,定义标头和属性

<?xml version="1.0" encoding="utf-8"?>
<resources><!--指定这些属性都是谁的的,注意这里添加完属性要在自己定义View类构造方法里应用--><!--注意:写完这个属性后,布局XML文件要想应用的话,必须要同步Gradle文件--><declare-styleable name="Indicator"><!--定义控件显示圆的数量  参数format是类型--><attr name="setNumber" format="integer"></attr><!--定义控件显示圆的半径  参数format是类型--><attr name="setRadius" format="integer"></attr></declare-styleable>
</resources>

使用Viewpager Indicator实现图片无限轮播相关推荐

  1. Android实现广告页图片无限轮播

    一.概述 对于一个联网的Android应用, 首页广告无限轮播基本已经成为标配了. 那么它是怎么实现的呢? 有几种实现方式呢? 二.无限轮播的实现 1.最常规的手段是用 ViewPager来实现 2. ...

  2. BannerLayoutSimple 支持图片无限轮播的 BannerLayout,支持自定义小圆点位置以及显示位置等等,反正支持的挺多的,源码也有注释

    BannerLayoutSimple 项目地址: 7449/BannerLayoutSimple 简介:支持图片无限轮播的 BannerLayout,支持自定义小圆点位置以及显示位置等等,反正支持的挺 ...

  3. iOS开发之ImageView复用实现图片无限轮播

    在上篇博客中iOS开发之多图片无缝滚动组件封装与使用给出了图片无限轮播的实现方案之一,下面在给出另一种解决方案.今天博客中要说的就是在ScrollView上贴两个ImageView, 把ImageVi ...

  4. iOS 两种不同的图片无限轮播

    代码地址如下: http://www.demodashi.com/demo/11608.html 前记 其实想写这个关于无限轮播的记录已经很久很久了,只是没什么时间,这只是一个借口,正如:时间就像海绵 ...

  5. iOS 自定义图片无限轮播控件

    一:简介 图片轮播功能在App中是一个非常常见的功能,即允许定时滚动,也允许拖拽滚动,也可以点击每张图片触发事件. 二:实现方式 图片轮播功能的实现方式有很多中, UIScrollView + N个U ...

  6. 安卓实现广告栏图片无限轮播播放效果

    //经常在安卓app中页面上方放置一个广告栏,用到的无限轮播代码: public class MainActivity extends Activity { // 广告控件 private MyPag ...

  7. android viewpager动态加载图片,Android使用ViewPager加载图片和轮播视频

    作为Android基础组件之一,大家对viewpager已经很熟悉了,网上也有很多使用viewpager来加载图片的案例.但是像微信那样点击图片,可以轮播显示图片和视频的例子却没找到.正巧项目中有需求 ...

  8. vue 实现无限轮播_vue图片无限轮播

    近期项目中出现了很多图片轮播的需求,趁此机会写了一个关于图片自动轮播,手动切换的小Demo,具体效果看下图: 屏幕快照 2018-10-25 上午9.47.30.png 具体实现代码如下: v-sho ...

  9. ViewPager两种方式实现无限轮播

    给自己的忠告:虽然轮子很好用,但是使用轮子的前提是:如果不去封装一些复杂的功能,自己会用最基本的方法写一个,不然再好的轮子那也是别人的,当自己项目遇到和轮子不一样的地方,那就只能束手无策或者改人家的源 ...

  10. XLisetView+ViewPager无限轮播+多条目加载

    导xlistview jar包 权限 //主布局 <?xml version="1.0" encoding="utf-8"?> <Linear ...

最新文章

  1. 哈佛结构和冯诺依曼结构区别。
  2. 架构之路--实战项目记录(二) 忘记数据库 开始抽象
  3. mysql5.6启动占用内存很大的解决方法
  4. python opencv SIFT,获取特征点的坐标位置
  5. Linux复习资料——MySQL-client-5.6.50-1.el7.x86_64与MySQL-server-5.6.50-1.el7.x86_64包安装MySQL全过程
  6. java中广告维护轮播图怎么做_Banner广告轮播图
  7. python mmap
  8. javascript 模仿 html5 placeholder
  9. sublime livereload插件
  10. Fiddler中文乱码设置
  11. 简单的JSON解析工具
  12. sap abap开发从入门到精通_云端的ABAP Restful服务开发
  13. winform下拉框模糊查询_WINFORM中的COMBOX模糊查询
  14. 战神服务器IP修改,战神引擎芒果数据库查询和修改玩家IP+账号+密码教程
  15. linux打开dwg文件怎么打开方式,dwg文件扩展名,dwg文件怎么打开?
  16. 伪彩色增强(基于MATLAB)
  17. netty系列之:HashedWheelTimer一种定时器的高效实现
  18. java excel 边框颜色_java(jxl) 改变excel表格背景及边框
  19. http server response 一览
  20. php后缀视频,PHP获取文件后缀名的方法有哪些?(图文+视频)

热门文章

  1. 湖南科技大学2018年C语言程序设计实验题——问题 J: 成绩统计
  2. 神威太湖之光计算机的知识点,神威太湖之光计算机系统.PDF
  3. 2022年安全员-A证考试试题及在线模拟考试
  4. 数据科学面试问答题库
  5. C-V2X仿真测试之虚拟场景设计
  6. 世界知名游戏公司简介(国内,欧美,日韩)
  7. FineCMS 5.0.10漏洞集合
  8. 依图科技CTO颜水成被曝离职,或转战东南亚独角兽Shopee
  9. 虚拟机安装(保姆级教程)
  10. c语言fflush,c语言中fflush(stdin)作用(转)