android中实现view可以滑动的六种方法续篇(一)

承接上一篇,如果你没有读过前四章方法,可以点击下面的链接:

http://www.cnblogs.com/fuly550871915/p/4985053.html

下面开始讲第五中方法。

五、利用Scroller类实现滑动

(1)基础知识总结

为了便于下面的阅读代码,先来总结一下关于Scroller类的基础知识。利用Scroller类实现滑动,需要三个步骤:

步骤一:     初始化Scroller对象,即mScroller = new Scroller(context)步骤二:     重写computeScroll()方法,实现模拟滑动。可以复制下面的末模板代码:
public void computeScroll() {
            super.computeScroll();

            if(mScroller.computeScrollOffset())
            {
                ((View)getParent()).scrollTo(mScroller.getCurrX(),
                        mScroller.getCurrY());
            }

            invalidate();//必须要调用
        }
步骤三:     开启模拟过程,在合适的地方(一般都在move中)startScroll方法。它有两个重载方法如下:     startScroll(int startX,int startY, int dx,int dy,int duration)     startScroll(int startX,int startY,int dx,int dy)     方法中的参数无需多解释了,就是起始坐标与偏移量,还有完成偏移的时间而已。

需要说明的是:(1)computeScrollOffset方法用来判断是否完成了整个滑动,返回为true,则说明没有完成,否则则完成滑动。

(2)getCurrY以及getCurrX获得的是当前的滑动坐标。

(3)最后必须要用invalidate方法来刷新。因为computeScroll方法不会自动调用,是在draw方法中被调用的。所以

必须使用invalidate刷新,就会调用draw方法,自然就会调用computeScroll方法了。这样子就会实现循环调用。

(4)在startScroll中,偏移量跟使用scrollBy方法中的偏移量用法是一样的,即也必须填写你实际想要移动距离的相

反数。也就是你实际想让它偏移一个正值,这里就填写它相应的负值,如果想偏移一个负值,这里就填写相应的

正值!

(2)代码实践

有些东西还是需要在真正的代码中才能说的明白的。我们接着上一篇文章的代码继续编写。为了看清Scroller类是如何实现滑动的,我们

再次修改DragView的代码。这次修改的有些多。贴完整的代码出来。如下:

 1 package com.example.testdragview;
 2
 3 import android.content.Context;
 4 import android.util.AttributeSet;
 5 import android.view.MotionEvent;
 6 import android.view.View;
 7 import android.widget.Scroller;
 8
 9 public class DragView extends View{
10
11
12     private int lastX;
13     private int lastY;
14     private Scroller mScroller;
15
16     public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
17         super(context, attrs, defStyleAttr);
18
19         mScroller = new Scroller(context);
20     }
21
22     public DragView(Context context, AttributeSet attrs) {
23         super(context, attrs);
24         mScroller = new Scroller(context);
25     }
26
27     public DragView(Context context) {
28         super(context);
29         mScroller = new Scroller(context);
30     }
31
32
33
34     public boolean onTouchEvent(MotionEvent event) {
35
36         //获取到手指处的横坐标和纵坐标
37         int x = (int) event.getX();
38         int y = (int) event.getY();
39
40
41         switch(event.getAction())
42         {
43         case MotionEvent.ACTION_DOWN:
44
45             lastX = x;
46             lastY = y;
47             break;
48
49         case MotionEvent.ACTION_MOVE:
50
51             //计算移动的距离
52             int offX = x - lastX;
53             int offY = y - lastY;
54
55             View viewGroup = (View) getParent();
56
57             //开启滑动
58             mScroller.startScroll(viewGroup.getScrollX(),
59                     viewGroup.getScrollY(), -offX, -offY);
60
61             break;
62
63         case MotionEvent.ACTION_UP:
64
65             break;
66         }
67         return true;
68     }
69
70
71
72         public void computeScroll() {
73             super.computeScroll();
74
75             if(mScroller.computeScrollOffset())
76             {
77                 ((View)getParent()).scrollTo(mScroller.getCurrX(),
78                         mScroller.getCurrY());
79             }
80
81             invalidate();//必须要调用
82         }
83 }

红色部分就是修改的核心代码了。需要说明的是,在开启滑动的代码中,即第58行,使用的是在父视图中使用getScrollX和getScrollY获取

所滑动到的点的坐标。而getScollX和getScrollY正是从computeScroll中的scrollTo方法中传递过来的。通过阅读源码你可以很清晰的看到这个

过程。我贴两张源码图吧,如下:

                               

上图中观察mScrollX的传递过程,确实如上面我所说的。

而且在开启滑动的代码中,注意我们将偏移量可是都设定为负值了哦!(正如我上面所讲的设定为相反数即可)。

好了,关于代码的解释,就讲这么多,其他的都很好理解了。现在就运行程序,效果如下:

值得注意的是,我们的的DragView(即红色的块块)并不是即时跟随鼠标的滑动,在真机上这个效果将会更加突出!!其实这就是

Scrollerl类的滑动特点!即手指到达某一位置后,view会随后再平滑的到达这个位置,也就是说并不是view和手指一起到达指定位置的。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

因此,一般并不利用Scroller类实现滑动,因为它不是即时的。但却经常用它来实现手指抬起后,view回到初始位置!

来修改下DragView看看怎么实现这个效果。代码如下:

 1 package com.example.testdragview;
 2
 3 import android.content.Context;
 4 import android.util.AttributeSet;
 5 import android.view.MotionEvent;
 6 import android.view.View;
 7 import android.widget.Scroller;
 8
 9 public class DragView extends View{
10
11
12     private int lastX;
13     private int lastY;
14     private Scroller mScroller;
15
16     public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
17         super(context, attrs, defStyleAttr);
18
19         mScroller = new Scroller(context);
20     }
21
22     public DragView(Context context, AttributeSet attrs) {
23         super(context, attrs);
24         mScroller = new Scroller(context);
25     }
26
27     public DragView(Context context) {
28         super(context);
29         mScroller = new Scroller(context);
30     }
31
32
33
34     public boolean onTouchEvent(MotionEvent event) {
35
36         //获取到手指处的横坐标和纵坐标
37         int x = (int) event.getX();
38         int y = (int) event.getY();
39
40
41         switch(event.getAction())
42         {
43         case MotionEvent.ACTION_DOWN:
44
45             lastX = x;
46             lastY = y;
47             break;
48
49         case MotionEvent.ACTION_MOVE:
50
51             //计算移动的距离
52             int offX = x - lastX;
53             int offY = y - lastY;
54
55              ((View) getParent()).scrollBy(-offX,- offY);
56
57             break;
58
59         case MotionEvent.ACTION_UP:
60
61             View viewGroup = (View) getParent();
62
63             //开启滑动,让其回到原点
64             mScroller.startScroll(viewGroup.getScrollX(),
65                     viewGroup.getScrollY(),
66                     -viewGroup.getScrollX() ,-viewGroup.getScrollY() );
67
68             break;
69         }
70         return true;
71     }
72
73
74
75         public void computeScroll() {
76             super.computeScroll();
77
78             if(mScroller.computeScrollOffset())
79             {
80                 ((View)getParent()).scrollTo(mScroller.getCurrX(),
81                         mScroller.getCurrY());
82             }
83
84             invalidate();//必须要调用
85         }
86 }

红色部分依旧是修改的核心代码。这里主要就是将实现的滑动效果替换成了用scrollBy来实现即时滑动,然后在手指抬起的up方法中,利用

Scoller类将view放回原来位置!运行一下,看看效果,如下:

如上图所示,只要鼠标一抬起,红色块块就会立刻回到原来位置!怎么样不错吧。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

好了,关于这个Scroller类的使用,就讲到这里。上面的代码基本都可以当做是模板代码了,需要的时候过来看看复制一下吧。

未完待续.....(最后一种方法)

时间: 2024-10-16 15:52:46

android中实现view可以滑动的六种方法续篇(一)的相关文章

android中实现view可以滑动的六种方法

在android开发中,经常会遇到一个view需要它能够支持滑动的需求.今天就来总结实现其滑动的六种方法.其实每一种方法的 思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现view的滑动效果. 一.通过Layout方法来实现滑动 如果你将滑动后的目标位置的坐标传递给Layout,这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. 这就是利用Layout方法实现滑动的核心思路.我们来看一下代码: 新建项目,然后自定义一个view,代码如下:

Android View体系(二)实现View滑动的六种方法

相关文章: Android View体系(一)视图坐标系 1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统记下触摸点的坐标,手指移动时系统记下移动后的触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标. 实现View滑动有很多种方法,这篇文章主要讲解六种滑动的方法,分别是:layout().offsetLeftAndRight()与offs

详解实现Android中实现View滑动的几种方式

注: 本文提到的所有三种滑动方式的完整demo:ScrollDemo 1. 关于View我们需要知道的 (1)什么是View? Android中的View类是所有UI控件的基类(Base class),也就是说我们平时所有到的各种UI控件,比如Button.ImagView等等都继承自View类.LinearLayout.FrameLayout等布局管理器的直接父类是ViewGroup,而ViewGroup也有View类派生.总的来说,View是对UI控件的抽象,它代表了屏幕上的一个矩形区域.通

Android中自定义View的MeasureSpec使用

有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/guide/topics/ui/custom-components.html 一般来说,自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小. protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) onMeasure传

android中自定义view涉及到的绘制知识

android中自定义view的过程中,需要了解的绘制知识. 1.画笔paint: 画笔设置: <span style="font-size:14px;"> paint.setAntiAlias(true);//抗锯齿功能 paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(30);//设置画笔宽度 paint.setShadowLayer(

Android中设置文本颜色的三种方法及颜色大全

原文:Android中设置文本颜色的三种方法及颜色大全 源代码下载地址:http://www.zuidaima.com/share/1550463694572544.htm 1.利于系统自带的颜色类 如TextView1.setTextColor(Android.graphics.Color.RED); 2.数字颜色表示法 TextView1.setTextColor(0xffff00ff); 3.自定义颜色 TextView1.setTextColor(this.getResources().

android中保存一个ArrayList到SharedPreferences的方法

保存: public static boolean saveArray() { SharedPrefernces sp=SharedPrefernces.getDefaultSharedPrefernces(this); SharedPrefernces.Editor mEdit1= sp.edit(); mEdit1.putInt("Status_size",sKey.size()); /*sKey is an array*/ for(int i=0;i<sKey.size()

Android中关于View滑动的实现你应该知道的

滑动作为Android中最基础的特效之一,使用场景非常广泛.实现的方式也有多种,理解各种滑动的实现方式.清楚在开发中根据自己的实际需求,选择合理的实现方案.这篇文章从:scrollTo()/scrollBy()内容滑动|动画方式滑动|修改布局参数,三种方式来做简要的分析. 一丶scrollerTo()&&scrollBy()内容滑动 这两个方法都是View自带的滑动方法,即每个控件都可以通过调用这两个方法实现滑动.scrollBy()方法的实现本质也是调用scrollTo()方法,不同之处

Android中监听ListView滑动到底部

Android中的应用就是ListView中向下滑动加载更多的功能,不要再onScroll方法中进行判断,那样当滑动到底部的时候,可能我们需要触发点什么事件,比如加载更多.隐藏某个控件等等. 第一种方法是直接滑动到底部就触发 listview.setOnScrollListener(new OnScrollListener(){       @Override       public void onScrollStateChanged(AbsListView view, int scrollS