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

Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能

程序员文章站 2023-11-23 11:39:04
需要做一个仿淘宝客户端viewpager滑动到最后一页,再拖动的时候跳到详情的功能,刚开始没什么思路,后来搜了一下,发现有好几种实现方法,最好的一种就是在viewpager...

需要做一个仿淘宝客户端viewpager滑动到最后一页,再拖动的时候跳到详情的功能,刚开始没什么思路,后来搜了一下,发现有好几种实现方法,最好的一种就是在viewpager图片的后面再加一个view,然后滑动viewpager的时候,判断一下就行了。
附一个链接,我写的代码就是参考的这个,稍微改了一点点,先看看效果图。

Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能

实现起来比较简单,先写一个滑动加载详情的布局,然后在viewpager的instantiateitem里面判断一下,如果是最后一张,就显示加载详情的那个布局。不过需要注意的是,viewpager的getcount()返回的是list.size()+1,因为多了一个布局。
下面看看代码里面的几个方法。

在pageradapter的instantiateitem里面加载布局,判断一下position,如果小于图片数组,就是图片布局,如果大于了数组的长度(为什么会大于,因为前面已经说了,getcount返回的+1了的),就返回那个滑动跳转的布局。

@override 
public object instantiateitem(viewgroup container, int position) { 
 if (position < images.length) { 
  imageview imageview = new imageview(mainactivity.this); 
  viewgroup.layoutparams lp = new viewgroup.layoutparams(viewgroup.layoutparams.match_parent, dip2px(300)); 
  imageview.setlayoutparams(lp); 
  imageview.setscaletype(imageview.scaletype.center_crop); 
  imageview.setimageresource(images[position]); 
  container.addview(imageview); 
  return imageview; 
 } else { 
  view hintview = layoutinflater.from(container.getcontext()).inflate(r.layout.more_view, container, false); 
  slidetext = (textview) hintview.findviewbyid(r.id.tv); 
  arrowimage = (imageview) hintview.findviewbyid(r.id.iv); 
  container.addview(hintview); 
  return hintview; 
 } 
} 

 只要这样写了,就可以看到一个大概的效果了,然后主要就是viewp的onpagechangelistener里面的东西了。主要思路就是,当在最后一张图片时,只要再次往左滑动,滑动到一定距离,就触发跳转的事件,然后,只要是在最后一张图片,是在向左滑动,松开手时,都要让viewpager选中最后一张图片那里,不能是滑动到了新加的那个布局去了。

在看看viewpager.onpagechangelistener具体的代码是怎么样的。

public class viewpageronpagechangelistener implements viewpager.onpagechangelistener { 
  int currposition = 0; // 当前滑动到了哪一页 
  boolean canjump = false; 
  boolean canleft = true; 
  boolean isobjanmatitor = true; 
  boolean isobjanmatitor2 = false; 
  @override 
  public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) { 
   if (position == (images.length-1)) { 
    if (positionoffset > 0.35) { 
     canjump = true; 
     if (imageadapter.arrowimage != null && imageadapter.slidetext != null) { 
      if (isobjanmatitor) { 
       isobjanmatitor = false; 
       objectanimator animator = objectanimator.offloat(imageadapter.arrowimage, "rotation", 0f, 180f); 
       animator.addlistener(new animatorlisteneradapter() { 
        @override 
        public void onanimationend(animator animation) { 
         super.onanimationend(animation); 
         imageadapter.slidetext.settext("松开跳到详情"); 
         isobjanmatitor2 = true; 
        } 
       }); 
       animator.setduration(500).start(); 
      } 
     } 
    } else if (positionoffset <= 0.35 && positionoffset > 0) { 
     canjump = false; 
     if (imageadapter.arrowimage != null && imageadapter.slidetext != null) { 
      if (isobjanmatitor2) { 
       isobjanmatitor2 = false; 
       objectanimator animator = objectanimator.offloat(imageadapter.arrowimage, "rotation", 180f, 360f); 
       animator.addlistener(new animatorlisteneradapter() { 
        @override 
        public void onanimationend(animator animation) { 
         super.onanimationend(animation); 
         imageadapter.slidetext.settext("继续滑动跳到详情"); 
         isobjanmatitor = true; 
        } 
       }); 
       animator.setduration(500).start(); 
      } 
     } 
    } 
    canleft = false; 
   } else { 
    canleft = true; 
   } 
  } 
  @override 
  public void onpageselected(int position) { 
   currposition = position; 
  } 
  @override 
  public void onpagescrollstatechanged(int state) { 
   if (currposition == (images.length-1) && !canleft) { 
    if (state == viewpager.scroll_state_settling) { 
     if (canjump) { 
      toast.maketext(mainactivity.this, "跳转啦", toast.length_short).show(); 
     } 
     new handler().post(new runnable() { 
      @override 
      public void run() { 
       // 在handler里调用setcurrentitem才有效 
       viewpager.setcurrentitem(images.length-1); 
      } 
     }); 
    } 
   } 
  } 
 } 

 逻辑不算复杂,主要是onpagechangelistener里面三个方法加的一些判断。

看到参考的那篇文章里面评论很多人在要源码,我在这里把我写的分享一下,欢迎大家指导。源码下载

另外还有一个比较好的viewpager效果就是,同时显示三个item,然后滑动到最后一个图片时,让那个向左滑的小箭头露出了,让用户知道这个viewpager还可以继续滑动,体验稍微好一点。

Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能

这个效果实现起来也非常简单,只需要设置viewpager的marginright和marginleft,然后给viewpager和它的父控件加上android:clipchildren="false"就行了。

以上所述是小编给大家介绍的android仿淘宝详情页面viewpager滑动到最后一张图片跳转的功能,希望对大家有所帮助