Scroller

一个特例:

 **点击Button后可能View没有移动,要关闭硬件加速,这段代码中int detalX = (int) (event.getX() - downX)要更正。

demo下载

 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 }
View Code

相关文章: