Android ScrollView实现反弹效果的实例
AndroidScrollView实现反弹效果
自定义ScrollView控件:
/**
*ScrollView反弹效果的实现
*/
publicclassBounceScrollViewextendsScrollView{
privateViewinner;//孩子View
privatefloaty;//点击时y坐标
privateRectnormal=newRect();//矩形(这里只是个形式,只是用于判断是否需要动画.)
privatebooleanisCount=false;//是否开始计算
publicBounceScrollView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
/***
*根据XML生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后.即使子类覆盖了onFinishInflate
*方法,也应该调用父类的方法,使该方法得以执行.
*/
@Override
protectedvoidonFinishInflate(){
if(getChildCount()>0){
inner=getChildAt(0);
}
}
/***
*监听touch
*/
@Override
publicbooleanonTouchEvent(MotionEventev){
if(inner!=null){
commOnTouchEvent(ev);
}
returnsuper.onTouchEvent(ev);
}
/***
*触摸事件
*
*@paramev
*/
publicvoidcommOnTouchEvent(MotionEventev){
intaction=ev.getAction();
switch(action){
caseMotionEvent.ACTION_DOWN:
break;
caseMotionEvent.ACTION_UP:
//手指松开.
if(isNeedAnimation()){
animation();
isCount=false;
}
break;
/***
*排除出第一次移动计算,因为第一次无法得知y坐标,在MotionEvent.ACTION_DOWN中获取不到,
*因为此时是MyScrollView的touch事件传递到到了LIstView的孩子item上面.所以从第二次计算开始.
*然而我们也要进行初始化,就是第一次移动的时候让滑动距离归0.之后记录准确了就正常执行.
*/
caseMotionEvent.ACTION_MOVE:
finalfloatpreY=y;//按下时的y坐标
floatnowY=ev.getY();//时时y坐标
intdeltaY=(int)(preY-nowY);//滑动距离
if(!isCount){
deltaY=0;//在这里要归0.
}
y=nowY;
//当滚动到最上或者最下时就不会再滚动,这时移动布局
if(isNeedMove()){
//初始化头部矩形
if(normal.isEmpty()){
//保存正常的布局位置
normal.set(inner.getLeft(),inner.getTop(),
inner.getRight(),inner.getBottom());
}
Log.e("jj","矩形:"+inner.getLeft()+","+inner.getTop()
+","+inner.getRight()+","+inner.getBottom());
//移动布局
inner.layout(inner.getLeft(),inner.getTop()-deltaY/2,
inner.getRight(),inner.getBottom()-deltaY/2);
}
isCount=true;
break;
default:
break;
}
}
/***
*回缩动画
*/
publicvoidanimation(){
//开启移动动画
TranslateAnimationta=newTranslateAnimation(0,0,inner.getTop(),
normal.top);
ta.setDuration(200);
inner.startAnimation(ta);
//设置回到正常的布局位置
inner.layout(normal.left,normal.top,normal.right,normal.bottom);
Log.e("jj","回归:"+normal.left+","+normal.top+","+normal.right
+","+normal.bottom);
normal.setEmpty();
}
//是否需要开启动画
publicbooleanisNeedAnimation(){
return!normal.isEmpty();
}
/***
*是否需要移动布局inner.getMeasuredHeight():获取的是控件的总高度
*
*getHeight():获取的是屏幕的高度
*
*@return
*/
publicbooleanisNeedMove(){
intoffset=inner.getMeasuredHeight()-getHeight();
intscrollY=getScrollY();
Log.e("jj","scrolly="+scrollY);
//0是顶部,后面那个是底部
if(scrollY==0||scrollY==offset){
returntrue;
}
returnfalse;
}
}
实现反弹效果:
以上就是AndroidScrollView实现反弹效果的实例的讲解,本站关于Android开发的文章还有很多,欢迎大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!