カスタムビューグループを作成して、必要な機能を実装します。しかし、私はあなたの助けが必要な問題を抱えています。問題は、指がビュー グループから子ビューに移動することです。しかし、子ビューの指がタッチイベントを見逃しています。ビュー グループの ViewGroup.onInterceptTouchEvent と ViewGroup.onTouchEvent メソッドをオーバーライドします。ビュー グループの ViewGroup.onInterceptTouchEvnet が true を返すと、ビュー グループの ViewGroup.onTouchEvent がモーション イベントを処理するのが好きです。その後、モーション イベントはビュー グループの ViewGroup.onTouchEvent に送信され、ビュー グループの ViewGroup.onInterceptTouchEvent メソッドは渡されません。指がビュー グループから子ビューに移動すると、モーション イベントがビュー グループの ViewGroup.onTouchEvent に直接渡されますが、モーション イベントを子ビューにディスパッチできません。あなたの助けを待ってください。お願いします!
This is the Layout :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textview_title"
android:layout_width="match_parent"
android:layout_height="50dip"
android:background="#00ff00"
android:gravity="center"
android:text="@string/str_textview_title"
android:textSize="30sp" />
<com.example.pullrefreshlayout.PullRefreshLayout
android:id="@+id/layout_pull_refresh"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/textview_title" >
<ListView
android:id="@+id/listview_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
</com.example.pullrefreshlayout.PullRefreshLayout>
</RelativeLayout>
This is my ViewGroup , it's a PullRefreshLayou.
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i(TAG, "onInterceptTouchEvent action is: " + ev.getAction());
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchEventY = ev.getY();
mTouchEventX = ev.getX();
if (mHeaderView.getBottom() <= 0) {
return false;
} else {
if (mState == STATE_REFRESHING) {
return false;
} else {
return true;
}
}
case MotionEvent.ACTION_MOVE:
double moveDistanceY = ev.getY() - mTouchEventY;
double moveDistanceX = ev.getX() - mTouchEventX;
mTouchEventX = ev.getX();
mTouchEventY = ev.getY();
if (Math.abs(moveDistanceY) < 2 * Math.abs(moveDistanceX)) {
Log.d(TAG, "moveDistanceY < 2 * moveDistanceX");
return false;
}
Log.i(TAG, "move distance is :" + moveDistanceY);
if (isRefreshReady() && moveDistanceY > 3) {
// 判断ContentView在顶部,而且有下拉的操作,moveDistance还可调大
return true;
}
if (mHeaderView.getBottom() <= 0) {
return false;
} else {
return true;
}
default:
break;
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i(TAG, "onTouchEvent action is :" + event.getAction());
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
int moveDistance = (int) (event.getY() - mTouchEventY);
Log.i(TAG, "move distance is :" + moveDistance);
if (moveDistance < 0) {
moveDistance = moveDistance > -mHeaderView.getBottom() ? moveDistance
: -mHeaderView.getBottom();
}
mHeaderView.offsetTopAndBottom(moveDistance);
mContentView.offsetTopAndBottom(moveDistance);
invalidate();
int headerViewTop = mHeaderView.getTop();
if (headerViewTop >= 0 && mHeaderViewTop < 0
&& mState != STATE_REFRESHING) {
mHeaderView.startUpAnimation();
mHeaderView.onReleaseToRefresh(mRefreshTime);
mState = STATE_RELEASE_TO_REFRESH;
}
if (headerViewTop < 0 && mHeaderViewTop >= 0
&& mState != STATE_REFRESHING) {
mHeaderView.startDownAnimation();
mHeaderView.onPullToRefresh(mRefreshTime);
mState = STATE_PULL_TO_REFRESH;
}
mHeaderViewTop = headerViewTop;
mTouchEventY = event.getY();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (mHeaderView.getTop() >= 0) {
// 刷新
if (mState != STATE_REFRESHING) {
if (null != mPullRefreshListener) {
mPullRefreshListener.onRefresh();
}
mState = STATE_REFRESHING;
mHeaderView.onRefresh(mRefreshTime);
}
scrollToRefresh();
} else {
// 不刷新
if (mHeaderView.getTop() > -mHeaderViewHeight
&& mState != STATE_REFRESHING) {
mState = STATE_DEFAULT;
scrollToClose();
}
}
break;
default:
break;
}
return false;
}
OK.