Scroller
一个特例:
**点击Button后可能View没有移动,要关闭硬件加速,这段代码中int detalX = (int) (event.getX() - downX)要更正。
1 //执行beginScroll() 方法,第一个子View将会滑动到制定位置 2 //若用手指在MyViewGroup上滑动,子View根据手指滑动的距离来滑动相应的距离 3 //以为scrollTo , scrollBy 移动的是子View,所以在第一个子View上面包裹了一个 4 //父View Linearlayout,以便执行scrollTo 的时候不是将第一个子view里面的内容移动,而是 5 //将第一个子View进行移动 6 public class MyViewGroup extends LinearLayout { 7 8 private boolean s1 = true; 9 Scroller scroller = null; 10 private int downX, downY; 11 private View oneView; 12 13 public MyViewGroup(Context context, AttributeSet attrs) { 14 super(context, attrs); 15 scroller = new Scroller(context); 16 setOrientation(LinearLayout.VERTICAL); 17 } 18 19 /** 20 * onTouch , invalidate(), postInvalidate()都会触发computeScroll()方法 21 * Scroller的startScroll要执行出动画效果是要依靠computeScroll()方法的, 22 * 在该方法中调用Scroller.computeScrollOffset()来判断Scroller滑动完成没有 23 * 若没有滑动完成继续执行computeScroll(),在computeScroll()执行postInvalidate() 24 * 来循环调用computeScroll(),就形成了滑动动画效果了。 25 * 说白了Scroller只是记录了滑动信息,并不是它执行了滑动,正真的滑动效果是在computeScroll()执行的 26 * ,通过scroller.getCurrX()来获取当前滑动的值,用这个值来进行自己想达到的效果 27 */ 28 @Override 29 public void computeScroll() { 30 31 if (scroller.computeScrollOffset()) { 32 oneView.scrollTo(scroller.getCurrX(), 0); 33 postInvalidate(); 34 } 35 36 } 37 38 @Override 39 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 40 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 41 oneView = getChildAt(0); 42 } 43 44 public void beginScroll() { 45 if (!s1) { 46 scroller.startScroll(0, 0, 0, 0, 1000); 47 s1 = true; 48 } else { 49 scroller.startScroll(0, 0, -500, 0, 1000); 50 s1 = false; 51 } 52 postInvalidate(); 53 54 } 55 56 @Override 57 public boolean onTouchEvent(MotionEvent event) { 58 59 switch (event.getAction()) { 60 case MotionEvent.ACTION_DOWN: 61 System.out.println("MotionEvent.ACTION_DOWN"); 62 requestDisallowInterceptTouchEvent(true); 63 downX = (int) event.getX(); 64 downY = (int) event.getY(); 65 return true; 66 case MotionEvent.ACTION_MOVE: 67 System.out.println("MotionEvent.ACTION_MOVE"); 68 int detalX = (int) (event.getY() - downY); 69 oneView.scrollTo(detalX, 0); 70 break; 71 case MotionEvent.ACTION_UP: 72 System.out.println("当会不会执行"); 73 break; 74 } 75 76 // 将事件交给自定义的MyViewGroup处理 , 77 // 如果返回false或者super.onTouch(event)则直接返回到顶端View去了 78 // 自定义的MyViewGroup的后续事件也就不会执行了. 79 return super.onTouchEvent(event); 80 } 81 }