Android ScrollView和OnTouch冲突解决(最新)
好了,思想+代码。
看了好多别人写的解决方法,自定义ScrollView
代码如下:
package com.aierjun.woxiangwoxiang.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
/**
* Created by aierJun on 2017/1/16.
*/
public class MyScrollView extends ScrollView {
public MyScrollView(Context context)
{
super(context);
}
public MyScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
//这个方法如果返回 true 的话 两个手指移动,启动一个按下的手指的移动不能被传播出去。
public boolean onInterceptTouchEvent(MotionEvent event)
{
super.onInterceptTouchEvent(event);
return false;
}
//这个方法如果 true 则整个Activity 的 onTouchEvent() 不会被系统回调 但当true是Scrollview的滑动失效
public boolean onTouchEvent(MotionEvent event)
{
super.onTouchEvent(event);
return false;
}
}
注意:这个方法个人尝试实现不了,但这里面标注的两个方法对考虑很有帮助。
然后找寻方法时我发现了一个方法OnTouchListener:
看了资料分析:
地址:http://blog.csdn.net/huiguixian/article/details/22193977
综合来讲:
onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
假如onTouch方法返回false会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。
最后实现
代码如下:
/**
* Created by aierJun on 2017/1/16.
*/
public class MainActivity extends Activity {
private ScrollView scrollView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
initView();
}
private void findView() {
scrollView= (ScrollView) findViewById(R.id.scrollView);
}
private void initView() {
scrollView.setOnTouchListener(onTouchListener);
}
float startY;
float endY;
View.OnTouchListener onTouchListener=new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
startY=motionEvent.getY();
break;
case MotionEvent.ACTION_UP:
endY=motionEvent.getY();
break;
default:
if (endY-startY>50){
}else {
}
}
//这里的false和前面的一样
return false;
}
};
}