自定義scrollview 回彈效果
前言
自定義scrollview 下拉回彈效果
效果圖
獲取內部控制元件
//獲取初始控制元件
@Override
protected void onFinishInflate() {
super.onFinishInflate();
//由於是scrollview 內部只能有一個控制元件
convertView = getChildAt(0);
}
記錄初始位置
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
//用rect記錄 scrollview的子控制元件的上下左右
originalRect.set(convertView.getLeft(), convertView.getTop(), convertView.getRight(), convertView.getBottom());
}
事件分發
//
@Override
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = (int) ev.getY();
startX = (int) ev.getX();
break;
case MotionEvent.ACTION_UP:
//還原位置,回彈動畫, 可以自己定於需要的動畫
TranslateAnimation animation = new TranslateAnimation(0, 0, convertView.getTop(), originalRect.top);
animation.setDuration(200);
convertView.setAnimation(animation);
convertView.layout(originalRect.left, originalRect.top, originalRect.right, originalRect.bottom);
break;
case MotionEvent.ACTION_MOVE:
int detalY = (int) (ev.getY() - startY);
int detalX = (int) (ev.getX() - startX);
if (Math.abs(detalX) < Math.abs(detalY)) {
//detalY 乘以0.2 使得很難的效果
convertView.layout(originalRect.left, (int) (originalRect.top + detalY * 0.2),
originalRect.right, (int) (originalRect.bottom + detalY * 0.2));
}
break;
}
return super.dispatchTouchEvent(ev);
}
end