首页 > 系统 > Android > 正文

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

2019-10-22 18:18:45
字体:
来源:转载
供稿:网友

本文实例为大家分享了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(); } 

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表