这个是实现上下滚动的。。左右的同理,把y换成x就可以了
public class MyScrollView extends ScrollView {
private View inner;
private float y;
private Rect normal = new Rect();;
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
protected void onFinishInflate() {
if(getChildCount()>0){
inner=getChildAt(0);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(inner==null){
return super.onTouchEvent(ev);
}else
{
commOnTouchEvent(ev);
}
return super.onTouchEvent(ev);
}
private void commOnTouchEvent(MotionEvent ev) {
int action=ev.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
y=ev.getY();
break;
case MotionEvent.ACTION_UP:
if (isNeedAnimation())
{
animation();
}
break;
case MotionEvent.ACTION_MOVE:
final float preY=y;
float nowY=ev.getY();
int deltaY=(int) (preY-nowY);
scrollBy(0, deltaY);//滚动
y=nowY;
//当滚动到最上或者最下时就不会再滚动,这时移动布局
if (isNeedMove())
{
if (normal.isEmpty())
{
// 保存正常的布局位置
normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());
}
// 移动布局
inner.layout(inner.getLeft(), inner.getTop() - deltaY, inner.getRight(), inner.getBottom() - deltaY);
}
break;
default:
break;
}
}
// 开启动画移动
public void animation(){
// 开启移动动画,Top position of this view relative to its parent
TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), normal.top);
ta.setDuration(200);
inner.startAnimation(ta);
// 设置回到正常的布局位置
inner.layout(normal.left, normal.top, normal.right, normal.bottom);
normal.setEmpty();
}
// 是否需要开启动画
public boolean isNeedAnimation()
{
return !normal.isEmpty();
}
// 是否需要移动布局
public boolean isNeedMove()
{
int offset = inner.getMeasuredHeight() - getHeight();
int scrollY = getScrollY();
if (scrollY == 0 || scrollY == offset)
{
return true;
}
return false;
}
}