80,350
社区成员
发帖
与我相关
我的任务
分享
我是抄别人例子的,代码仓库中一个叫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);
}
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;
}