热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android实现轮播图片效果

这篇文章主要为大家详细介绍了Android实现轮播图片效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的

本文实例为大家分享了Android实现轮播图片效果的具体代码,供大家参考,具体内容如下

一、原理

首先,将这些要轮播的图片和一些文本分别放置在不同的数据集合中,程序启动的时候默认显示一组图片和文本数据,然后启动一个定时器,每隔一段时间便替换掉显示的图片和文本数据,同时加入一些动画效果,已达到轮播的特效。同时,我们也要实现手指滑动图片达到轮播的效果。

二、实现

1、程序启动界面MainActivity

public class MainActivity extends AppCompatActivity implements ImageBannerFramLayout.FramLayoutLisenner{
  private ImageBannerFramLayout mGroup;
  private int[] ids = new int[] {
      R.drawable.i1,//图片资源1
      R.drawable.i2,//图片资源2
  };
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //计算当前手机宽度
    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    int width = displayMetrics.widthPixels;
    mGroup = (ImageBannerFramLayout) findViewById(R.id.image_group);
    mGroup.setLisenner(this);
    List list = new ArrayList<>();
    for (int i = 0; i 
public class ImageBarnnerViewGroup extends ViewGroup {
  private int children;//我们View Group的子视图总个数
  private int childwidth;//子视图的宽度
  private int childheight;//子视图的高度
 
  private int x;//此时的x的值代表的是第一次按下的位置的横坐标,每一次移动过的过程中 移动之前的位置横坐标
  private int index = 0;//代表名为每张图片的索引
  private Scroller scroller;
 
  /**
   * 利用一个单击变量开关进行判断,离开屏幕的一瞬间判断用户的操作是点击
   */
  private boolean isClick;//true的时候点击事件,false的时候不是点击事件
  private ImageBarnnerLister lister;
 
  private ImageBarnnerViewGroupLisnner barnnerViewGroupLisnner;
 
  public ImageBarnnerLister getLister() {
    return lister;
  }
 
  public void setLister(ImageBarnnerLister lister) {
    this.lister = lister;
  }
 
  public ImageBarnnerViewGroupLisnner getBarnnerViewGroupLisnner() {
    return barnnerViewGroupLisnner;
  }
  public void setBarnnerViewGroupLisnner(ImageBarnnerViewGroupLisnner barnnerViewGroupLisnner) {
    this.barnnerViewGroupLisnner = barnnerViewGroupLisnner;
  }
  public interface ImageBarnnerLister {
    void chickImageIndex(int pos);//pos代表的是我们当前的图片的具体索引值
  }
  /**
   * 实现轮播图底部圆点切换效果
   * 自定义一个继承自FragmenLayou布局,利用FragmeLayout布局特性
   */
  
  //自动轮播
  private boolean isAuto = true;//默认情况下开启轮播
  private Timer timer = new Timer();
  private TimerTask timerTask;
  
  @SuppressLint("HandlerLeak")
  private android.os.Handler autohandler = new android.os.Handler() {
    @Override
    public void handleMessage(Message msg) {
      switch (msg.what) {
        case 0://我们需要图片的自动轮播
          if (++index >= children) {//如果是最后一张图片,从第一张开始
            index = 0;
          }
          scrollTo(childwidth * index,0);
          barnnerViewGroupLisnner.selectImage(index);
          break;
        default:
      }
    }
  };
 
  private void startAuto() {
    isAuto = true;
 
  }
 
  private void stopAuto() {
    isAuto = false;
  }
 
  /**
   * 采用Timer,TimerTask,Handler三者结合的方式来实现自动轮播
   */
 
  public ImageBarnnerViewGroup(Context context) {
    super(context);
    initObj();
  }
 
  public ImageBarnnerViewGroup(Context context, AttributeSet attrs) {
    super(context, attrs);
    initObj();
  }
 
  public ImageBarnnerViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    initObj();
  }
 
 
  private void initObj() {
    scroller = new Scroller(getContext());
 
    timerTask = new TimerTask() {
      @Override
      public void run() {
        if (isAuto) {//开启轮播图
          autohandler.sendEmptyMessage(0);
        }
      }
    };
    timer.schedule(timerTask,100,3000);
  }
 
  @Override
  public void computeScroll() {
    super.computeScroll();
    if (scroller.computeScrollOffset()) {
      scrollTo(scroller.getCurrX(),0);
      invalidate();//重绘
    }
  }
 
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //1.求出子视图的个数
    children = getChildCount();//我们可以知道自试图的个数
    if (0 == children)
    {
      setMeasuredDimension(0,0);
    } else {
      measureChildren(widthMeasureSpec, heightMeasureSpec);
      //此时我们以第一个子视图=为基准,也就是说我们的View Group
      View view = getChildAt(0);
      childwidth = view.getMeasuredWidth();
      childheight = view.getMeasuredHeight();
      int width = view.getMeasuredWidth() * children;
      setMeasuredDimension(width,childheight);
    }
    //2.测量子视图的宽度和高度
    //3.根据子视图的狂赌和高度,求出该ViewGroup的宽度和高度
  }
 
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
    return super.onInterceptTouchEvent(ev);
  }
  /**
   * 用两种方式来实现轮播图的手动轮播
   * 1,利用scrollTo,scrollBy 完成轮播图的手动轮播
   * 1,利用Scroller 对象完成轮播图的手动效果
   * @param event
   * @return
   */
 
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN://表示用户按下的一瞬间
        stopAuto();//停止图片轮播
        if (!scroller.isFinished()) {
          scroller.abortAnimation();
        }
        isClick = true;
        x=(int)event.getX();
        break;
      case MotionEvent.ACTION_MOVE://表示用户按下之后在屏幕上移动的过程
        int moveX = (int) event.getX();
        int distance = moveX - x;
        scrollBy(-distance,0);
        x = moveX;
        isClick = false;
        break;
      case MotionEvent.ACTION_UP://标识的是用户抬起的一瞬间
        int scrollX = getScrollX();
        index = (scrollX + childwidth / 2) / childwidth;
        if (index <0) {  //已经滑动到了最左边
          index = 0;
        } else if (index > children - 1) {//说明已经滑动到了最右边
          index = children - 1;
        }
 
        if (isClick) { //点击事件
          lister.chickImageIndex(index);
        } else {
          int dx = index * childwidth - scrollX;
          scroller.startScroll(scrollX,0,dx,0);
          postInvalidate();
          barnnerViewGroupLisnner.selectImage(index);
        }
        startAuto();//开启图片轮播
        break;
      default:
    }
    return true;
    //返回true的目的是告诉该View Group容器的父View 我们已经处理好了该事件
  }
 
  @Override
  protected void onLayout(boolean b, int i, int i1, int i2, int i3) {
    if (b) {
      int lefrMargin = 0;
      for (int j = 0; j 

2)新建ImageBannerFramLayout类继承自FrameLayout实现两个接口

public class ImageBannerFramLayout extends FrameLayout implements ImageBarnnerViewGroup.ImageBarnnerViewGroupLisnner,ImageBarnnerViewGroup.ImageBarnnerLister{
 
  private ImageBarnnerViewGroup imageBarnnerViewGroup;
  private LinearLayout linearLayout;
 
  private FramLayoutLisenner lisenner;
 
  public FramLayoutLisenner getLisenner() {
    return lisenner;
  }
 
  public void setLisenner(FramLayoutLisenner lisenner) {
    this.lisenner = lisenner;
  }
 
  public ImageBannerFramLayout(@NonNull Context context) {
    super(context);
    initImageBarnnerViewGroup();
    initDotLinearlayout();
  }
 
 
 
  public ImageBannerFramLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    initImageBarnnerViewGroup();
    initDotLinearlayout();
  }
 
  public ImageBannerFramLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initImageBarnnerViewGroup();
    initDotLinearlayout();
  }
 
  public void addBitmaps(List list) {
    for (int i = 0; i = Build.VERSION_CODES.HONEYCOMB) {
      linearLayout.setAlpha(0.5f);
    } else {
      linearLayout.getBackground().setAlpha(100);
    }
  }
 
 
  @Override
  public void selectImage(int index) {
    int count = linearLayout.getChildCount();
    for (int i = 0;i 

3、程序布局页面activity_main

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
  

4、新建两个drawable资源文件dot_normal.xml和dot_select.xml,实现轮播图底部小圆点

不同的是前者颜色为白色后者为黑色

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
  

三、运行结果

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


推荐阅读
  • WPF开发心率检测大数据曲线图的高性能实现方法
    本文介绍了在WPF开发中实现心率检测大数据曲线图的高性能方法。作者尝试过使用Canvas和第三方开源库,但性能和功能都不理想。最终作者选择使用DrawingVisual对象,并结合局部显示的方式实现了自己想要的效果。文章详细介绍了实现思路和具体代码,对于不熟悉DrawingVisual的读者可以去微软官网了解更多细节。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • 1简介本文结合数字信号处理课程和Matlab程序设计课程的相关知识,给出了基于Matlab的音乐播放器的总体设计方案,介绍了播放器主要模块的功能,设计与实现方法.我们将该设 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
author-avatar
小菠萝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有