GestureDetector.SimpleOnGestureListener中onScroll的参数e2.getX的问题
我在做一个图片浏览软件,做那种仿launcher桌面的滑动效果时,当滑动到两张图片各占了屏幕显示的一半的时候,就这样一直维持着的话,这两张图片总会有明显的颤动的bug,而图片的移动都是在GestureDetector.SimpleOnGestureListener中onScroll中根据滑动距离实现的。于是我来来查看GestureDetector.SimpleOnGestureListener中的onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) 。就在我手指一直在屏幕上不移动(或有极小颤动)的动情况下,我发现e2.getX的值变化很大。我把log亮出来给大家看看:
02-22 19:48:46.853: INFO/offset(19060): e1.getX:277.16916
02-22 19:48:46.853: INFO/offset(19060): e2.getX:196.0465
02-22 19:48:46.853: INFO/offset(19060): mCurrentOffset:0.0
02-22 19:48:46.853: INFO/offset(19060): currentScrollDelta:81.122665
02-22 19:48:46.853: INFO/offset(19060): scrollOffset:81
02-22 19:48:46.853: INFO/offset(19060): -----------------------------------
02-22 19:48:46.881: INFO/offset(19060): e1.getX:277.16916
02-22 19:48:46.881: INFO/offset(19060): e2.getX:120.147385
02-22 19:48:46.881: INFO/offset(19060): mCurrentOffset:0.0
02-22 19:48:46.881: INFO/offset(19060): currentScrollDelta:157.02177
02-22 19:48:46.881: INFO/offset(19060): scrollOffset:157
02-22 19:48:46.881: INFO/offset(19060): -----------------------------------
02-22 19:48:46.891: INFO/offset(19060): e1.getX:277.16916
02-22 19:48:46.891: INFO/offset(19060): e2.getX:197.41345
02-22 19:48:46.891: INFO/offset(19060): mCurrentOffset:0.0
02-22 19:48:46.891: INFO/offset(19060): currentScrollDelta:79.75571
02-22 19:48:46.891: INFO/offset(19060): scrollOffset:80
02-22 19:48:46.891: INFO/offset(19060): -----------------
.....
基本上e2.getX就是在120与197之间切换,于是我就搞不明白了,e2.getX为啥总是 这样改变呢?我的手指又没怎么动啊?
一些关键代码帖上来:
我是抄别人例子的,代码仓库中一个叫photostore的图片浏览器的例子 onScroll代码如下:
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
if (e2.getAction() == MotionEvent.ACTION_MOVE) {
if (mIsDragging == false) {
// Stop animation
mIsTouched = true;
// Reconfigure scroll
mIsDragging = true;
mFlingDirection = 0;
mScrollTimestamp = System.currentTimeMillis();
mCurrentOffset = mViews[mCurrentViewNumber]
.getCurrentOffset();
}
// mA是恒的是250
float maxVelocity = mGalleryWidth
/ (mAnimationDuration / 1000.0f);
// 连续滑动时间
long timestampDelta = System.currentTimeMillis()
- mScrollTimestamp;
float maxScrollDelta = maxVelocity * (timestampDelta / 1000.0f);
float currentScrollDelta = e1.getX() - e2.getX();
if (currentScrollDelta < maxScrollDelta * -1)
currentScrollDelta = maxScrollDelta * -1;
if (currentScrollDelta > maxScrollDelta)
currentScrollDelta = maxScrollDelta;
int scrollOffset = Math.round(mCurrentOffset
+ currentScrollDelta);
// We can't scroll more than the width of our own frame layout
if (scrollOffset >= mGalleryWidth)
scrollOffset = mGalleryWidth;
if (scrollOffset <= mGalleryWidth * -1)
scrollOffset = mGalleryWidth * -1;
mViews[0].setOffset(scrollOffset, 0, mCurrentViewNumber);
mViews[1].setOffset(scrollOffset, 0, mCurrentViewNumber);
mViews[2].setOffset(scrollOffset, 0, mCurrentViewNumber);
}
return false;
}
public void setOffset(int xOffset, int yOffset, int relativeViewNumber) {
// Scroll the target view relative to its own position relative to
// currently displayed view
mInternalLayout.scrollTo(
getViewOffset(mViewNumber, relativeViewNumber) + xOffset,
yOffset);
}
需要说的是,我的onGestureListener是这样调用的:
下边这个onTouch是一个叫ZoomImageView的自定义控件,实现双手触摸改变图片大小
public boolean onTouch(View v, MotionEvent event) {
final int action = event.getAction();
int pointCount = event.getPointerCount();
if (pointCount == 1) {
//fg.就是上边GestureDectector来监听的一个自定义控件叫myGallery吧
fg.onTouchEvent(event);
final float y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
mY = y;
break;
case MotionEvent.ACTION_MOVE:
final float dy = (y - mY) / v.getHeight();
mState.setPanY(mState.getPanY() - dy);
mState.notifyObservers();
mY = y;
break;
}
}
if (pointCount == 2) {
final float x0 = event.getX(event.getPointerId(0));
final float y0 = event.getY(event.getPointerId(0));
final float x1 = event.getX(event.getPointerId(1));
final float y1 = event.getY(event.getPointerId(1));
final float gap = getGap(x0, x1, y0, y1);
switch (action) {
case MotionEvent.ACTION_POINTER_2_DOWN:
case MotionEvent.ACTION_POINTER_1_DOWN:
mGap = gap;
break;
case MotionEvent.ACTION_POINTER_1_UP:
mX = x1;
mY = y1;
break;
case MotionEvent.ACTION_POINTER_2_UP:
mX = x0;
mY = y0;
break;
case MotionEvent.ACTION_MOVE: {
final float dgap = (gap - mGap) / mGap;
// Log.d("Gap", String.valueOf(dgap));
Log.d("Gap", String.valueOf((float) Math.pow(20, dgap)));
mState.setZoom(mState.getZoom() * (float) Math.pow(5, dgap));
mState.notifyObservers();
mGap = gap;
break;
}
}
}
return true;
}
我所仿的demo 并不是在myGallery中放入zoomImageView进行滑动而是放入ImageView的,就没e2.getX 大幅改变的问题~因为ZoomImageView 是先获得touch的,只有在单点触摸时才会让其响应myGallery的onGestureListener ,我怀疑可能是这里的问题,但我还是找不到~~
谢啦~ --------------------编程问答-------------------- 请问lz解决这个问题了吗。。我也遇到了,求指点 --------------------编程问答-------------------- 你查看一下多指触摸的问题
补充:移动开发 , Android