前言
今天上课太过无聊,就写了个自定义view-ScrollView,比较简单。
代码
public class MyScrollView extends ScrollView {
// 用来记录位置信息&判断是否需要执行动画
private Rect rect = new Rect() ;
// 表示可以拖动屏幕的部分
private int count = 5 ;
private int ANIMATION_TIME = 500 ;
private float startY;
private float endY;
private float deltaY;
private View view;
public MyScrollView(Context context) {
this(context,null);
}
public MyScrollView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
view = getChildAt(0);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(view == null ){
return super.onTouchEvent(ev);
}else{
handleEvent(ev);
}
return super.onTouchEvent(ev);
}
private void handleEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
endY = ev.getRawY();
deltaY = (endY - startY) / count;
if(rect.isEmpty()){
//给矩形设置值
rect.set(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()) ;
return ;
}
//设置移动,将顶部 - 偏移量
int tt = (int) (view.getTop() - deltaY) ;
int bb= (int) (view.getBottom()-deltaY);
view.layout(view.getLeft(), tt, view.getRight(),bb) ;
//将end赋值给start
startY = endY ;
break;
case MotionEvent.ACTION_UP:
//判断动画是否需要执行
if(isNeedAnimation()){//需要动画
//执行动画
startAnimation() ;
}
break;
}
}
// 开启动画
private void startAnimation() {
System.out.println("执行动画");
TranslateAnimation animation = new TranslateAnimation(0, 0, view.getTop(), rect.top) ;
animation.setDuration(ANIMATION_TIME) ;
view.layout(rect.left, rect.top, rect.right, rect.bottom);
view.startAnimation(animation) ;
//重置矩形
rect.setEmpty();
}
// 判断动画是否执行
private boolean isNeedAnimation() {
return !rect.isEmpty();
}
}
代码比较简单,注释也已经写清楚了。不上源码了