Android首页无限轮播功能的示例代码

最近工作不是很忙,也跟大神学习下总结一些小的技术点:

对于一个App几乎都有Banner广告功能,也就是我们常见的轮播图,当然目前市场第三方框架已经非常成熟了,尤其是youth5201314/banner这里有github地址也可以学习下:https://github.com/youth5201314/banner.git

那么下面给大家介绍我的一些总结:

首先分析下轮播图的设计

  1. 多张轮播图定时效果
  2. 指示点以及每张图片的文字说明
  3. 实现无限轮播,可滑动,图片点击事件

开始布局:

<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.yangziling.carousel.MainActivity">
<!--轮播图-->
  <FrameLayout
    android:layout_width="match_parent"
    android:layout_height="200dp">
    <android.support.v4.view.ViewPager
      android:id="@+id/vp"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

    <!--指示点和图片标题-->
    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="35dip"
      android:layout_gravity="bottom"
      android:background="#33000000"
      android:gravity="center"
      android:orientation="vertical">
      <!--图片配文-->
      <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="图片标题"
        android:textColor="@android:color/white" />
      <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="3dip"
        android:orientation="horizontal" >
      <!--指示点-->
        <View
          android:id="@+id/dot_0"
          style="@style/view_attr"
          android:background="@drawable/dot_focused"/>
        <View
          android:id="@+id/dot_1"
          style="@style/view_attr"
          android:background="@drawable/dot_normal"/>
        <View
          android:id="@+id/dot_2"
          style="@style/view_attr"
          android:background="@drawable/dot_normal"/>
        <View
          android:id="@+id/dot_3"
          style="@style/view_attr"
          android:background="@drawable/dot_normal"/>
        <View
          android:id="@+id/dot_4"
          style="@style/view_attr"
          android:background="@drawable/dot_normal"/>
      </LinearLayout>
    </LinearLayout>
  </FrameLayout>
</RelativeLayout>

布局中抽取的view属性:

<style name="view_attr">
  <item name="android:layout_width">5dp</item>
  <item name="android:layout_height">5dp</item>
  <item name="android:layout_marginLeft">5dp</item>
  <item name="android:layout_marginRight">5dp</item>
</style>

这里我展示的一些图片是在本地的,通过网络框架加载图片原理也是一样的。

这里直接给大家贴出来核心代码:

public class MainActivity extends AppCompatActivity {
  private ViewPager mMyViewPaper;
  private List<ImageView> images;
  private List<View> dots;
  private int currentItem;
  private TextView title;
  private MyAdapter adapter;
  //当前显示图片的位置
  private int localPosition = 0;
  //图片的id
  private int[] imageIds =
    new int[]{R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e};
  //图片的标题
  private String[] titles =
    new String[]{"蓝天白云", "青山绿水", "枯藤老树", "人间仙境", "岛屿大树"};
  private TimerTask mTimerTask;
  //创建一个定时器
  private final Timer timer = new Timer();
  private ImageView mImageView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mMyViewPaper = (ViewPager) findViewById(R.id.vp);

    //显示的图片
    images = new ArrayList<>();
    for (int i = 0; i < imageIds.length; i++) {
      mImageView = new ImageView(this);
      mImageView.setBackgroundResource(imageIds[i]);
      images.add(mImageView);
    }
    //指示点
    dots = new ArrayList<>();
    dots.add(findViewById(R.id.dot_0));
    dots.add(findViewById(R.id.dot_1));
    dots.add(findViewById(R.id.dot_2));
    dots.add(findViewById(R.id.dot_3));
    dots.add(findViewById(R.id.dot_4));

    title = (TextView) findViewById(R.id.title);
    title.setText(titles[0]);

    adapter = new MyAdapter(MainActivity.this, images);
    mMyViewPaper.setAdapter(adapter);
    mMyViewPaper.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
      position = position % images.size();
      title.setText(titles[position]);
      dots.get(position).setBackgroundResource(R.drawable.dot_focused);
      dots.get(localPosition).setBackgroundResource(R.drawable.dot_normal);

      localPosition = position;
      currentItem = position;
    }
    /**
     * 页面滑动时回调
     */
    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {

    }
    /**
     * 当ViewPager状态改变时,回调
     */
    @Override
    public void onPageScrollStateChanged(int state) {
      }
    });
  }
    /**
     * 轮播任务
     */
    @Override
    protected void onStart() {
      super.onStart();
      mTimerTask = new TimerTask() {

    @Override
    public void run() {
      currentItem = (currentItem + 1) % imageIds.length;
      mHandler.sendEmptyMessage(0);
    }
  };
  timer.schedule(mTimerTask, 2000, 2000);
}

/**
 * 接收子线程传递的数据
 */
private Handler mHandler = new Handler() {
  public void handleMessage(android.os.Message msg) {
    //轮播到最后一张图片时,直接跳转至第一页,并且取消滑动效果
    if (currentItem % images.size() == 0) {
      mMyViewPaper.setCurrentItem(currentItem, false);
    }
    //非最后一张展示图片的滑动效果
    mMyViewPaper.setCurrentItem(currentItem, true);
  }
};

  @Override
  protected void onStop() {
    super.onStop();
    timer.cancel();
    }
}

自定义了一个Adapter适配器:

public class MyAdapter extends PagerAdapter {
  private List<ImageView> images;
  private Context mContext;

  public MyAdapter(Context context,List<ImageView> images) {
    this.mContext =context;
    this.images = images;
  }
  //返回Viewpager中的view个数
  @Override
  public int getCount() {
    return Integer.MAX_VALUE;
  }

  //判断instantiateItem中的函数返回的key与一个页面示图是不是代表同一个
  //通常直接相等就OK啦
  @Override
  public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == arg1;
  }
  //移除一个固定位置的页面
  @Override
  public void destroyItem(ViewGroup view, int position, Object object) {
    view.removeView((View) object);
  }

  //将固定位置的View添加到Viewgroup中,并创建显示出来
  @Override
  public Object instantiateItem(ViewGroup view, final int position) {
    ImageView imageView = images.get(position % images.size());
    ViewGroup parent = (ViewGroup) imageView.getParent();
    //这里是动态添加示图,一个子类只能有一个父类
    //判断下如果parent存在一定要记得移除
    if (parent != null) {
      parent.removeView(imageView);
    }
    view.addView(imageView);
    //给图片添加点击事件
    imageView.setOnClickListener(new View.OnClickListener(){
      @Override
      public void onClick(View v) {
        Toast.makeText(mContext,"点击了第"+(position % images.size()+1)+"图片",Toast.LENGTH_SHORT).show();
      }
    });
    return images.get(position % images.size());
  }

  @Override
  public int getItemPosition(Object object) {
    return POSITION_NONE;
  }
}

在这里面也遇到一些问题,做了一些“妥协”,比如说无限轮播的时候发现播放到最后一张时会返回到第一张再次轮播,但是会有那种卡顿的感觉。所以我做了个“妥协的处理”,就是在播放到最后一张时,取消自带的动画效果,直接跳转到第一张,然后进行轮播。

private Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
      //轮播到最后一张图片时,直接跳转至第一页,并且取消滑动效果
      if (currentItem % images.size() == 0) {
      mMyViewPaper.setCurrentItem(currentItem, false);
    }
    //非最后一张展示图片的滑动效果
    mMyViewPaper.setCurrentItem(currentItem, true);
  }
};

项目的github地址:https://github.com/yangziling/Carousel.git

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

(0)

相关推荐

  • Android仿京东快报无限轮播效果

    我们常用的京东有一个非常好看的效果: 首页的京东快播有一个无限轮播的公告栏,先看效果: 公告内容大概每3s从中间向上滑出,同时下一条内容从底部向上滑动进入.整个过程还伴随有内容的渐变消失,动画效果很流畅. 采用ViewFlipper来实现更为简单. 看看ViewFlipper类官方注释: Simple {@link ViewAnimator} that will animate between two or more views that have been added to it. Only

  • Android图片无限轮播的实现代码

    本文实例为大家分享了AnAndroid图片无限轮播的具体代码,供大家参考,具体内容如下 public class MainActivity extends Activity { private ViewPager viewPager; private LinearLayout ll_dot; private String[] imageUrls = new String[] { "http://pic8.nipic.com/20100701/5290458_114840036316_2.jpg&

  • Android viewpager无限轮播获取网络图片功能

    本文实例为大家分享了viewpager无限轮播获取网络图片的具体代码,供大家参考,具体内容如下 话不多说直接上代码,你们都懂的 小圆点属性 dot_focused.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="recta

  • android实现banner轮播图无限轮播效果

    本文实例为大家分享了banner轮播图无限轮播效果的具体代码,供大家参考,具体内容如下 效果展示 第一步(权限配置) <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission andr

  • android ViewPager实现自动无限轮播和下方向导圆点

    一.布局 小圆点形状的生成shape.xml文件 使用空心还是实心的把对应的注释去掉就可以了. <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" android:useLevel="false&quo

  • Android使用viewpager实现自动无限轮播图

    1.具体步骤 说下大概实现步骤,一般我们有两种,一种是viewpager+作为游标的点 .另外一种是重写viewpager. 效果图: 1.1 布局,直接viewpager+一个viewgroup就好. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:

  • Android首页无限轮播功能的示例代码

    最近工作不是很忙,也跟大神学习下总结一些小的技术点: 对于一个App几乎都有Banner广告功能,也就是我们常见的轮播图,当然目前市场第三方框架已经非常成熟了,尤其是youth5201314/banner这里有github地址也可以学习下:https://github.com/youth5201314/banner.git 那么下面给大家介绍我的一些总结: 首先分析下轮播图的设计 多张轮播图定时效果 指示点以及每张图片的文字说明 实现无限轮播,可滑动,图片点击事件 开始布局: <Relative

  • C#实现图片轮播功能的示例代码

    目录 实践过程 效果 代码 实践过程 效果 代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } public bool Pflag; int flag = 0; FileSystemInfo[] fsinfo; ArrayList al = new ArrayList(); int MM = 0; private void splitContainer2_Panel2_Paint(obj

  • iOS实现UIScrollView的无限轮播功能(原理)详解

    前言 同学们在写需求的时候肯定会时常用到UIScrollView. UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 (2)当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容 (3)普通的UIView不具备滚动功能,不能显⽰示过多的内容 (4)UIScrollView是一个能够滚动的视图控件,可以⽤用来展⽰示⼤大量的内容,并且可以通过滚 动查看所有的内容 (5) 举例:手机上的"设置"

  • 用vue写一个仿简书的轮播图的示例代码

    1.先展示最终效果: 2.解决思路 Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果.写好css样式,只需改变每张图片的class即可实现轮播效果.动画效果交给transition完成.可以将轮播图看成两个(mainSlide和extraSlide),各个图片的位置如图所示: 3.代码实现 各个slide的样式: $width: 800px; // 容器宽度 $height: 300px; // 容器高度 $bWidth: 500px; // 大图片宽度 $

  • Android Filterable实现Recyclerview筛选功能的示例代码

    原先碰到筛选这种功能时,后端的接口都会让上传一个字段,根据字段来返回相应的数据.后来一次和别人对接时,接口直接返回全部数据,而且还要实现筛选功能.我...我说不就是一条sql语句的事,改接口多方便,我苦心劝导,然后被怼回来,切,不就是筛选嘛,求人不如自己搞. 1. 效果图 2. 思路 既然是筛选,那就少不了比较.也没有什么好的办法,无非就是循环对比,然后将适配器进行数据更新.页面刷新即可.但筛选的调用要方便,怎么比较才方便我们调用呢?偶然间看到了Filterable,使Adapter继承自该接口

  • 原生Js 实现的简单无缝滚动轮播图的示例代码

       简单无缝滚动轮播图存在很多漏洞,就是后期增加图片时会很不方便,需要改动的地方也很多,耦合性也很强,只适用于一部分程序,所以我们可以通过改动图片结构和计算折算点的方式,升级代码.       原简单的滚动轮播代码 <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> &

  • JavaScript实现无缝轮播图的示例代码

    目录 上效果 一.实现过程 1)首先实现基本布局 2)主要样式 二.如何实现无缝呢 (重点来了) 思路: 主要代码 完整代码 花费一个下午从0到1实现的轮播图,当然还有很多需要改进的地方(欢迎提出需要改进的地方),等我再努力努力,将其封装成一个组件. 上效果 一.实现过程 1)首先实现基本布局 <div class="carousel-container"> //图片列表 <div class="carousel-list"></div

  • iOS Swift利用UICollectionView实现无限轮播功能(原理)详解

    前言 作为一个资深(自认为)iOS程序猿,会经常用到轮播图,上一次使用UIScrollView实现无限轮播的效果,这一次在Swift语言中,我使用UICollectionView再为大家讲解一次无限轮播的实现原理. 先上图: UICollectionView-无限轮播.gif 首先需要实现了就是UICollectionView的分页,这个很简单: collectionView.isPagingEnabled = true 接下来就是原理,在UICollectionView的两端需要先添加两张图片

随机推荐