弹性滑动布局ElasticText
思路
初始化Scroller类,然后在OnTouchEvent里判断按下和抬起事件
- 按下时,利用startScroll方法让它上弹
松开时,同样用startScroll方法让它滑下
因为getScrollX()或者getScrollY()方法都是得到控件随时随地的x,y坐标.所以滚动时如果直接像下面这样写就会报错
`mScroller.startScroll(getScrollX(), getScrollY(), 0, 200, 1000);
mScroller.startScroll(getScrollX(), getScrollY(), 0, -200, 1000);`
当你调用startScroll开始滑动时,invalidate();
然后它会调用draw()方法,触发computeScroll()方法,我们在此方法内判断,如果动画没结束,就滑动咯
`@Override public void computeScroll() { if(mScroller.computeScrollOffset()){//返回true 表示动画还没有结束 scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); postInvalidate(); } super.computeScroll(); }
`
写一个smotthScrollTo方法让文字向上偏移多少,up动作时就向下偏移多少
`private void smoothScrollTo(int destX, int destY) { int scrollX = getScrollX(); int detlaX = destX - scrollX; int scrollY = getScrollY(); System.out.println(getScaleY()+"======"); int detlaY = destY - scrollY; mScroller.startScroll(scrollX,scrollY,detlaX,detlaY,1000); }
`
- 注意:startScroll()方法里第三四个参数是指偏移量,具体可看源代码
最后 用这两行代码替代在上述第一点中的那两行代码
`smoothScrollTo(0,200); smoothScrollTo(0,0);
`
x轴坐标一直是不变的,y轴是滚动了多少就回滚多少
getScrollX()坐标为0,不管在哪,首先都以它的初始状态下left为起点getScrollX(),向左就为夫的,向右即为正的
最后附上布局
`<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center" android:layout_width="match_parent" android:layout_height="match_parent"> <custom.ElasticText android:text="Spark" android:textSize="34sp" android:gravity="center" android:layout_width="wrap_content" android:layout_height="match_parent" /> </LinearLayout>`