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自定义左右或上下滑动翻页效果 的全部内容, 来源链接: utcz.com/z/319379.html

回到顶部