189 8069 5689

怎么在Android中实现一个首页无限轮播功能

这期内容当中小编将会给大家带来有关怎么在Android中实现一个首页无限轮播功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

10年积累的成都网站制作、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有砚山免费网站建设让你可以放心的选择与我们合作。

  1. 多张轮播图定时效果

  2. 指示点以及每张图片的文字说明

  3. 实现无限轮播,可滑动,图片点击事件

开始布局:



  
    
      
    
    
      
      
      
      
        
        
        
        
        
      
    
  

布局中抽取的view属性:


  5dp
  5dp
  5dp
  5dp

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

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

public class MainActivity extends AppCompatActivity {
  private ViewPager mMyViewPaper;
  private List images;
  private List 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 images;
  private Context mContext;

  public MyAdapter(Context context,List 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);
  }
};

上述就是小编为大家分享的怎么在Android中实现一个首页无限轮播功能了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


本文名称:怎么在Android中实现一个首页无限轮播功能
转载来源:http://cdxtjz.cn/article/iihohp.html

其他资讯