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开发的文章还有很多,欢迎大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!