本文实例为大家分享了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自定义左右或上下滑动翻页效果全部内容,希望文章能够帮你解决Android自定义左右或上下滑动翻页效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)