Android自定义左右或上下滑动翻页效果
本文实例为大家分享了Android自定义左右或上下滑动翻页展示的具体代码,供大家参考,具体内容如下
该自定义的效果和ViewPage+Fragment差不多
上下滑动翻页,继承ScrollView
publicclassSlideScrollViewextendsScrollViewimplementsPageSlide{ privateTotalSlidetotalSlide; publicSlideScrollView(AppCompatActivitycontext){ super(context); try{ totalSlide=newTotalSlide(this,context); }catch(NoSuchMethodExceptione){ e.printStackTrace(); } totalSlide.init(context); totalSlide.linearLayout.setOrientation(totalSlide.linearLayout.VERTICAL); this.setLayoutParams(totalSlide.params); this.setVerticalScrollBarEnabled(false); this.addView(totalSlide.linearLayout); } publicfloatgetScroll(){ returnsuper.getScrollY(); } publicvoidsetScroll(Integervalue){ super.setScrollY(value); } @Override publicbooleanonTouchEvent(MotionEventev){ try{ returntotalSlide.MyTouchEvent(ev); }catch(InvocationTargetExceptione){ e.printStackTrace(); }catch(IllegalAccessExceptione){ e.printStackTrace(); } returnTouchEvent(ev); } publicbooleanTouchEvent(MotionEventev){ returnsuper.onTouchEvent(ev); } publicTotalSlidegetTotalSlide(){ returnthis.totalSlide; } }
左右滑动翻页,继承HorizontalScrollView
publicclassSlideHorizontalScrollViewextendsHorizontalScrollViewimplementsPageSlide{ privateTotalSlidetotalSlide; publicSlideHorizontalScrollView(AppCompatActivitycontext){ super(context); try{ totalSlide=newTotalSlide(this,context); }catch(NoSuchMethodExceptione){ e.printStackTrace(); } totalSlide.init(context); totalSlide.linearLayout.setOrientation(totalSlide.linearLayout.HORIZONTAL); this.setLayoutParams(totalSlide.params); this.setHorizontalScrollBarEnabled(false); this.addView(totalSlide.linearLayout); } publicfloatgetScroll(){ returngetScrollX(); } publicvoidsetScroll(Integervalue){ setScrollX(value); } @Override publicbooleanonTouchEvent(MotionEventev){ try{ returntotalSlide.MyTouchEvent(ev); }catch(InvocationTargetExceptione){ e.printStackTrace(); }catch(IllegalAccessExceptione){ e.printStackTrace(); } returnTouchEvent(ev); } publicbooleanTouchEvent(MotionEventev){ returnsuper.onTouchEvent(ev); } publicTotalSlidegetTotalSlide(){ returnthis.totalSlide; } }
下面的是两种翻页的底层
packagecom.hy.View; importandroid.os.Handler; importandroid.support.annotation.LayoutRes; importandroid.support.v7.app.AppCompatActivity; importandroid.util.DisplayMetrics; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.WindowManager; importandroid.widget.LinearLayout; importjava.lang.reflect.InvocationTargetException; importjava.lang.reflect.Method; importjava.util.ArrayList; importjava.util.List; /** *作用:实现上下左右滑动翻页,效果如微信左右滑动效果 */ publicinterfacePageSlide{ publicTotalSlidegetTotalSlide(); publicbooleanTouchEvent(MotionEventev); publicfloatgetScroll(); publicvoidsetScroll(Integervalue); classTotalSlide{ /** *设置翻页速度 *@paramspeed速度,默认为20 */ publicvoidsetSpeed(floatspeed){ this.speed=speed; } TotalSlide(PageSlidepageSlide,AppCompatActivitycontext)throwsNoSuchMethodException{ this.pageSlide=pageSlide; this.context=context; WindowManagerwm=context.getWindowManager(); if(pageSlideinstanceofSlideHorizontalScrollView){ 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(); }elseif(pageSlideinstanceofSlideScrollView){ fill=wm.getDefaultDisplay().getHeight(); get=pageSlide.getClass().getMethod("getScroll"); set=pageSlide.getClass().getMethod("setScroll",Integer.class); } } //初始化 voidinit(AppCompatActivitycontext){ DisplayMetricsmetrics=newDisplayMetrics(); context.getWindowManager().getDefaultDisplay().getMetrics(metrics); params=newLinearLayout.LayoutParams(metrics.widthPixels,metrics.heightPixels); linearLayout=newLinearLayout(context); linearLayout.setLayoutParams(params); } /** *增加页面 *@paramlayout该页面的布局文件 *@parammyAppCompatActivity该布局文件的java文件 */ publicvoidaddPage(@LayoutResintlayout,MyAppCompatActivitymyAppCompatActivity){ Viewview=context.getLayoutInflater().inflate(layout,null); myAppCompatActivity.view=view; myAppCompatActivity.context=context; myAppCompatActivity.onCreate(); insertPage(view); } /** *增加页面 *@paramlayout该页面的布局文件 */ publicvoidaddPage(@LayoutResintlayout){ Viewview=context.getLayoutInflater().inflate(layout,null); insertPage(view); } /** *增加页面 *@parammyAppCompatActivity该布局文件的java文件 */ publicvoidaddPage(MyAppCompatActivitymyAppCompatActivity){ Viewview=newView(context); myAppCompatActivity.view=view; myAppCompatActivity.context=context; myAppCompatActivity.onCreate(); insertPage(view); } /** *切换页面 *@parampageNo切换页面的下标 */ publicvoidchangePage(intpageNo){ if(pageNo=0){ now=fill*pageNo; try{ set.invoke(pageSlide,(int)now); }catch(IllegalAccessExceptione){ e.printStackTrace(); }catch(InvocationTargetExceptione){ e.printStackTrace(); } this.pageNo=pageNo; } } /** *@return返回当前页面编号 */ publicintgetPageNo(){ returnpageNo; } /** *删除页面 *@parampageNo删除页面的下标 */ publicvoidremovePage(intpageNo){ if(pageNo =0){ linearLayout.removeView(pageList.get(pageNo)); pageList.remove(pageNo); } } /**********************************************************************************************/ //展示页面的Activity privateAppCompatActivitycontext; //转换页面的速度,默认为20 privatefloatspeed=20; //当前Activity的页面滑动值倍数 privatefloatfill; //当前页面 privateintpageNo=0; //当前滚动条的位置 privatefloatnow=0; //手指点击的位置 privatefloatDown=0; //手指松开的位置 privatefloatUp=0; //滑动方向 privatefloatvalue=0; //是否为第一次点击 privatebooleanb=true; //页面集合 privateList pageList=newArrayList<>(); //辅助线程执行 privateHandlerhandler=newHandler(); //get方法 privateMethodget; //get方法 privateMethodset; //本页布局控件 LinearLayoutlinearLayout; //页面大小 LinearLayout.LayoutParamsparams; //多态 privatePageSlidepageSlide; //简化代码 privatevoidinsertPage(Viewview){ view.setLayoutParams(params); pageList.add(view); linearLayout.addView(view); } //滑动线程 privateRunnablerunnable=newRunnable(){ @Override publicvoidrun(){ 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(IllegalAccessExceptione){ e.printStackTrace(); }catch(InvocationTargetExceptione){ e.printStackTrace(); } } }; //手指判断 publicbooleanMyTouchEvent(MotionEventev)throwsInvocationTargetException,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); } returnfalse; } returnpageSlide.TouchEvent(ev); } } }
最后还需要一个类似于碎片一样的东西
packagecom.hy.View; importandroid.support.v7.app.AppCompatActivity; importandroid.view.View; /** *分页面的java类继承此类取代AppCompatActivity */ publicabstractclassMyAppCompatActivity{ /** *当作this来用 */ publicAppCompatActivitycontext; /** *当前页面的根布局用它使用findViewById()找控件 */ publicViewview; /** *初始值在这里面定义 */ publicabstractvoidonCreate(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。