android viewpager实现竖屏滑动效果

作者:ben羽毛 时间:2021-12-19 18:05:44 

Viewpager 横向滑动效果系统就自带了很多种,比如这个

效果

android viewpager实现竖屏滑动效果

那如果做成竖屏的这种效果呢 。我百度过很多,效果都不是很好,有的代码特别多而且存在很多问题。我结合了以前别人的代码现在来教大家个简单的实现过程。

首先自定义Viewpager 是肯定必不可少的了


public class VerticalViewPager extends ViewPager {
 private OnItemClickListener mOnItemClickListener;

public VerticalViewPager(Context context) {
   super(context);
   init();
 }

public VerticalViewPager(Context context, AttributeSet attrs) {
   super(context, attrs);
   init();
   setup();
 }

private void init() {
   // The majority of the magic happens here
   setPageTransformer(true, new VerticalPageTransformer());
   // The easiest way to get rid of the overscroll drawing that happens on the left and right
   setOverScrollMode(OVER_SCROLL_NEVER);
 }
  private MotionEvent swapXY(MotionEvent ev) {
   float width = getWidth();
   float height = getHeight();

float newX = (ev.getY() / height) * width;
   float newY = (ev.getX() / width) * height;

ev.setLocation(newX, newY);

return ev;
 }

@Override
 public boolean onInterceptTouchEvent(MotionEvent ev){
   boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
   swapXY(ev); // return touch coordinates to original reference frame for any child views
   return intercepted;
 }

private float scaleY ;
 @Override
 public boolean onTouchEvent(MotionEvent ev) {

System.out.println("----------getY" + ev.getY());
   System.out.println("----------scaleY" + scaleY);
   if (ev.getAction()==MotionEvent.ACTION_MOVE){
   }
   if (ev.getAction()==MotionEvent.ACTION_DOWN){
     scaleY = ev.getY();
   }
   if (ev.getAction()==MotionEvent.ACTION_UP){
     if (scaleY == ev.getY()){
       System.out.println("------------------======");
       scaleY= 0;
       return false;
     }
   }
   try {
     return super.onTouchEvent(swapXY(ev));
   }catch (Exception e){
   }
   return true;
 }
 public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
   mOnItemClickListener = onItemClickListener;
 }

public interface OnItemClickListener {
   void onItemClick(int position);
 }
 private void setup() {
   final GestureDetector tapGestureDetector = new  GestureDetector(getContext(), new TapGestureListener());

setOnTouchListener(new OnTouchListener() {
     @Override
     public boolean onTouch(View v, MotionEvent event) {
       tapGestureDetector.onTouchEvent(event);
       return false;
     }
   });
 }
 private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {

@Override
   public boolean onSingleTapConfirmed(MotionEvent e) {
     if(mOnItemClickListener != null) {
       mOnItemClickListener.onItemClick(getCurrentItem());
     }
     return true;
   }
 }

}

要实现动画效果的核心就在 setPageTransformer(true, new VerticalPageTransformer());,大家都知道这个是设置Viewpager 设置动画的方法 ,那么要实现这个如果用系统自带的切换动画效果的话 肯定是不符合Viewpager 竖屏滑动的效果的。所以自定义PageTransformer 就是必然的趋势了


private class VerticalPageTransformer implements ViewPager.PageTransformer {
   private float MIN_SCALE = 0.5f;

@Override
   public void transformPage(View view, float position) {
     if (position < -1) { // [-Infinity,-1)
       // This page is way off-screen to the left.
       view.setAlpha(0);

}else if (position <= 0) { // [-1,1]
       view.setAlpha(1 + position);
       view.setTranslationX(-view.getWidth() * position);
       view.setPivotY( view.getMeasuredHeight());
       view.setPivotX( view.getMeasuredWidth()/2);
       view.setTranslationY( position * view.getHeight());
       float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)
           * (1 - Math.abs(position));
       view.setScaleX(scaleFactor);
       view.setScaleY(scaleFactor);

}
     else if (position <= 1) { // [-1,1]
       view.setAlpha(1);
       view.setTranslationX(-view.getWidth() * position);
       view.setTranslationY( position * view.getHeight());
       float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)
           * (1 - Math.abs(position));

} else { // (1,+Infinity]
       view.setAlpha(0);
       view.setTranslationY( position * view.getHeight());
     }
   }

}

重写transformPage 方法。然后得到如上gif 向左旋转90的效果,剩下的代码你们看看也就知道是item点击事件与滑动事件的监听。所以就不细讲了

来源:https://blog.csdn.net/qq793318828/article/details/78809763

标签:android,viewpager,滑动
0
投稿

猜你喜欢

  • Java泛型映射不同的值类型详解及实例代码

    2023-07-29 00:20:52
  • Git和Maven的子模块简单实践

    2023-09-22 01:45:55
  • C#检查键盘大小写锁定状态的方法

    2022-01-11 18:00:39
  • 使用Java的Lucene搜索工具对检索结果进行分组和分页

    2022-07-27 05:21:17
  • c# mutex互斥量的深入解析

    2022-03-13 02:38:42
  • C#获取web.config配置文件内容的方法

    2023-12-24 12:22:27
  • android开发教程之判断是手机还是平板的方法

    2022-10-22 12:30:41
  • Android Support Annotations资料整理

    2021-09-21 13:39:33
  • Java spring的三种注入方式详解流程

    2021-07-02 12:25:47
  • C#调用海康工业相机SDK采集图像并在Halcon窗口中显示方式

    2022-06-26 00:48:02
  • java实现点击按钮弹出新窗体功能

    2022-02-18 14:39:55
  • C#调用webservice接口的最新方法教程

    2022-12-22 05:07:27
  • 解决spring mvc 多数据源切换,不支持事务控制的问题

    2022-09-30 03:39:56
  • SpringBoot微信扫码支付的实现示例

    2023-02-08 03:03:44
  • Java Socket通信(一)之客户端程序 发送和接收数据

    2023-07-05 00:34:48
  • C#基础知识系列八const和readonly关键字详细介绍

    2023-06-25 16:39:37
  • Java实现时间日期格式转换示例

    2023-06-06 04:45:11
  • 详解SpringBoot自定义配置与整合Druid

    2023-07-24 20:20:28
  • Java异常分类及统一处理详解

    2022-01-27 12:32:24
  • Springboot 使用maven release插件执行版本管理及打包操作

    2023-07-12 01:20:35
  • asp之家 软件编程 m.aspxhome.com