Android使用Recyclerview实现图片水平自动循环滚动效果

简介:

本篇博客主要介绍的是如何使用RecyclerView实现图片水平方向自动循环(跑马灯效果)

效果图:   

思路:

1.准备m张图片

1.使用Recyclerview实现,返回无数个(实际Interge.MAXVALUE)item,第n个item显示第n%m张图片

3.使用recyclerview.scrollBy  每个一段时间水平滚动一段距离

4.通过layoutManager.findFirstVisibleItemPosition()获取当前显示的第一个View是第几个item,上面的ImageView显示对应de图片

实现代码:

XML文件

1.activity布局文件activity_recy.xml  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <ImageView
    android:layout_width="300dp"
    android:layout_height="350dp"
    android:layout_gravity="center_horizontal"
    android:id="@+id/img"
    android:src="@drawable/p5"
    android:scaleType="fitXY"
    />

    <android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="150dp"
      android:layout_marginTop="10dp"
      android:id="@+id/recyclerview"
      ></android.support.v7.widget.RecyclerView>

</LinearLayout>

2.适配器布局item_horizon.xml  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"
  android:orientation="vertical"

  >
  <ImageView
    android:layout_width="100dp"
    android:layout_height="match_parent"
    android:id="@+id/img"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:scaleType="fitXY"
    />

</LinearLayout>

Activity  

public class HorizontalActivity extends AppCompatActivity implements RecyAdapter.OnItemClickListener {
  private String TAG="HorizontalActivity";

  @BindView(R.id.img)
  ImageView img;
  @BindView(R.id.recyclerview)
  RecyclerView recyclerview;

  private Integer[] mImgIds = {R.drawable.p1, R.drawable.p2, R.drawable.p3, R.drawable.p4, R.drawable.p5,
      R.drawable.pic1, R.drawable.pic5, R.drawable.pic6};
  private List<Integer> datas;
  private RecyAdapter recyAdapter;
  private Handler mHandler=new Handler();
  private LinearLayoutManager layoutManager;

  private int oldItem=0;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recy);
    ButterKnife.bind(this);
    initData();
    initRecy();
    img.setImageResource(datas.get(0));
    recyAdapter.setOnItemClickListener(this);
  }

  Runnable scrollRunnable=new Runnable() {
    @Override
    public void run() {
      recyclerview.scrollBy(3,0);

//      int firstItem = layoutManager.findFirstVisibleItemPosition();
      int firstItem=layoutManager.findFirstVisibleItemPosition();
      if(firstItem!=oldItem&&firstItem>0){
        oldItem=firstItem;
        img.setImageResource(datas.get(oldItem%datas.size()));
      }

      Log.e(TAG, "run: firstItem:"+firstItem );

      mHandler.postDelayed(scrollRunnable,10);
    }
  };

  private void initRecy() {
    recyAdapter=new RecyAdapter(this,datas);

    layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    recyclerview.setLayoutManager(layoutManager);
    recyclerview.setAdapter(recyAdapter);
  }

  private void initData() {
    datas=new ArrayList<>();
    for (int i = 0; i <mImgIds.length ; i++) {
      datas.add(mImgIds[i]);
    }
  }

  @Override
  protected void onResume() {
    super.onResume();
    mHandler.postDelayed(scrollRunnable,10);
  }

  @Override
  protected void onStop() {
    super.onStop();
    mHandler.removeCallbacks(scrollRunnable);
  }

  @Override
  public void onItemClick(View view, int tag) {
    Toast.makeText(this,"第"+tag+"张图片被点击了",Toast.LENGTH_SHORT).show();
  }
}

适配器RecyAdapter

public class RecyAdapter extends RecyclerView.Adapter<RecyAdapter.ViewHolder> implements View.OnClickListener {

  private Context context;
  private List<Integer> datas;
  private OnItemClickListener onItemClickListener;

  public RecyAdapter(Context context, List<Integer> datas) {
    this.context = context;
    this.datas = datas;
  }

  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.item_horizontal, parent, false);
    ViewHolder vh=new ViewHolder(view);
    view.setOnClickListener(this);
    return vh;
  }

  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    int newPos=position%datas.size();

    holder.img.setImageResource(datas.get(newPos));

    holder.itemView.setTag(position);

  }

  @Override
  public int getItemCount() {
    return Integer.MAX_VALUE;
  }

  @Override
  public void onClick(View view) {
    if(onItemClickListener!=null){
      onItemClickListener.onItemClick(view, (Integer) view.getTag());
    }
  }

  class ViewHolder extends RecyclerView.ViewHolder {
     ImageView img;
    public ViewHolder(View itemView) {
      super(itemView);
      img=itemView.findViewById(R.id.img);
    }
  }

  public void setOnItemClickListener(OnItemClickListener listener){
    this.onItemClickListener=listener;

  }
  interface OnItemClickListener{
    void onItemClick(View view,int tag);
  }

}

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

(0)

相关推荐

  • Android中标签容器控件的实例详解

    前言 在一些APP中我们可以看到一些存放标签的容器控件,和我们平时使用的一些布局方式有些不同,它们一般都可以自动适应屏幕的宽度进行布局,根据对自定义控件的一些理解,今天写一个简单的标签容器控件,给大家参考学习. 下面这个是我在手机上截取的一个实例,是在MIUI8系统上截取的 这个是我实现的效果图 原理介绍 根据对整个控件的效果分析,大致可以将控件分别从以下这几个角度进行分析: 1.首先涉及到自定义的ViewGroup,因为现有的控件没法满足我们的布局效果,就涉及到要重写onMeasure和onL

  • Android中实现多行、水平滚动的分页的Gridview实例源码

    功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现. (2)水平滚动翻页,下面有显示当前页的icon. 1.实现自定义的HorizontalScrollView(HorizontalScrollView.java): 因为要翻页时需要传当前页给调用者,所以fling函数中自己

  • android listview 水平滚动和垂直滚动的小例子

    网上有很多解决 android listview 水平和垂直滚动的代码,我没有按照他们说的做(以前没搜到 O(∩_∩)O~) 我采用的是添加HorizontalScrollViewJava代码 复制代码 代码如下: < ScrollView android:id="@+id/ScrollView01" android:layout_height="300px" android:layout_x="16px" android:layout_y

  • Android自定义控件之继承ViewGroup创建新容器

    欢迎大家来学习本节内容,前几节我们已经学习了其他几种自定义控件,分别是Andriod 自定义控件之音频条及 Andriod 自定义控件之创建可以复用的组合控件还没有学习的同学请先去学习下,因为本节将使用到上几节所讲述的内容. 在学习新内容之前,我们先来弄清楚两个问题: 1 . 什么是ViewGroup? ViewGroup是一种容器.它包含零个或以上的View及子View. 2 . ViewGroup有什么作用? ViewGroup内部可以用来存放多个View控件,并且根据自身的测量模式,来测量

  • Android开发实现自定义水平滚动的容器示例

    本文实例讲述了Android开发实现自定义水平滚动的容器.分享给大家供大家参考,具体如下: public class HorizontalScrollView extends ViewGroup { //手势 private GestureDetector mGestureDetector; private HorizontalScroller mScroller; private int curID; //快速滑动 private boolean isFlying; //--回调函数-----

  • Android实现Activity水平和垂直滚动条的方法

    本文实例讲述了Android实现Activity水平和垂直滚动条的方法.分享给大家供大家参考,具体如下: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="

  • Android应用开发中自定义ViewGroup视图容器的教程

    一.概述 在写代码之前,我必须得问几个问题: 1.ViewGroup的职责是啥? ViewGroup相当于一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属性,都是为用于告诉容器的),我们的宽度(layout_width).高度(layout_height).对齐方式(layout_gravity)等:当然还有margin等:于是乎,ViewGroup的职能为:给childView计算出建议的宽和高和测量模式 :决定childView的位置:为什么只是

  • Android使用RecyclerView实现水平滚动控件

    前言 相信大家都知道Android滚动控件的实现方式有很多, 使用RecyclerView也比较简单. 做了一个简单的年龄滚动控件, 让我们来看看RecyclerView的使用方式, 主要有以下几点: (1) 对齐控件中心位置. (2) 计算滚动距离. (3) 高亮中心视图. (4) 实时显示中心数据. (5) 停止时自动对齐. (6) 滚动时, 设置按钮状态开关. 效果 1. 框架 主要关注RecyclerView部分逻辑. /** * 初始化年龄滑动条 */ private void ini

  • 从源码解析Android中View的容器ViewGroup

    这回我们是深入到ViewGroup内部\,了解ViewGroup的工作,同时会阐述更多有关于View的相关知识.以便为以后能灵活的使用自定义空间打更近一步的基础.希望有志同道合的朋友一起来探讨,深入Android内部,深入理解Android. 一.ViewGroup是什么?        一个ViewGroup是一个可以包含子View的容器,是布局文件和View容器的基类.在这个类里定义了ViewGroup.LayoutParams类,这个类是布局参数的子类. 其实ViewGroup也就是Vie

  • 详解Android使GridView横向水平滚动的实现方式

    Android为我们提供了竖直方向的滚动控件GridView,但如果我们想让它水平滚动起来,就需要自己实现了. 以下使用的测试数据datas集合都为List<ResolveInfo>类型,用来存储手机中的所有App public static List<ResolveInfo> getAppData(Context context) { PackageManager packageManager = context.getPackageManager(); Intent mainI

  • Android自定义ViewGroup实现标签流容器FlowLayout

    本篇文章讲的是Android 自定义ViewGroup之实现标签流式布局-FlowLayout,开发中我们会经常需要实现类似于热门标签等自动换行的流式布局的功能,网上也有很多这样的FlowLayout,但不影响我对其的学习.和往常一样,主要还是想总结一下自定义ViewGroup的开发过程以及一些需要注意的地方. 按照惯例,我们先来看看效果图 一.写代码之前,有几个是问题是我们先要弄清楚的: 1.什么是ViewGroup:从名字上来看,它可以被翻译为控件组,言外之意是ViewGroup内部包含了许

随机推荐