您的位置:首页 > 移动开发 > Android开发

Android ScrollView和OnTouch冲突解决(最新)

2017-01-16 19:21 465 查看

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;
}
};
}


转载请注明出处,谢谢!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: