转载请注明出处
http://blog.csdn.net/guodongandroid/article/details/51558131
本文来自【孫小逗的博客】
最近对自定义View和动画进行了研究学习,同时之前不太明白的地方也豁然开朗。学习不是一下子就学会的,不懂的地方,在后续的学习过程中会慢慢的理解,有种拨云见日的感觉。
scrollBy(int dx, int dy)主要用于滑屏操作,第一个参数dx代表滑屏后与滑屏前的x坐标之差,第二个参数dy同理。那下面我们来试试吧。
首先我们新建了类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;
}
}
可以看到,我们设置了浅红色的背景,声明了两个全局变量,并重写了onTouchEvent方法,里面判断了单击和滑动事件,单击时记录x和y的坐标,赋值给mDownX和mDownY,滑动的时候也获取x和y的坐标,和单击时的坐标相减取得偏移量,调用scrollBy方法。
然后,我们在布局中使用:
"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"/>
很简单吧,效果图如下:
咦,咋滑不动呢?(我是真的滑了,不是在滑动鼠标)先不管为啥拖不动。我们在布局中添加几个属性:
"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"/>
可以看到,为自定义的View增加了android:text属性,重新运行程序,看看效果如何:
哈,现在是不是可以看到滑动的效果了呢?不对啊,我们明明自定义的View,现在为啥拖动的不是View而是View里面的字呢,啥子情况哦?
其实呢,在自定义View中直接调用scrollBy滑动的是View的Content内容,对于Button,它的Content就是文本,ImageView就是drawable了。
还有一个问题,不知你们发现没有?开始滑动时,可以看到鼠标是向上滑动的,按照人们的正常思维,那“AndroidQYZ”这几个字母也应该向上滑动才对,而现在是向下滑动。
这个就不太好理解了。做iOS开发的同学肯定用过UIScrolView,没错,看到这我才明白Android和iOS这么相似。其实是这样的:首先我们就要知道布局是没有边界的,就像很大一块画布,而手机屏幕就像是一个放大镜,放大了画布上的一小部分内容,当我们滑动屏幕时,画布是没有滑动的,滑动的是放大镜,就是我们的屏幕,可以这也说,当放大镜向上滑动时,我们就可以看到画布在向下滑动,这就是为啥鼠标明明向上滑动,而“AndroidQYZ”这几个字母却向下滑动的原因了,既然我们知道了为啥,那怎么修改呢?
我们先修改第二个问题,代码如下:
scrollBy(-dX, -dY);
so easy,没错,我们取了负值就可以了,不信?我们可以看看效果:
可以看到,“AndroidQYZ”这几个字母已经跟随鼠标的移动而移动了,可还是没有让自定义View滑动呀,你这不是骗人嘛?不着急,之前说直接调用scrollBy滑动的是Content,这就简单了,我们直接调用自定义View的父View的scrollBy不就好了嘛,看下面:
((View) getParent()).scrollBy(-dX, -dY);
getParent()方法获取此View的ViewParent并强转为View,再调用scrollBy方法,要不要看看效果呢?就怕你们不信。
哈哈,怎么样,可以滑动了吧。当然还有scrollTo方法,大家可以自己去试试。