android 弹性scollview 多功能
2016-04-05 11:33
507 查看
import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.TranslateAnimation; import android.widget.ScrollView; public class ElasticityScrollview extends ScrollView { private static final String TAG = "ElasticScrollView"; private static final float MOVE_FACTOR = 0.5f; private static final int ANIM_TIME = 300; private View contentView; private float startY; public Rect originalRect = new Rect(); private boolean canPullDown = false; private boolean canPullUp = false; private boolean isMoved = false; public ElasticityScrollview(Context context) { super(context); } public ElasticityScrollview(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); if (getChildCount() > 0) { contentView = getChildAt(0); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (contentView == null) return; originalRect.set(contentView.getLeft(), contentView.getTop(), contentView .getRight(), contentView.getBottom()); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (contentView == null) { return super.dispatchTouchEvent(ev); } int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: canPullDown = isCanPullDown(); canPullUp = isCanPullUp(); startY = ev.getY(); break; case MotionEvent.ACTION_UP: if (!isMoved) break; TranslateAnimation anim = null; listener.scollOffset(code,0); if(listener!=null&&Math.abs(offset )>minMoveSize){ if(code!=Mode_None){ listener.onElasticity(code); } } anim = new TranslateAnimation(0, 0, contentView.getTop(), originalRect.top); anim.setDuration(ANIM_TIME); contentView.startAnimation(anim); contentView.layout(originalRect.left, originalRect.top, originalRect.right, originalRect.bottom); canPullDown = false; canPullUp = false; isMoved = false; code=0; offset=0; break; case MotionEvent.ACTION_MOVE: if (!canPullDown && !canPullUp) { startY = ev.getY(); canPullDown = isCanPullDown(); canPullUp = isCanPullUp(); break; } float nowY = ev.getY(); int deltaY = (int) (nowY - startY); boolean shouldMove = (canPullDown && deltaY > 0) || (canPullUp && deltaY < 0) || (canPullUp && canPullDown); if (shouldMove) { offset = (int) (deltaY * MOVE_FACTOR); contentView.layout(originalRect.left, originalRect.top + offset, originalRect.right, originalRect.bottom + offset); isMoved = true; code =offset>0?Mode_Top:Mode_Bottom; listener.scollOffset(code,offset); } break; default: break; } return super.dispatchTouchEvent(ev); } /** * 判断是否滚动到顶部 */ private boolean isCanPullDown() { if(!isPullDownEnable)return false; return getScrollY() == 0 || contentView.getHeight() < getHeight() + getScrollY(); } /** * 判断是否滚动到底部 */ private boolean isCanPullUp() { if(!isPullUpEnable)return false; return contentView.getHeight() <= getHeight() + getScrollY(); } private boolean isPullDownEnable=true; private boolean isPullUpEnable=true; private int code; private int offset; private OnElasticityScrollViewListener listener; private int minMoveSize=150; public static final int Mode_None=0, Mode_Top = 1,//下拉 Mode_Bottom = 2;//上拉 public void setOnElasticityScrollViewListener(OnElasticityScrollViewListener listener) { this.listener = listener; } public void setMoveMinSize(int moveSize){ minMoveSize=moveSize>minMoveSize?moveSize:minMoveSize; } public interface OnElasticityScrollViewListener { public void onElasticity(int code);//超出范围才回调 public void scollOffset(int code,int offset);//滑动时,滑动大小 } public void setIsPullDownEnable(boolean isPullDownEnable) { this.isPullDownEnable = isPullDownEnable; } public void setIsPullUpEnable(boolean isPullUpEnable) { this.isPullUpEnable = isPullUpEnable; } } ////////////////////////////////////////////////////////////////////////////////////// 使用示例
et_scrollview.setIsPullUpEnable(false); et_scrollview.setOnElasticityScrollViewListener(new ElasticityScrollview.OnElasticityScrollViewListener() { @Override public void onElasticity(int code) { switch (code) { case ElasticityScrollview.Mode_Top: pDetailsCall.TurnToGoodsWithAnimation(); break; case ElasticityScrollview.Mode_Bottom: break; } } @Override public void scollOffset(int code,int offset) { // if(code==ElasticityScrollview.Mode_Top){ // rl_top_pull.setLayoutParams(new AutoLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,(int) AutoLayout.getInstance().designToAvailable(78)+offset)); // } } });
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories