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;
//页面集合
privateListpageList=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();
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。