反弹效果主要是自定义scrollview
0去掉滑动到底部和顶部的弧线阴影效果,在xml文件添加如下语句
android:fadingEdge="none" android:overScrollMode="never"
1.首先定义2个变量
private View sonView ;--住视图 private Rect normal = new Rect();--上方弹簧用的举行
需要使用下面的个方法
@Override//滑动结束的时候调用--用于顶部的反弹效果 protected void onFinishInflate() { if (getChildCount() > 0) { sonView = getChildAt(0); } }
这个是加载位移动画的方法:
这里需要说明以下
1.通过Rect来判断是否可以加载
normal.setEmpty();
2位移动画有一个bug,就是图片是位移了,但是view的位置还是在原来的地方(imooc里说用ObjectAnimator.ofFloat(imageView,"transLationY",0f,100f).setDuring(200).start()属性动画的方法),所以位移动画需要通过layout重新设置终止的最新位置
public void animation() { // 开启移动动画 TranslateAnimation ta = new TranslateAnimation(0, 0, sonView.getTop(), normal.top); ta.setDuration(200); sonView.startAnimation(ta); // 设置回到正常的布局位置 sonView.layout(normal.left, normal.top, normal.right, normal.bottom); normal.setEmpty(); }
3.在touchevent里面处理事件
down:记录下初始位置
y = ev.getY();
up:回弹动画
if (isNeedAnimation()) {
// Log.v("mlguitar", "will up and animation");
animation();
}
move:rect的功能类似于辅助存储sonview视图
final float preY = y;
float nowY = ev.getY();
/**
* size=4 表示 拖动的距离为屏幕的高度的1/4
*/
int deltaY = (int) (preY - nowY) / size;
// 滚动
// scrollBy(0, deltaY);
y = nowY;
// 当滚动到最上或者最下时就不会再滚动,这时移动布局
if (isNeedMove()) {
if (normal.isEmpty()) {
// 保存正常的布局位置
normal.set(sonView.getLeft(), sonView.getTop(),
sonView.getRight(), sonView.getBottom());
return;
}
int yy = sonView.getTop() - deltaY;
// 移动布局
sonView.layout(sonView.getLeft(), yy, sonView.getRight(),
sonView.getBottom() - deltaY);
}
4下面是2个辅助的方法
// 是否需要开启动画 public boolean isNeedAnimation() { return !normal.isEmpty(); } // 是否需要移动布局 public boolean isNeedMove() { int offset = sonView.getMeasuredHeight() - getHeight(); int scrollY = getScrollY(); if (scrollY == 0 || scrollY == offset) { return true; } return false; }