欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现轮播图片展示效果

程序员文章站 2024-01-01 15:48:46
本文实例为大家分享了android轮播图片的展示,供大家参考,具体内容如下 实现逻辑 1.创建xml布局文件,使用viewpager完成轮播图片 2.初始...

本文实例为大家分享了android轮播图片的展示,供大家参考,具体内容如下

实现逻辑

1.创建xml布局文件,使用viewpager完成轮播图片

2.初始化viewpager控件,然后为控件设置适配器,创建出来的适配器实现里面的四个方法

3.四个方法分别是getcount isviewfromobject instantiateitem destroyitem

4.在oncreat方法中,加载图片资源,将图片id存在集合中,使图片能够在页面中显示,(图片之所以能够在页面中显示,是因为在适配器中的instantiateitem方法中获取了集合中的图片元素)

5.图片下方的文字显示:图片下方之所以会有文字,可以通过初始化控件,在viewpager监听器中的onpageselected方法中tv_desc.settext(descs[position]);这样文字就可以跟随者图片进行切换

6.文字下方的小圆点的切换:在xml布局中设置一个linlayout布局,然后再oncreat方法中设置小圆点,通过linearlayout.layoutparams layoutparams = new linearlayout.layoutparams(10, 10);的方法引入小圆点(具体代码可以参考下方的initdot方法)

7.要想让小圆点随着页面的切换而切换,可以定义下方的changedots的方法,让此方法在监听器中的onpageselected方法中进行调用

8.图片的无限轮播的实现:可以使适配器中的getcount返回值设为一个很大很大的值,同时在instantiateitem方法中设置position position = position % imageresids.length;防止索引越界异常,这样就可以使图片无限轮播,但是此时还有一个问题就是,右边可以无限轮播,但是左边是无法无限轮播的,这个问题的解决办法是在oncreat方法中设置当前选中的条目viewpager.setcurrentitem(count / 2);这样两边都可以实现无限轮播

9.图片自动切换的处理:使用handler机制实现页面的延时更新,同时为了防止内存溢出,需要在页面可见时,也就是activity的onstart方法中发送消息,在页面消失时,也就是onstop方法中删除消息

布局文件

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.a2_.mainactivity">

<android.support.v4.view.viewpager
  android:id="@+id/vp"
  android:layout_width="match_parent"
  android:layout_height="250dp">
</android.support.v4.view.viewpager>

<linearlayout
  android:orientation="vertical"
  android:gravity="center"
  android:background="#66000000"
  android:layout_alignbottom="@id/vp"
  android:layout_width="match_parent"
  android:layout_height="50dp">

  <textview
    android:id="@+id/desc"
    android:text="描述文本"
    android:textcolor="#ffffff"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

  <linearlayout
    android:id="@+id/layout_dot"
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

  </linearlayout>
</linearlayout>
</relativelayout>

核心代码

package com.example.a2_;

import android.os.handler;
import android.os.message;
import android.support.v4.view.pageradapter;
import android.support.v4.view.viewpager;
import android.support.v7.app.appcompatactivity;
import android.os.bundle;
import android.view.view;
import android.view.viewgroup;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.textview;

import java.util.arraylist;

public class mainactivity extends appcompatactivity {
private static final int update_item = 1;
private arraylist<imageview> imageviews = new arraylist<>();
private int[] imageresids = {r.mipmap.icon_1, r.mipmap.icon_2, r.mipmap.icon_3,
    r.mipmap.icon_4, r.mipmap.icon_5};

private string[] descs = {"为梦想坚持", "我相信我是黑马", "黑马公开课", "google/io", "轻松1w+"};
private viewpager viewpager;
private textview tv_desc;
private linearlayout layout_dot;
private int count = 10000000;
private handler handler = new handler() {
  @override
  public void handlemessage(message msg) {
    switch (msg.what) {
      case update_item:
        updataitem();
        break;
    }
    super.handlemessage(msg);
  }
};

@override
protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);

  //初始化控件
  viewpager = (viewpager) findviewbyid(r.id.vp);
  tv_desc = (textview) findviewbyid(r.id.desc);
  layout_dot = (linearlayout) findviewbyid(r.id.layout_dot);
  //给viewpager设置适配器
  viewpager.setadapter(new mypageradapter());
  //对viewpager设置监听器
  viewpager.addonpagechangelistener(new viewpager.onpagechangelistener() {

    //当页面滚动时触发的时间
    @override
    public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) {

    }

    //当页面被选中时触发的方法
    @override
    public void onpageselected(int position) {
      //对position进行处理
      position = position % imageviews.size();
      //当页面被选中的时候,改变描述文本
      tv_desc.settext(descs[position]);
      changedots(position);
    }

    //当页面状态滚动状态发生改变时触发的事件
    @override
    public void onpagescrollstatechanged(int state) {
      //当页面空闲状态被改变的时候
      if (state == viewpager.scroll_state_idle) {
        handler.sendemptymessagedelayed(update_item, 3000);
      } else {
        handler.removemessages(update_item);
      }
    }
  });


  //初始化图片
  initimage();
  //初始化文字下方的点
  initdot();
  //当加载页面的时候,默认让第一个文本加载出来
//    initdescfirst();

  //使两边都可以无限轮播
  viewpager.setcurrentitem(count / 2);
//页面加载时更新
  updataitem();
}

private void updataitem() {
  int index = viewpager.getcurrentitem();
  viewpager.setcurrentitem(++index);
  handler.sendemptymessagedelayed(update_item, 3000);
}

//选中对应的原点
private void changedots(int position) {
  //先把所有的点恢复为白色
  for (int i = 0; i < layout_dot.getchildcount(); i++) {
    view view = layout_dot.getchildat(i);
    view.setselected(false);
  }
  //获取当前被选中的条目 设置为选中状态
  layout_dot.getchildat(position).setselected(true);

}

//初始化文字下方的点
private void initdot() {
  linearlayout.layoutparams layoutparams = new linearlayout.layoutparams(10, 10);
  layoutparams.setmargins(4, 4, 4, 4);
  for (int i = 0; i < imageviews.size(); i++) {
    view view = new view(this);
    view.setbackgroundresource(r.drawable.seletor_dot);
    view.setlayoutparams(layoutparams);
    layout_dot.addview(view);
  }
}

//当加载页面的时候,默认让第一个文本加载出来
private void initdescfirst() {
  tv_desc.settext(descs[0]);
  changedots(0);
}

//添加图片,准备一个imageview集合,用来交给instantiateitem添加到页面
private void initimage() {
  for (int i = 0; i < imageresids.length; i++) {
    //创建出imageview对象
    imageview imageview = new imageview(getapplicationcontext());
    imageview.setimageresource(imageresids[i]);
    imageviews.add(imageview);
  }
}

private class mypageradapter extends pageradapter {

  @override
  public int getcount() {
    return count;
  }

  @override
  public boolean isviewfromobject(view view, object object) {
    //判断这个view是不是通过instantiateitem创建出来的
    return view == object;
  }

  //用来创建条目
  @override
  public object instantiateitem(viewgroup container, int position) {
    position = position % imageresids.length;
    //获取条目
    imageview imageview = imageviews.get(position);
    container.addview(imageview);
    return imageview;
  }

  //用来销毁条目,,且最多会创建出三个条目,多出来的条目将会被销毁
  @override
  public void destroyitem(viewgroup container, int position, object object) {

    //销毁创建的条目
    container.removeview((view) object);
  }
}

@override
protected void onstart() {
  super.onstart();
  //当页面显示的时候,更新轮播图
  handler.sendemptymessagedelayed(update_item, 3000);
}

@override
protected void onstop() {
  super.onstop();
  //当页面不可见时,停止更新
  handler.removecallbacksandmessages(null);
}
}


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

上一篇:

下一篇: