今天改功能完善之后,产生的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);
}
@Override
protected 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);
}
}
/***
* 分发触摸屏事件
*/
@Override
public 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);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
//判断是否滑动
if (isScrollable) {
return super.onTouchEvent(ev);
} else {
return false;
}
}
}
呵呵,写的不是很好,希望大家提出批评,偶们来改正...