当前位置: 首页 > 编程笔记 >

Android自定义左右或上下滑动翻页效果

鲁文昌
2023-03-14
本文向大家介绍Android自定义左右或上下滑动翻页效果,包括了Android自定义左右或上下滑动翻页效果的使用技巧和注意事项,需要的朋友参考一下

本文实例为大家分享了Android自定义左右或上下滑动翻页展示的具体代码,供大家参考,具体内容如下

该自定义的效果和ViewPage+Fragment差不多

上下滑动翻页,继承ScrollView

public class SlideScrollView extends ScrollView implements PageSlide{ 
 private TotalSlide totalSlide; 
 public SlideScrollView(AppCompatActivity context) { 
 super(context); 
 try { 
  totalSlide=new TotalSlide(this,context); 
 } catch (NoSuchMethodException e) { 
  e.printStackTrace(); 
 } 
 totalSlide.init(context); 
 totalSlide.linearLayout.setOrientation(totalSlide.linearLayout.VERTICAL); 
 this.setLayoutParams(totalSlide.params); 
 this.setVerticalScrollBarEnabled(false); 
 this.addView(totalSlide.linearLayout); 
 } 
 public float getScroll() { 
 return super.getScrollY(); 
 } 
 public void setScroll(Integer value) { 
 super.setScrollY(value); 
 } 
 @Override 
 public boolean onTouchEvent(MotionEvent ev) { 
 try { 
  return totalSlide.MyTouchEvent(ev); 
 } catch (InvocationTargetException e) { 
  e.printStackTrace(); 
 } catch (IllegalAccessException e) { 
  e.printStackTrace(); 
 } 
 return TouchEvent(ev); 
 } 
 public boolean TouchEvent(MotionEvent ev){ 
 return super.onTouchEvent(ev); 
 } 
 public TotalSlide getTotalSlide(){ 
 return this.totalSlide; 
 } 
} 

左右滑动翻页,继承HorizontalScrollView

public class SlideHorizontalScrollView extends HorizontalScrollView implements PageSlide{ 
 private TotalSlide totalSlide; 
 public SlideHorizontalScrollView(AppCompatActivity context){ 
  super(context); 
  try { 
   totalSlide=new TotalSlide(this,context); 
  } catch (NoSuchMethodException e) { 
   e.printStackTrace(); 
  } 
  totalSlide.init(context); 
  totalSlide.linearLayout.setOrientation(totalSlide.linearLayout.HORIZONTAL); 
  this.setLayoutParams(totalSlide.params); 
  this.setHorizontalScrollBarEnabled(false); 
  this.addView(totalSlide.linearLayout); 
 } 
 public float getScroll() { 
  return getScrollX(); 
 } 
 public void setScroll(Integer value) { 
  setScrollX(value); 
 } 
 @Override 
 public boolean onTouchEvent(MotionEvent ev) { 
  try { 
   return totalSlide.MyTouchEvent(ev); 
  } catch (InvocationTargetException e) { 
   e.printStackTrace(); 
  } catch (IllegalAccessException e) { 
   e.printStackTrace(); 
  } 
  return TouchEvent(ev); 
 } 
 public boolean TouchEvent(MotionEvent ev){ 
  return super.onTouchEvent(ev); 
 } 
 public TotalSlide getTotalSlide(){ 
  return this.totalSlide; 
 } 
} 

下面的是两种翻页的底层

package com.hy.View; 
 
import android.os.Handler; 
import android.support.annotation.LayoutRes; 
import android.support.v7.app.AppCompatActivity; 
import android.util.DisplayMetrics; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.LinearLayout; 
 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.ArrayList; 
import java.util.List; 
 
/** 
 * 作用:实现上下左右滑动翻页,效果如 微信左右滑动效果 
 */ 
 
public interface PageSlide { 
 public TotalSlide getTotalSlide(); 
 public boolean TouchEvent(MotionEvent ev); 
 public float getScroll(); 
 public void setScroll(Integer value); 
 class TotalSlide{ 
  /** 
   * 设置翻页速度 
   * @param speed 速度,默认为20 
   */ 
  public void setSpeed(float speed){ 
   this.speed=speed; 
  } 
  TotalSlide(PageSlide pageSlide,AppCompatActivity context) throws NoSuchMethodException { 
   this.pageSlide=pageSlide; 
   this.context=context; 
   WindowManager wm = context.getWindowManager(); 
   if(pageSlide instanceof SlideHorizontalScrollView){ 
    fill = wm.getDefaultDisplay().getWidth(); 
    get=pageSlide.getClass().getMethod("getScroll"); 
    set=pageSlide.getClass().getMethod("setScroll",Integer.class); 
    //Toast.makeText(context,"TotalSlide:"+get.getName(),Toast.LENGTH_LONG).show(); 
   }else if(pageSlide instanceof SlideScrollView){ 
    fill = wm.getDefaultDisplay().getHeight(); 
    get=pageSlide.getClass().getMethod("getScroll"); 
    set=pageSlide.getClass().getMethod("setScroll",Integer.class); 
   } 
  } 
  //初始化 
  void init(AppCompatActivity context){ 
   DisplayMetrics metrics = new DisplayMetrics(); 
   context.getWindowManager().getDefaultDisplay().getMetrics(metrics); 
   params = new LinearLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels); 
   linearLayout = new LinearLayout(context); 
   linearLayout.setLayoutParams(params); 
  } 
  /** 
   * 增加页面 
   * @param layout 该页面的布局文件 
   * @param myAppCompatActivity 该布局文件的java文件 
   */ 
  public void addPage(@LayoutRes int layout, MyAppCompatActivity myAppCompatActivity){ 
   View view=context.getLayoutInflater().inflate(layout,null); 
   myAppCompatActivity.view=view; 
   myAppCompatActivity.context=context; 
   myAppCompatActivity.onCreate(); 
   insertPage(view); 
  } 
  /** 
   * 增加页面 
   * @param layout 该页面的布局文件 
   */ 
  public void addPage(@LayoutRes int layout){ 
   View view=context.getLayoutInflater().inflate(layout,null); 
   insertPage(view); 
  } 
  /** 
   * 增加页面 
   * @param myAppCompatActivity 该布局文件的java文件 
   */ 
  public void addPage(MyAppCompatActivity myAppCompatActivity){ 
   View view=new View(context); 
   myAppCompatActivity.view=view; 
   myAppCompatActivity.context=context; 
   myAppCompatActivity.onCreate(); 
   insertPage(view); 
  } 
  /** 
   * 切换页面 
   * @param pageNo 切换页面的下标 
   */ 
  public void changePage(int pageNo) { 
   if(pageNo<pageList.size()&&pageNo>=0){ 
    now=fill*pageNo; 
    try { 
     set.invoke(pageSlide,(int)now); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
    this.pageNo=pageNo; 
   } 
  } 
 
  /** 
  * @return 返回当前页面编号 
  */ 
  public int getPageNo(){ 
   return pageNo; 
  } 
  /** 
   * 删除页面 
   * @param pageNo 删除页面的下标 
   */ 
  public void removePage(int pageNo) { 
   if (pageNo < pageList.size() && pageNo >= 0) { 
    linearLayout.removeView(pageList.get(pageNo)); 
    pageList.remove(pageNo); 
   } 
  } 
  /**********************************************************************************************/ 
  //展示页面的Activity 
  private AppCompatActivity context; 
  //转换页面的速度,默认为20 
  private float speed=20; 
  //当前Activity的页面滑动值倍数 
  private float fill; 
  //当前页面 
  private int pageNo=0; 
  //当前滚动条的位置 
  private float now=0; 
  //手指点击的位置 
  private float Down=0; 
  //手指松开的位置 
  private float Up=0; 
  //滑动方向 
  private float value=0; 
  //是否为第一次点击 
  private boolean b=true; 
  //页面集合 
  private List<View> pageList=new ArrayList<>(); 
  //辅助线程执行 
  private Handler handler=new Handler(); 
  //get方法 
  private Method get; 
  //get方法 
  private Method set; 
  //本页布局控件 
  LinearLayout linearLayout; 
  //页面大小 
  LinearLayout.LayoutParams params; 
  //多态 
  private PageSlide pageSlide; 
  //简化代码 
  private void insertPage(View view){ 
   view.setLayoutParams(params); 
   pageList.add(view); 
   linearLayout.addView(view); 
  } 
  //滑动线程 
  private Runnable runnable=new Runnable() { 
   @Override 
   public void run() { 
    try { 
     if((b&&(float)get.invoke(pageSlide)>=now)||(!b&&(float)get.invoke(pageSlide)<=now)){ 
      set.invoke(pageSlide,(int) (now-value)); 
      b=true; 
      handler.removeCallbacks(runnable); 
     }else{ 
      handler.postDelayed(runnable,1); 
     } 
     if(now==0&&value>0) { 
      set.invoke(pageSlide,(int)((float)get.invoke(pageSlide))); 
     }else{ 
      set.invoke(pageSlide,(int)((float)get.invoke(pageSlide)+value)); 
     } 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
   } 
  }; 
  //手指判断 
  public boolean MyTouchEvent(MotionEvent ev) throws InvocationTargetException, IllegalAccessException { 
   if(b){ 
    Down=(float)get.invoke(pageSlide); 
    b=false; 
   } 
   if(ev.getAction()==MotionEvent.ACTION_UP){ 
    Up=(float)get.invoke(pageSlide); 
    value=Up>Down?Up-Down:Down-Up; 
    b=Up>Down?true:false; 
    if(value>250){ 
     value=b?speed:-speed; 
     now=b?now+fill:now-fill; 
     pageNo= (int) (now/fill); 
     handler.post(runnable); 
    }else{ 
     value=b?-speed:speed; 
     handler.post(runnable); 
    } 
    return false; 
   } 
   return pageSlide.TouchEvent(ev); 
  } 
 } 
} 

最后还需要一个类似于碎片一样的东西

package com.hy.View; 
 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
 
/** 
 * 分页面的java类继承此类 取代AppCompatActivity 
 */ 
 
public abstract class MyAppCompatActivity { 
 /** 
 * 当作 this 来用 
 */ 
 public AppCompatActivity context; 
 /** 
 * 当前页面的根布局 用它使用 findViewById() 找控件 
 */ 
 public View view; 
 /** 
 * 初始值在这里面定义 
 */ 
 public abstract void onCreate(); 
} 

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

 类似资料:
  • 本文向大家介绍Android ViewPager实现左右滑动翻页效果,包括了Android ViewPager实现左右滑动翻页效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了ViewPager实现左右滑动翻页效果展示的具体代码,供大家参考,具体内容如下 代码如下: 布局文件: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Android自定义ViewPager实现纵向滑动翻页效果,包括了Android自定义ViewPager实现纵向滑动翻页效果的使用技巧和注意事项,需要的朋友参考一下 抖音几乎已经成为了我们日常生活中使用比较频繁的App,无聊之时或工作之后可以刷一刷短视频来供我们娱乐与放松。看到抖音的视屏切换效果,觉得用ViewPager可以做出一样的效果。想一想之前用的ViewPager都是横向切换

  • 本文向大家介绍Android手势左右滑动效果,包括了Android手势左右滑动效果的使用技巧和注意事项,需要的朋友参考一下 最近想实现Android左滑弹出菜单框,右滑消失菜单这个个功能。了解了一下Android 的滑动事件,必须是在view组件或者Activity上实现,同时必须实现OnTouchListener, OnGestureListener这个两个接口。 以上就是本文的全部内容,希望对

  • 本文向大家介绍Android嵌套RecyclerView左右滑动替代自定义view,包括了Android嵌套RecyclerView左右滑动替代自定义view的使用技巧和注意事项,需要的朋友参考一下 以前的左右滑动效果采用自定义scrollview或者linearlayout来实现,recyclerview可以很好的做这个功能,一般的需求就是要么一个独立的左右滑动效果,要么在一个列表里的中间部分一

  • 本文向大家介绍Android实现微信首页左右滑动切换效果,包括了Android实现微信首页左右滑动切换效果的使用技巧和注意事项,需要的朋友参考一下 大家看到微信首页切换效果有没有觉得很炫,滑动切换,点击底部bar瞬间切换,滑动切换渐变效果,线上效果图: 之前也在博客上看到别人的实现,再次基础上,我做了些优化。首先说下实现原理,大神略过,o(╯□╰)o 页面上看到的三个页面是三个Fragment,

  • 本文向大家介绍Android自定义可左右滑动和点击的折线图,包括了Android自定义可左右滑动和点击的折线图的使用技巧和注意事项,需要的朋友参考一下 前言        前几天有小盆友让我写一个折线图,可以点击,可以左右滑动。对于折线肯定有很多项目都使用过,所以网上肯定也有很多demo,像AndroidChart、HelloChart之类的,功能相当丰富,效果也很赞,但是太重了,其他的小demo