Android自定义ViewPager:水平滑动弹性效果,侧滑刷新加载的ViewPager
2017-04-26 16:31
816 查看
效果:
1.当viewpger为第一页时向右滑动viewpager向右移动;2.当viewpger为最后一页时向左滑动是viewpger向左移动;
首先先来看看效果图:
是不是你想要的效果呢?
思路:
1.继承viewpger
2.重写onPageScrolled方法,判断是能滑动
3.重写onTouchEvent方法,处理滑动事件
上代码:
setp1:继承Viewpager,从写构造方法
public class FlexibleViewPager extends ViewPager { public FlexibleViewPager(Context context) { super(context); } public FlexibleViewPager(Context context, AttributeSet attrs) { super(context, attrs); } }
setp2 : 重写onPageScrolled方法,判断是否能滑出
@Override protected void onPageScrolled(int position, float offset, int offsetPixels) {//监听viewpager是否是第一页或最后一页 if (getAdapter() == null && getAdapter().getCount() == 0) { isMoveLeft = false; isMoveRight = false; } else if (position == 0 && offset == 0 && offsetPixels == 0) {//当前为首页,左边能滑出 isMoveLeft = true; } else if (position == getAdapter().getCount() - 1 && offset == 0 && offsetPixels == 0) { isMoveRight = true; } else { isMoveLeft = false; isMoveRight = false; } if (normal.isEmpty() || normal.top - normal.bottom == 0) { normal.set(this.getLeft(), this.getTop(), this.getRight(), this.getBottom());//记录原来view的位置 } super.onPageScrolled(position, offset, offsetPixels); }
setp3:重写onTouchEvent方法,处理滑动事件
@Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_MOVE: if (x == 0) { x = ev.getX();//记录位置 } xMove = (int) (x - ev.getX()) / 2;//计算移动距离 if (isMoveLeft && xMove <= 0||isMoveRight && xMove >= 0) {//移动位置 this.layout(-xMove, normal.top, normal.right - xMove, normal.bottom); return true; } break; case MotionEvent.ACTION_UP: if (isMoveLeft || isMoveRight) { animation(xMove);//还原动画 } break; } return super.onTouchEvent(ev); }
附上全部代码:
/** * Created by wcb on 2017/4/19. */ public class FlexibleViewPager extends ViewPager { private static final String TAG = "FlexibleViewPager::::"; private boolean isMoveLeft = true;//左边是否能移动 private boolean isMoveRight; private Rect normal = new Rect();//记录原来的位置 private OnRefreshListener listener; float x = 0;//记录开始触摸的位置 int xMove = 0;//移动的距离 public FlexibleViewPager(Context context) { super(context); } public FlexibleViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_MOVE: if (x == 0) { x = ev.getX();//记录位置 } xMove = (int) (x - ev.getX()) / 2;//计算移动距离 Log.e(TAG, "xMove:" + xMove + "isMoveLeft:" + isMoveLeft + "isMoveRight:" + isMoveRight); if (isMoveLeft && xMove <= 0 || isMoveRight && xMove >= 0) {//移动位置 this.layout(-xMove, normal.top, normal.right - xMove, normal.bottom); return true; } break; case MotionEvent.ACTION_UP: if (isMoveLeft || isMoveRight) { animation(xMove);//还原位置 } break; } return super.onTouchEvent(ev); } @Override protected void onPageScrolled(int position, float offset, int offsetPixels) {//监听viewpager是否是第一页或最后一页 if (getAdapter() == null && getAdapter().getCount() == 0) { isMoveLeft = false; isMoveRight = false; } else if (position == 0 && offset == 0 && offsetPixels == 0) { isMoveLeft = true; } else if (position == getAdapter().getCount() - 1 && offset == 0 && offsetPixels == 0) { isMoveRight = true; } else { isMoveLeft = false; isMoveRight = false; } if (normal.isEmpty() || normal.top - normal.bottom == 0) { normal.set(this.getLeft(), this.getTop(), this.getRight(), this.getBottom());//viewpager记录原来位置 } super.onPageScrolled(position, offset, offsetPixels); } /** * 还原动画 **/ public void animation(int moveX) { if (listener != null) { if (moveX > getWidth() / 6) {//滑动的距离超过屏幕的1/6才回调 listener.onLoadMore(); } else if (moveX < -getWidth() / 6) { listener.onRefresh(); } } x = 0; TranslateAnimation ta = new TranslateAnimation(this.getX(), normal.left, 0, 0); ta.setDuration(200); this.startAnimation(ta); this.layout(normal.left, normal.top, normal.right, normal.bottom); } public void setOnRefreshListener(OnRefreshListener listener) { this.listener = listener; } public interface OnRefreshListener { void onRefresh(); void onLoadMore(); } }
git地址:https://github.com/chuangbin/FlexibleViewPager
相关文章推荐
- android自定义ViewPager之——水平滑动弹性效果
- android自定义ViewPager水平滑动弹性效果
- Android: 扩展WebView 和ViewPager实现viewpager中的水平滑动,类似Gmail的效果
- Android经典例子ViewPager、动态换肤、Tab标签效果、Renderscript、移动地图+选址、主页滑动效果、侧滑菜单沉浸式状态栏
- Android自定义ViewPager实现纵向滑动翻页效果
- Android 自定义View 之利用ViewPager 实现画廊效果(滑动放大缩小)
- android使用ViewPager实现底部菜单栏和左右滑动效果,加载多个Activity
- (原创)自定义view(view的绘制过程)、无限轮播并触碰停止轮播的viewpage、水平和垂直滚动的TextView、仿QQ滑动删除、下拉刷新上拉加载view、毛玻璃效果、低版本水波纹、圆环头像图
- Android ViewPager动态向前向后加载数据,自定义viewPager滑动速度
- Android自定义LinearLayout实现左右侧滑菜单,完美兼容ListView、ScrollView、ViewPager等滑动控件
- Android自定义ViewGroup实现弹性滑动效果
- Android-详解RecyclerView+BGARefreshLayout实现自定义下拉刷新、上拉加载和侧滑删除效果
- Android 自定义ViewPager的滑动切换页面效果
- android:关于自定义不能滑动的ViewPager后在使用View加载其所在的的布局时报错:Error inflating class view.NoscrollViewPager
- android 仿viewpager滑动效果自定义升级版
- android 自定义Viewpager 实现静止滑动,并去掉默认的滑动效果
- Android ViewPager实现软件的第一次加载的滑动效果
- 【Android您问我讲】超炫的左右滑动效果 - ViewPager的使用
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- Android 利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果