Closed t2314862168 closed 7 years ago
通过log打印找到解决办法了。。。 在https://github.com/Chanven/CommonPullToRefresh/blob/master/cptr/src/com/chanven/lib/cptr/indicator/PtrIndicator.java#L86 下面加一下代码:
/**
* 多点触控的时候需要获取上一次的位置
*
* @return 上一次的位置
*/
public PointF getPtLastMove() {
return mPtLastMove;
}
然后在https://github.com/Chanven/CommonPullToRefresh/blob/master/cptr/src/com/chanven/lib/cptr/PtrFrameLayout.java#L273 简单滴修改替换以下代码:
@Override
public boolean dispatchTouchEvent(MotionEvent e) {
if (!isEnabled() || mContent == null || mHeaderView == null) {
return dispatchTouchEventSupper(e);
}
// 这里是加的
dealMulTouchEvent(e);
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mPtrIndicator.onRelease();
if (mPtrIndicator.hasLeftStartPosition()) {
if (DEBUG) {
PtrCLog.d(LOG_TAG, "call onRelease when user release");
}
onRelease(false);
if (mPtrIndicator.hasMovedAfterPressedDown()) {
sendCancelEvent();
return true;
}
return dispatchTouchEventSupper(e);
} else {
return dispatchTouchEventSupper(e);
}
case MotionEvent.ACTION_DOWN:
mHasSendCancelEvent = false;
mPtrIndicator.onPressDown(e.getX(), e.getY());
mScrollChecker.abortIfWorking();
mPreventForHorizontal = false;
// The cancel event will be sent once the position is moved.
// So let the event pass to children.
// fix #93, #102
dispatchTouchEventSupper(e);
return true;
case MotionEvent.ACTION_MOVE:
mLastMoveEvent = e;
final int pointerIndex = MotionEventCompat.findPointerIndex(e, mActivePointerId);
final float x = MotionEventCompat.getX(e, pointerIndex);
final float y = MotionEventCompat.getY(e, pointerIndex);
mPtrIndicator.onMove(x, y);
if (pointUpFlag) {
mPtrIndicator.onMove(mPtrIndicator.getPtLastMove().x, mPtrIndicator.getPtLastMove().y);
pointUpFlag = false;
}
float offsetX = mPtrIndicator.getOffsetX();
float offsetY = mPtrIndicator.getOffsetY();
if (mDisableWhenHorizontalMove && !mPreventForHorizontal && (Math.abs(offsetX) > mPagingTouchSlop && Math.abs(offsetX) > Math.abs(offsetY))) {
if (mPtrIndicator.isInStartPosition()) {
mPreventForHorizontal = true;
}
}
if (mPreventForHorizontal) {
return dispatchTouchEventSupper(e);
}
boolean moveDown = offsetY > 0;
boolean moveUp = !moveDown;
boolean canMoveUp = mPtrIndicator.hasLeftStartPosition();
if (DEBUG) {
boolean canMoveDown = mPtrHandler != null && mPtrHandler.checkCanDoRefresh(this, mContent, mHeaderView);
PtrCLog.v(LOG_TAG, "ACTION_MOVE: offsetY:%s, currentPos: %s, moveUp: %s, canMoveUp: %s, moveDown: %s: canMoveDown: %s", offsetY, mPtrIndicator.getCurrentPosY(), moveUp, canMoveUp, moveDown, canMoveDown);
}
// disable move when header not reach top
if (moveDown && mPtrHandler != null && !mPtrHandler.checkCanDoRefresh(this, mContent, mHeaderView)) {
return dispatchTouchEventSupper(e);
}
if ((moveUp && canMoveUp) || moveDown) {
movePos(offsetY);
return true;
}
}
return dispatchTouchEventSupper(e);
}
/**
* http://blog.sina.com.cn/s/blog_8a86f4dd0102whbj.html
* https://github.com/liaoinstan/SpringView/blob/master/library/src/main/java/com/liaoinstan/springview/widget/SpringView.java
* 处理多点触控的情况,准确地计算Y坐标和移动距离dy
* 同时兼容单点触控的情况
*/
private int mActivePointerId = MotionEvent.INVALID_POINTER_ID;
/**
* 这里由于滑动过快会导致ACTION_POINTER_UP之后还会调用ACTION_MOVE,所以这里用一个标志位,然后在ACTION_MOVE里面去处理
*/
private boolean pointUpFlag;
public void dealMulTouchEvent(MotionEvent ev) {
final int action = MotionEventCompat.getActionMasked(ev);
switch (action) {
case MotionEvent.ACTION_DOWN: {
final int pointerIndex = MotionEventCompat.getActionIndex(ev);
final float x = MotionEventCompat.getX(ev, pointerIndex);
final float y = MotionEventCompat.getY(ev, pointerIndex);
mPtrIndicator.onPressDown(x, y);
mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
break;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mActivePointerId = MotionEvent.INVALID_POINTER_ID;
break;
case MotionEvent.ACTION_POINTER_DOWN: {
final int pointerIndex = MotionEventCompat.getActionIndex(ev);
final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
if (pointerId != mActivePointerId) {
final float x = MotionEventCompat.getX(ev, pointerIndex);
final float y = MotionEventCompat.getY(ev, pointerIndex);
mPtrIndicator.onPressDown(x, y);
mActivePointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
}
break;
}
case MotionEvent.ACTION_POINTER_UP: {
pointUpFlag = true;
final int pointerIndex = MotionEventCompat.getActionIndex(ev);
final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
if (pointerId == mActivePointerId) {
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
final float x = MotionEventCompat.getX(ev, pointerIndex);
final float y = MotionEventCompat.getY(ev, pointerIndex);
mPtrIndicator.onPressDown(x, y);
mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
}
break;
}
}
}
@Chanven 请问下想弄成类似qq那样可以多点连续下拉的问题 我参考其他库的做法在
PtrFrameLayout
里面添加了下面代码但是当2个在屏幕上面,一个手指滑动然后抬起,会出现位置忽然抖动的情况,请问下这个应该怎么解决呢?