Android ScrollView与其他组件的OnTouchEvent冲突解决

来源:互联网 发布:java se8 编辑:程序博客网 时间:2024/05/22 00:31

今天改功能完善之后,产生的bug.

遇到ScrollView与其他组件的OnTouchEvent冲突.上下滑动时,你的OnTouchEvent的ACTION_DOWN事件在TextView,LinearLayout,ImageView时,被这些组件给吸收了,因为onClick点击事件是通过OnTouchEvent判断产生的.

所以,如何实现需求的效果,好头疼啊.

最后,问了一下经理,最后有了头绪,就用我的方法解决了,不是很好,如果你有更好的方法,请留言告知,谢谢.

直接上代码咯,偶们的注释是很专业的啦,要是看不懂,可以问我啊....

package com.hisun.sinldo.consult.view;import com.hisun.sinldo.R;import com.hisun.sinldo.utils.LogUtil;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.ScrollView;/** * 自定义ScrollView *  * @author xuel *  */public class MemberServiceScrollView extends ScrollView {/** ScrollView的子组件 */private View convertView;/** 圆形菜单组件 */private WheelMenu mWheelMenu;/** 记录上次的触摸屏事件是否操作了圆形菜单组件 */private boolean lastWheelMenuAction = false;/** ScrollView 是否滚动 */private boolean isScrollable = true;public MemberServiceScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public MemberServiceScrollView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);}public MemberServiceScrollView(Context context) {super(context);}@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);// 获取ScrollView子组件convertView = getChildAt(0);mWheelMenu = null;// 判断是否为空if (convertView != null) {// 获取圆形菜单组件mWheelMenu = (WheelMenu) convertView.findViewById(R.id.member_wheel_menu);}}/*** * 分发触摸屏事件 */@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {LogUtil.i(VIEW_LOG_TAG, "" + ev.getAction());// 判断,是否上次的触摸屏事件是否操作了圆形菜单组件if (lastWheelMenuAction) {// 判断,如果是ACTION_CANCEL,或者ACTION_UP,将lastWheelMenuAction恢复到默认if (ev.getAction() == MotionEvent.ACTION_CANCEL|| ev.getAction() == MotionEvent.ACTION_UP) {lastWheelMenuAction = false;//ScrollView允许滚动isScrollable = true;}// /返回,将事件交给子组件处理,那样就不会影响圆形菜单的转动效果return false;}// 判断,当触摸屏事件的ACTION_DOWN按下事件触发后,进行判断// 1.圆形菜单不为空// 2.菜单的高度 - 总共滑动的Y轴 > 按下的Y轴// 3.菜单的宽度 > 按下的X轴   && mWheelMenu.getMeasuredWidth() + 20 > ev.getX()// 4.菜单的高度 - 总共滑动的Y轴 > 总共滑动的Y轴if (mWheelMenu != null&& mWheelMenu.getMeasuredHeight() - getScrollY() > ev.getY()&& mWheelMenu.getMeasuredHeight() - getScrollY() > getScrollY()) {// 操作了菜单lastWheelMenuAction = true;//ScrollView不允许滚动isScrollable = false;// 返回,将事件交给子组件处理,那样就不会影响圆形菜单的转动效果return false;} else {//ScrollView允许滚动isScrollable = true;// 返回默认的return super.onInterceptTouchEvent(ev);}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {//判断是否滑动if (isScrollable) {return super.onTouchEvent(ev);} else {return false;}}}
呵呵,写的不是很好,希望大家提出批评,偶们来改正...

0 0
原创粉丝点击