Android上拖动view的阻尼edgeeffect效果 - 工作经验论坛 - 经验分享 - 小轻秀场

Android上拖动view的阻尼edgeeffect效果

1. 在xml布局文件中定义可滚动的View,例如ScrollView、RecyclerView等。

2. 在Java代码中获取该View,并为其设置OnTouchListener监听器,在触摸事件中处理滑动逻辑。

3. 在OnTouchListener监听器的onTouch()方法中,根据手指移动距离计算出需要滚动的距离,并调用View的scrollBy()方法进行滚动。

4. 为了模拟阻尼效果,在手指抬起时需要判断是否到达边缘位置,并使用EdgeEffect类来模拟反弹效果。具体实现可以参考以下示例代码:

java
final EdgeEffect mEdgeEffectTop = new EdgeEffect(context);
final EdgeEffect mEdgeEffectBottom = new EdgeEffect(context);

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
// 记录按下位置等信息
break;
case MotionEvent.ACTION_MOVE:
// 根据手指移动距离计算需要滚动的距离
int dy = (int) (mLastY - event.getY());
if (dy > 0 && canScrollUp()) { // 向上滑并且还能继续向上滑
scrollBy(0, dy);
invalidate();
} else if (dy < 0 && canScrollDown()) { // 向下滑并且还能继续向下滑
scrollBy(0, dy);
invalidate();
}

// 记录最后一次触摸点坐标
mLastY = event.getY();

break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (!mScroller.isFinished()) {
mScroller.abortAnimation();
}

int finalY = getScrollY();
if (finalY < 0) {
mEdgeEffectTop.onPull(Math.abs(finalY) / getHeight());
postInvalidateOnAnimation();
} else if (finalY > getMaxScrollY()) {
mEdgeEffectBottom.onPull(Math.abs(finalY - getMaxScrollY()) / getHeight());
postInvalidateOnAnimation();
}

break;
}

return true;
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

if (!mEdgeEffectTop.isFinished()) {
final int restoreCount = canvas.save();
canvas.translate(getPaddingLeft(), Math.min(0, getScrollY()));
mEdgeEffectTop.setSize(getWidth() - getPaddingLeft() - getPaddingRight(), getHeight());
if(mEdgeEffectTop.draw(canvas)){
postInvalidateOnAnimation();
}
canvas.restoreToCount(restoreCount);
}

if (!mEdgeEffectBottom.isFinished()) {
final int restoreCount = canvas.save();
canvas.translate(-getWidth() + getPaddingRight(), Math.max(getMaxScrollY(), getScrollY()));
canvas.rotate(180, getWidth() - getPaddingRight(), 0);
mEdgeEffecBottom.setSize(getWidth() - getPaddingLeft() - getPaddingRight(), getHeight());
if(mEedgeEffecBottom.draw(canvas)){
postInvalidateOnAnimation();
}
canvas.restoreToCount(restoreCount);
}
}

其中,getMaxScrollY是获取View最大可垂直方向偏移量;canScrollUp和canSrollDown是判断当前是否还能向上或者向下进行有效的垂直方向位移。

请登录后发表评论

    没有回复内容