Android中关于scrollBy的一点点心得

来源:互联网 发布:昆明郊野公园知乎 编辑:程序博客网 时间:2024/05/17 20:29

转载请注明出处 
http://blog.csdn.net/guodongandroid/article/details/51558131 
本文来自【孫小逗的博客】

一、概述

最近对自定义View和动画进行了研究学习,同时之前不太明白的地方也豁然开朗。学习不是一下子就学会的,不懂的地方,在后续的学习过程中会慢慢的理解,有种拨云见日的感觉。 
scrollBy(int dx, int dy)主要用于滑屏操作,第一个参数dx代表滑屏后与滑屏前的x坐标之差,第二个参数dy同理。那下面我们来试试吧。

二、自定义View,使用scrollBy

首先我们新建了类DragView继承自Button

public class DragView extends Button{    private int mDownX;    private int mDownY;    public DragView(Context context)    {        this(context, null);    }    public DragView(Context context, AttributeSet attrs)    {        this(context, attrs, 0);    }    public DragView(Context context, AttributeSet attrs, int defStyleAttr)    {        super(context, attrs, defStyleAttr);        setBackgroundColor(0x88FF0000);    }    @Override    public boolean onTouchEvent(MotionEvent event)    {        switch (event.getAction())        {            case MotionEvent.ACTION_DOWN:                mDownX = (int) event.getX();                mDownY = (int) event.getY();                break;            case MotionEvent.ACTION_MOVE:                int mX = (int) event.getX();                int mY = (int) event.getY();                int dX = mX - mDownX;                int dY = mY - mDownY;                scrollBy(dX, dY);                break;        }        return true;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

可以看到,我们设置了浅红色的背景,声明了两个全局变量,并重写了onTouchEvent方法,里面判断了单击和滑动事件,单击时记录x和y的坐标,赋值给mDownX和mDownY,滑动的时候也获取x和y的坐标,和单击时的坐标相减取得偏移量,调用scrollBy方法。

然后,我们在布局中使用:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">    <com.sun.androidqyz.DragView        android:layout_width="100dp"        android:layout_height="100dp"/></LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

很简单吧,效果图如下:

这里写图片描述

咦,咋滑不动呢?(我是真的滑了,不是在滑动鼠标)先不管为啥拖不动。我们在布局中添加几个属性:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">    <com.sun.androidqyz.DragView        android:layout_width="100dp"        android:layout_height="100dp"        android:gravity="center"        android:text="@string/app_name"/></LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

可以看到,为自定义的View增加了android:text属性,重新运行程序,看看效果如何:

这里写图片描述

哈,现在是不是可以看到滑动的效果了呢?不对啊,我们明明自定义的View,现在为啥拖动的不是View而是View里面的字呢,啥子情况哦?

其实呢,在自定义View中直接调用scrollBy滑动的是View的Content内容,对于Button,它的Content就是文本,ImageView就是drawable了。

还有一个问题,不知你们发现没有?开始滑动时,可以看到鼠标是向上滑动的,按照人们的正常思维,那“AndroidQYZ”这几个字母也应该向上滑动才对,而现在是向下滑动。

这个就不太好理解了。做iOS开发的同学肯定用过UIScrolView,没错,看到这我才明白Android和iOS这么相似。其实是这样的:首先我们就要知道布局是没有边界的,就像很大一块画布,而手机屏幕就像是一个放大镜,放大了画布上的一小部分内容,当我们滑动屏幕时,画布是没有滑动的,滑动的是放大镜,就是我们的屏幕,可以这也说,当放大镜向上滑动时,我们就可以看到画布在向下滑动,这就是为啥鼠标明明向上滑动,而“AndroidQYZ”这几个字母却向下滑动的原因了,既然我们知道了为啥,那怎么修改呢?

我们先修改第二个问题,代码如下:

scrollBy(-dX, -dY);
  • 1

so easy,没错,我们取了负值就可以了,不信?我们可以看看效果:

这里写图片描述

可以看到,“AndroidQYZ”这几个字母已经跟随鼠标的移动而移动了,可还是没有让自定义View滑动呀,你这不是骗人嘛?不着急,之前说直接调用scrollBy滑动的是Content,这就简单了,我们直接调用自定义View的父View的scrollBy不就好了嘛,看下面:

((View) getParent()).scrollBy(-dX, -dY);
  • 1

getParent()方法获取此View的ViewParent并强转为View,再调用scrollBy方法,要不要看看效果呢?就怕你们不信。

这里写图片描述

哈哈,怎么样,可以滑动了吧。当然还有scrollTo方法,大家可以自己去试试。

原创粉丝点击