当前位置:编程学习 > wap >>

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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,