0%

Android中关于scrollBy的一点点心得

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

一、概述

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

二、自定义View,使用scrollBy

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

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
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;
}
}

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

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

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"/>

</LinearLayout>

很简单吧,效果图如下:

这里写图片描述

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

1
2
3
4
5
6
7
8
9
10
11
12
<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>

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

这里写图片描述

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

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

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

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

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

1
scrollBy(-dX, -dY);

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

这里写图片描述

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

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

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

这里写图片描述

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

欢迎关注我的其它发布渠道