我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android实现自定义轮播图片控件示例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android实现自定义轮播图片控件示例

要完成一个轮播图片,首先想到的应该是使用ViewPager来实现。ViewPager已经有了滑动的功能,我们只要让它自己滚动。再加上下方的小圆点就行了。所以我们本次的自定义控件就是由ViewPager和LinearLayout叠加起来组成的。

直接先上效果图:

创建一个自定义的ViewPager

先上完整的代码


package com.kcode.autoscrollviewpager.view;
import android.content.Context;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import java.util.Timer;
import java.util.TimerTask;

public class AutoViewPager extends ViewPager {
  private static final String TAG = "AutoViewPager";
  private int currentItem;
  private Timer mTimer;
  private AutoTask mTask;
  private boolean isFirst = true;
  public AutoViewPager(Context context) {
    super(context);
  }
  public AutoViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  public void start(){
    if (mTimer == null) {
      mTimer = new Timer();
    }
    mTimer.schedule(new AutoTask(),3000,3000);
  }
  private Runnable runnable = new Runnable() {
    @Override
    public void run() {
      currentItem = getCurrentItem();
      if(currentItem == getAdapter().getCount() - 1){
        currentItem = 0 ;
      }else {
        currentItem++ ;
      }
      setCurrentItem(currentItem);
    }
  };
  private AutoHandler mHandler = new AutoHandler();
  public void updatePointView(int size) {
    if (getParent() instanceof AutoScrollViewPager){
      AutoScrollViewPager pager = (AutoScrollViewPager) getParent();
      pager.initPointView(size);
    }else {
      Log.e(TAG,"parent view not be AutoScrollViewPager");
    }
  }
  public void onPageSelected(int position) {
    AutoScrollViewPager pager = (AutoScrollViewPager) getParent();
    pager.updatePointView(position);
  }
  private class AutoTask extends TimerTask{
    @Override
    public void run() {
      mHandler.post(runnable);
    }
  }
  private final static class AutoHandler extends android.os.Handler{
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
    }
  }
  public void onStop(){
    //先取消定时器
    if (mTimer != null) {
      mTimer.cancel();
      mTimer = null;
    }
  }
  public void onDestroy(){
    onStop();
  }
  public void onResume(){
    start();
  }
  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()){
      case MotionEvent.ACTION_DOWN:
        Log.i(TAG,"down");
        onStop();
        break;
      case MotionEvent.ACTION_MOVE:
        Log.i(TAG,"move");
        break;
      case MotionEvent.ACTION_UP:
        Log.i(TAG,"up");
        onResume();
        break;
    }
    return super.onTouchEvent(ev);
  }
}

AutoViewPager 继承至ViewPager,我们通过Timer来启动一个定时器。


public void start(){
    if (mTimer == null) {
      mTimer = new Timer();
    }
    mTimer.schedule(new AutoTask(),3000,3000);
  }
  private Runnable runnable = new Runnable() {
    @Override
    public void run() {
      currentItem = getCurrentItem();
      if(currentItem == getAdapter().getCount() - 1){
        currentItem = 0 ;
      }else {
        currentItem++ ;
      }
      setCurrentItem(currentItem);
    }
  };

每隔三秒去更新一下页面。这样就能起到一个自己滚动的效果。

设置Adapter

要实现无限循环,只要把Adapter中的getCount()方法返回无限大,直接返回Integer.MAX_VALUE就可以了。

完整的Adapter代码:


package com.kcode.autoscrollviewpager.view;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.kcode.autoscrollviewpager.R;
import java.util.ArrayList;
import java.util.List;

public abstract class BaseViewPagerAdapter<T> extends PagerAdapter implements ViewPager.OnPageChangeListener{
  private List<T> data = new ArrayList<>();
  private Context mContext;
  private AutoViewPager mView;
  private OnAutoViewPagerItemClickListener listener;
  public BaseViewPagerAdapter(List<T> t) {
    this.data = t;
  }
  public BaseViewPagerAdapter(Context context, AutoViewPager viewPager) {
    this.mContext = context;
    mView = viewPager;
    mView.setAdapter(this);
    mView.addOnPageChangeListener(this);
    mView.setCurrentItem(0);
  }
  public BaseViewPagerAdapter(Context context, AutoViewPager viewPager,OnAutoViewPagerItemClickListener listener) {
    this.mContext = context;
    mView = viewPager;
    this.listener = listener;
    mView.setAdapter(this);
    mView.addOnPageChangeListener(this);
    mView.setCurrentItem(0);
  }
  public BaseViewPagerAdapter(Context context, List<T> data,AutoViewPager viewPager,OnAutoViewPagerItemClickListener listener) {
    this.mContext = context;
    mView = viewPager;
    this.data = data;
    this.listener = listener;
    mView.setAdapter(this);
    mView.addOnPageChangeListener(this);
    mView.setCurrentItem(0);
    mView.start();
    mView.updatePointView(getRealCount());
  }
  public void add(T t){
    data.add(t);
    notifyDataSetChanged();
    mView.updatePointView(getRealCount());
  }
  @Override
  public int getCount() {
    return data == null ? 0 : Integer.MAX_VALUE;
  }
  public int getRealCount(){
    return data == null ? 0 : data.size();
  }
  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((ImageView) object);
  }
  @Override
  public Object instantiateItem(ViewGroup container, final int position) {
    ImageView view = (ImageView) LayoutInflater.from(mContext)
        .inflate(R.layout.imageview,container,false);
    view.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        if (listener != null) {
          listener.onItemClick(position % getRealCount(),data.get(position % getRealCount()));
        }
      }
    });
    loadImage(view,position, data.get(position % getRealCount()));
    container.addView(view);
    return view;
  }
  public abstract void loadImage(ImageView view,int position,T t);
  @Override
  public boolean isViewFromObject(View view, Object object) {
    return view == object;
  }
  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  }
  @Override
  public void onPageSelected(int position) {
    mView.onPageSelected(position % getRealCount());
  }
  @Override
  public void onPageScrollStateChanged(int state) {
  }
  public interface OnAutoViewPagerItemClickListener<T> {
    void onItemClick(int position,T t);
  }
}

这里我们使用了泛型,因为有时候我们可能只传一个url集合进来,也可能是对象集合,方便拓展。加载图片的方法也是一个抽象方法


public abstract void loadImage(ImageView view,int position,T t);

因为每个App使用的图片加载框架都不一样,所以这里的加载就留个App自己实现。使用的时候创建Adapter只要继承这里的BaseViewPagerAdapter,然后重写loadImage(ImageView view,int position,T t)方法,在这里进行图片的加载就行了。

如果你需不要底部的小圆点标示的话,这里就已经完成了。使用的时候,直接使用


  <com.kcode.autoscrollviewpager.view.AutoViewPager
    android:layout_width="match_parent"
    android:layout_height="200dp">
  </com.kcode.autoscrollviewpager.view.AutoViewPager>

代替


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

就可以了。需要底部的小圆点标示的话,继续往下

添加小圆点标示

需要添加小圆点标示的话。其实就是在ViewPager上再加一层。我们新建一个View,继承至RelativeLayout

完整代码如下:


package com.kcode.autoscrollviewpager.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.kcode.autoscrollviewpager.R;
import static android.view.Gravity.CENTER;

public class AutoScrollViewPager extends RelativeLayout{
  private AutoViewPager mViewPager;
  private Context mContext;
  private LinearLayout layout;
  public AutoScrollViewPager(Context context) {
    super(context);
    init(context);
  }
  public AutoScrollViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
  }
  private void init(Context context){
    mContext = context;
    mViewPager = new AutoViewPager(context);
    layout = new LinearLayout(mContext);
    addView(mViewPager);
  }
  public AutoViewPager getViewPager() {
    return mViewPager;
  }
  public void initPointView(int size){
    layout = new LinearLayout(mContext);
    for (int i = 0; i < size; i++) {
      ImageView imageView = new ImageView(mContext);
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20,20);
      params.leftMargin = 8;
      params.gravity = CENTER;
      imageView.setLayoutParams(params);
      if (i == 0) {
        imageView.setBackgroundResource(R.drawable.point_checked);
      }else {
        imageView.setBackgroundResource(R.drawable.point_normal);
      }
      layout.addView(imageView);
    }
    LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.addRule(ALIGN_PARENT_BOTTOM);
    layoutParams.addRule(ALIGN_PARENT_RIGHT);
    layoutParams.setMargins(12,20,12,20);
    layout.setLayoutParams(layoutParams);
    addView(layout);
  }
  public void updatePointView(int position) {
    int size = layout.getChildCount();
    for (int i = 0; i < size; i++) {
      ImageView imageView = (ImageView) layout.getChildAt(i);
      if (i == position){
        imageView.setBackgroundResource(R.drawable.point_checked);
      }else {
        imageView.setBackgroundResource(R.drawable.point_normal);
      }
    }
  }
}

初始化的时候创建一个ViewPager,一个LinearLayout(用来放小圆点)


 public AutoScrollViewPager(Context context) {
    super(context);
    init(context);
  }
  public AutoScrollViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
  }
  private void init(Context context){
    mContext = context;
    mViewPager = new AutoViewPager(context);
    layout = new LinearLayout(mContext);
    addView(mViewPager);
  }

再通过addView(mViewPager);添加。

需要准备两张图片,这里用Shape进行绘制,Shape的使用可以查看Android Shape使用.

初始化小圆点:


 public void initPointView(int size){
    layout = new LinearLayout(mContext);
    for (int i = 0; i < size; i++) {
      ImageView imageView = new ImageView(mContext);
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20,20);
      params.leftMargin = 8;
      params.gravity = CENTER;
      imageView.setLayoutParams(params);
      if (i == 0) {
        imageView.setBackgroundResource(R.drawable.point_checked);
      }else {
        imageView.setBackgroundResource(R.drawable.point_normal);
      }
      layout.addView(imageView);
    }
    LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.addRule(ALIGN_PARENT_BOTTOM);
    layoutParams.addRule(ALIGN_PARENT_RIGHT);
    layoutParams.setMargins(12,20,12,20);
    layout.setLayoutParams(layoutParams);
    addView(layout);
  }

更新小圆点:


 public void updatePointView(int position) {
    int size = layout.getChildCount();
    for (int i = 0; i < size; i++) {
      ImageView imageView = (ImageView) layout.getChildAt(i);
      if (i == position){
        imageView.setBackgroundResource(R.drawable.point_checked);
      }else {
        imageView.setBackgroundResource(R.drawable.point_normal);
      }
    }
  }

带小圆点的使用以下控件


<com.kcode.autoscrollviewpager.view.AutoScrollViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="220dp">
  </com.kcode.autoscrollviewpager.view.AutoScrollViewPager>
您可能感兴趣的文章:Android开发在轮播图片上加入点击事件的方法Android实现自定义轮播图片控件详解Android实现轮播图片展示效果Android开发实现的自动换图片、轮播图效果示例Android ViewPager实现轮播图效果Android实现炫酷轮播图效果Android实现ViewPage轮播图效果Android自定义控件实现简单的轮播图控件Android自定义控件实现优雅的广告轮播图Android轮播图点击图片放大效果的实现方法


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android实现自定义轮播图片控件示例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android实现自定义轮播图片控件示例

要完成一个轮播图片,首先想到的应该是使用ViewPager来实现。ViewPager已经有了滑动的功能,我们只要让它自己滚动。再加上下方的小圆点就行了。所以我们本次的自定义控件就是由ViewPager和LinearLayout叠加起来组成的
2022-06-06

Android实现自定义轮播图片控件详解

首先上效果图实现原理 要完成一个轮播图片,首先想到的应该是使用ViewPager来实现。ViewPager已经有了滑动的功能,我们只要让它自己滚动。再加上下方的小圆点就行了。所以我们本次的自定义控件就是由ViewPager和LinearLa
2022-06-06

Android自定义控件实现简单的轮播图控件

最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码。于是自己封装了一下。本篇轮播图实现原理原文出处:循环广告位组件的实现,这里只是做了下封装成一个
2022-06-06

Android自定义控件实现优雅的广告轮播图

前言 今天给大家带来一个新的控件–轮播图,网上已经有很多这类的博客来讲解如何实现的,那么我的这个有哪些特点呢?或是说有哪些不同呢? 满足了轮播图的基本要求,循环滑动,在最后一张切到第一张时可以平稳的过渡 简洁简洁简洁 扩展性强如何使用 下面
2022-06-06

Android客户端实现图片轮播控件

本文和大家一起写一个Android图片轮播控件,供大家参考,具体内容如下 1. 轮播控件的组成部分 我们以知乎日报Android客户端的轮播控件为例,分析一下轮播控件的主要组成: 首先我们要有用来显示图片的View对象
2022-06-06

android自定义按钮示例(重写imagebutton控件实现图片按钮)

由于项目这种类型的图片按钮比较多,所以重写了ImageButton类。代码如下:package me.henji.widget; import android.content.Context;import android.graphics.
2022-06-06

Android自定义View实现多图片选择控件

前言 相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最经典的莫过于微信的图片选择了。所有很多情况下会使用到多图选择,所以就有了这篇文章,今天抽点时间写了个控件。 支持自定义选择图片的样式 支持设置图片选择数量 支持图片预
2022-06-06

Android自定义实现循环滚轮控件WheelView

首先呈上Android循环滚轮效果图: 现在很多地方都用到了滚轮布局WheelView,比如在选择生日的时候,风格类似系统提供的DatePickerDialog,开源的控件也有很多,不过大部分都是根据当前项目的需求绘制的界面,因此我就自己
2022-06-06

vue+rem自定义轮播图效果实现

本篇内容主要讲解“vue+rem自定义轮播图效果实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue+rem自定义轮播图效果实现”吧!使用vue+rem自定义轮播图的实现,供大家参考,具体内
2023-06-20

Android自定义控件(实现状态提示图表)

前面分析那么多系统源码了,也该暂停下来休息一下,趁昨晚闲着看见一个有意思的需求就操练一下分析源码后的实例演练—-自定义控件。 这个实例很适合新手入门自定义控件。先看下效果图: 横屏模式如下: 竖屏模式如下: 看见没有,这个控件完全自定义的
2022-06-06

Android实现图片轮播切换实例代码

利用Android的ViewFlipper和AnimationUtils实现图片带有动画的轮播切换,其中当点击“上一张”图片时,切换到上一张图片;当点击“下一张”图片时,切换到下一张图片。其效果图如下:设置布局文件,其内容如下: activ
2022-06-06

Android开发使用Handler实现图片轮播功能示例

本文实例讲述了Android使用Handler实现图片轮播功能。分享给大家供大家参考,具体如下:提前定义好一个Runnable接口,然后用handler调用。Mainactivity代码如下:package com.example.hand
2023-05-30

Android进阶篇-自定义图片伸缩控件具体实例

ZoomImageView.java:代码如下:public class ZoomImageView extends View{ /
2022-06-06

Android自定义EditText右侧带图片控件

前言最近项目做用户登录模块需要一个右边带图片的EditText,图片可以设置点击效果,所以就查资料做了一个自定义EditText出来,方便以后复用。 原理下面是自定义EditText的代码,具体难点是要实现图片的点击监听,因为谷歌官方至今没
2022-06-06

android自定义ImageView仿图片上传示例

看下效果图主要看下自定义view 代码public class ProcessImageView extends ImageView{ private Context context; private Paint paint; privat
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录