博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android自定义控件(二)——有弹性的ScrollView
阅读量:6054 次
发布时间:2019-06-20

本文共 2803 字,大约阅读时间需要 9 分钟。

hot3.png

实现了当手指滑动到ScrollView的顶部、底部时,

可以继续的向上、向下拉伸。当释放手指的时候,向上、下弹回。

效果如图所示:

主要代码:

public class ElasticScrollView extends ScrollView {	private View inner;	private float y;	private Rect normal = new Rect();	private boolean animationFinish = true;	public ElasticScrollView(Context context) {		super(context);	}	public ElasticScrollView(Context context, AttributeSet attrs) {		super(context, attrs);	}	@Override	protected void onFinishInflate() {		if (getChildCount() > 0) {			inner = getChildAt(0);		}	}		@Override	public boolean onInterceptTouchEvent(MotionEvent ev) {		return super.onInterceptTouchEvent(ev);	}	@Override	public boolean onTouchEvent(MotionEvent ev) {		if (inner == null) {			return super.onTouchEvent(ev);		} else {			commOnTouchEvent(ev);		}		return super.onTouchEvent(ev);	}	public void commOnTouchEvent(MotionEvent ev) {		if (animationFinish) {			int action = ev.getAction();			switch (action) {			case MotionEvent.ACTION_DOWN://				System.out.println("ACTION_DOWN");				y = ev.getY();				super.onTouchEvent(ev);				break;			case MotionEvent.ACTION_UP://				System.out.println("ACTION_UP");				y = 0;				if (isNeedAnimation()) {					animation();				}				super.onTouchEvent(ev);				break;			case MotionEvent.ACTION_MOVE://				System.out.println("ACTION_MOVE");				final float preY = y == 0 ? ev.getY() : 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 / 2, inner.getRight(), inner.getBottom() - deltaY / 2);				} else {					super.onTouchEvent(ev);				}				break;			default:				break;			}		}	}	// 开启动画移动	public void animation() {		// 开启移动动画		TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop());		ta.setDuration(200);		ta.setAnimationListener(new AnimationListener() {			@Override			public void onAnimationStart(Animation animation) {				animationFinish = false;			}			@Override			public void onAnimationRepeat(Animation animation) {			}			@Override			public void onAnimationEnd(Animation animation) {				inner.clearAnimation();				// 设置回到正常的布局位置				inner.layout(normal.left, normal.top, normal.right, normal.bottom);				normal.setEmpty();				animationFinish = true;			}		});		inner.startAnimation(ta);	}	// 是否需要开启动画	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;	}}

转载于:https://my.oschina.net/yolinfeng/blog/464646

你可能感兴趣的文章
详述iOS国际化
查看>>
spring配置文件中属性mappingLocations、mappingDirectoryLocations
查看>>
Oracle超出最大连接数问题及解决
查看>>
logstash_agent.conf 语法注意事项
查看>>
EasyUI DataGrid定制默认属性名称
查看>>
小程序三:视图层之WXML
查看>>
Android Studio 使用教程
查看>>
awk 内置函数列表
查看>>
Tcl与Design Compiler (十)——其他的时序约束选项(一)
查看>>
修复eclipse build-helper-maven-plugin 异常
查看>>
【C#】图像的变形/变换/扭曲。用Emgu或YLScsFreeTransform(FreeImageTransformation)或MagickImage...
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
Identity Service - 解析微软微服务架构eShopOnContainers(二)
查看>>
让docker中的mysql启动时自动执行sql文件
查看>>
springboot开启access_log日志输出
查看>>
C#单例模式的三种写法
查看>>
MongoDB初探系列之四:MongoDB与Java共舞
查看>>
FPGA管脚约束
查看>>
代码直连指定ip的dubbo服务
查看>>
使用C#开发HTTP服务器系列之实现Get和Post
查看>>