GestureDetector.SimpleOnGestureListener中onScroll的参数e2.getX的问题

ZYLab 2012-02-23 12:01:02
我在做一个图片浏览软件,做那种仿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 ,我怀疑可能是这里的问题,但我还是找不到~~
谢啦~
...全文
610 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
j_f0001 2012-06-02
  • 打赏
  • 举报
回复
你查看一下多指触摸的问题
  • 打赏
  • 举报
回复
请问lz解决这个问题了吗。。我也遇到了,求指点

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧