怎么解决安卓开发的滑动事件冲突

 我来答
创作者wjhg
2016-07-30 · TA获得超过2899个赞
知道小有建树答主
回答量:3099
采纳率:74%
帮助的人:311万
展开全部
需求:一个ViewGroup中有多个控件,类似于常见的底部Tab布局,这几个子布局之间既可以点击切换,也可以左右滑动切换
实现:自定义父控件,在onInterceptTouchEvent方法中判断是否点击还是滑动,如果判断是点击,则直接交给child来响应点击事件去;如果是滑动,则
拦截事件,并通过回调传递给调用者处理。
优点:该控件只对触摸事件的分发做了相应处理,适用于各种滑动与点击冲突的情况....
使用:直接将该控件作为父布局即可,通过setmSetOnSlideListener回调处理对应滑动事件

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.RelativeLayout;

public class MyRadioRelativeLayout extends RelativeLayout {

public MyRadioRelativeLayout(Context context) {
this(context, null);
}

public MyRadioRelativeLayout(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}

public MyRadioRelativeLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

private void initView() {

}

private boolean mScrolling;
private float touchDownX;

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchDownX = event.getX();
mScrolling = false;
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(touchDownX - event.getX()) >= ViewConfiguration.get(
getContext()).getScaledTouchSlop()) {
mScrolling = true;
} else {
mScrolling = false;
}
break;
case MotionEvent.ACTION_UP:
mScrolling = false;
break;
}
return mScrolling;
}

float x1 = 0;
float x2 = 0;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return true;
case MotionEvent.ACTION_MOVE:

break;
case MotionEvent.ACTION_UP:
x2 = event.getX();
if (touchDownX - x2 > DensityUtil.dip2px(getContext(), 40)) {
if(mSetOnSlideListener!=null){
mSetOnSlideListener.onRightToLeftSlide();
}
}
if (touchDownX - x2 < -DensityUtil.dip2px(getContext(), 40)) {
if(mSetOnSlideListener!=null){
mSetOnSlideListener.onLeftToRightSlide();
}
}
break;
}

return super.onTouchEvent(event);
}

private setOnSlideListener mSetOnSlideListener;

public setOnSlideListener getmSetOnSlideListener() {
return mSetOnSlideListener;
}

public void setmSetOnSlideListener(setOnSlideListener mSetOnSlideListener) {
this.mSetOnSlideListener = mSetOnSlideListener;
}

public interface setOnSlideListener{
void onRightToLeftSlide();
void onLeftToRightSlide();
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式