浅谈布局中ViewPager嵌套ViewPager问题
2016-06-06 08:58
267 查看
在开发布局中,从功能性,用户体验等方面设计时,会出现ViewPager中嵌套ViewPager的问题,下面从两方面考虑解决这个问题
一、外层ViewPager不滑动,内层ViewPager滑动
自定义外层viewpager,重写onInterceptTouchEvent方法,代码如下:
public class BaseViewPager extends ViewPager{
private boolean isCanScroll = true;
public BaseViewPager(Context context) {
super(context);
}
public BaseViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollble(boolean scrollble) {
isCanScroll = scrollble;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (isCanScroll) {
return super.onInterceptTouchEvent(event);
} else {
return false;
}
}
}
二、双层ViewPager都能滑动(一般用于加载广告,推荐页面)
自定义内层ViewPager,代码如下:
public class MyViewPager extends ViewPager implements OnGestureListener{
/** 手势滑动处理类 **/
private GestureDetector mDetector;
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
GestureDetector detector = new GestureDetector(context, this);
mDetector = detector;
}
public GestureDetector getGestureDetector() {
return mDetector;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if(listener != null) {
listener.setOnSimpleClickListenr(getCurrentItem());
}
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
}
private onSimpleClickListener listener;
/** 单击监听接口 **/
public interface onSimpleClickListener {
void setOnSimpleClickListenr(int position);
}
public void setOnSimpleClickListener(onSimpleClickListener listener) {
this.listener = listener;
}
}
在fragment中重写ViewPager的OnTouchListener,代码如下:
private float xDistance, yDistance;
/** 记录按下的X坐标 **/
private float mLastMotionX,mLastMotionY;
/** 是否是左右滑动 **/
private boolean mIsBeingDragged = true;
@Override
public boolean onTouch(View v, MotionEvent event) {
vp.getGestureDetector().onTouchEvent(event);
// TODO Auto-generated method stub
final float x = event.getRawX();
final float y = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
mLastMotionX = x;
mLastMotionY = y;
case MotionEvent.ACTION_MOVE:
final float xDiff = Math.abs(x - mLastMotionX);
final float yDiff = Math.abs(y - mLastMotionY);
xDistance += xDiff;
yDistance += yDiff;
float dx = xDistance - yDistance;
/** 左右滑动避免和下拉刷新冲突 **/
if (xDistance > yDistance || Math.abs(xDistance - yDistance) < 0.00001f) {
mIsBeingDragged = true;
mLastMotionX = x;
mLastMotionY = y;
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(true);
} else {
mIsBeingDragged = false;
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
if(mIsBeingDragged) {
((ViewParent) vp.getParent()).requestDisallowInterceptTouchEvent(false);
}
break;
default:
break;
}
return false;
}
一、外层ViewPager不滑动,内层ViewPager滑动
自定义外层viewpager,重写onInterceptTouchEvent方法,代码如下:
public class BaseViewPager extends ViewPager{
private boolean isCanScroll = true;
public BaseViewPager(Context context) {
super(context);
}
public BaseViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollble(boolean scrollble) {
isCanScroll = scrollble;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (isCanScroll) {
return super.onInterceptTouchEvent(event);
} else {
return false;
}
}
}
二、双层ViewPager都能滑动(一般用于加载广告,推荐页面)
自定义内层ViewPager,代码如下:
public class MyViewPager extends ViewPager implements OnGestureListener{
/** 手势滑动处理类 **/
private GestureDetector mDetector;
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
GestureDetector detector = new GestureDetector(context, this);
mDetector = detector;
}
public GestureDetector getGestureDetector() {
return mDetector;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if(listener != null) {
listener.setOnSimpleClickListenr(getCurrentItem());
}
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
}
private onSimpleClickListener listener;
/** 单击监听接口 **/
public interface onSimpleClickListener {
void setOnSimpleClickListenr(int position);
}
public void setOnSimpleClickListener(onSimpleClickListener listener) {
this.listener = listener;
}
}
在fragment中重写ViewPager的OnTouchListener,代码如下:
private float xDistance, yDistance;
/** 记录按下的X坐标 **/
private float mLastMotionX,mLastMotionY;
/** 是否是左右滑动 **/
private boolean mIsBeingDragged = true;
@Override
public boolean onTouch(View v, MotionEvent event) {
vp.getGestureDetector().onTouchEvent(event);
// TODO Auto-generated method stub
final float x = event.getRawX();
final float y = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
mLastMotionX = x;
mLastMotionY = y;
case MotionEvent.ACTION_MOVE:
final float xDiff = Math.abs(x - mLastMotionX);
final float yDiff = Math.abs(y - mLastMotionY);
xDistance += xDiff;
yDistance += yDiff;
float dx = xDistance - yDistance;
/** 左右滑动避免和下拉刷新冲突 **/
if (xDistance > yDistance || Math.abs(xDistance - yDistance) < 0.00001f) {
mIsBeingDragged = true;
mLastMotionX = x;
mLastMotionY = y;
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(true);
} else {
mIsBeingDragged = false;
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
if(mIsBeingDragged) {
((ViewParent) vp.getParent()).requestDisallowInterceptTouchEvent(false);
}
break;
default:
break;
}
return false;
}
相关文章推荐
- 每天一个Linux命令(39)free命令
- 自定义圆头像
- JAVAEE中的Nginx+Tomcat+Memcached集群Session共享
- iptables 实现centos内网机器访问外网
- 求一个正整数的二进制数中1的个数
- 为什么 Git 比 SVN 好
- 终于等到你---订餐系统之负载均衡(nginx+memcached+ftp上传图片+iis)
- iOS 第三方框架-SDWebImage解读
- Shell break和continue命令
- 全面解析Bootstrap中tab(选项卡)的使用方法
- Android_layout_note
- 省市联动效果
- 如何把SQLServer数据库从高版本降级到低版本?
- Shell until循环
- C++实验7
- Shell while循环
- python爬虫神器PyQuery的使用方法
- Shell for循环
- keras使用技术技巧
- android布局技巧:创建高效布局