Android中关于scrollBy的一点点心得

原创 2016年06月01日 18:37:55

转载请注明出处
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;
    }
}

可以看到,我们设置了浅红色的背景,声明了两个全局变量,并重写了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>

很简单吧,效果图如下:

这里写图片描述

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

<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”这几个字母却向下滑动的原因了,既然我们知道了为啥,那怎么修改呢?

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

scrollBy(-dX, -dY);

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

这里写图片描述

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

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

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

这里写图片描述

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明

本文原创 ,转载必须注明出处 :http://blog.csdn.net/qinjuning                                             今天给大家介绍下A...
  • qinjuning
  • qinjuning
  • 2012年02月10日 00:02
  • 84061

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类...
  • vipzjyno1
  • vipzjyno1
  • 2014年04月27日 16:23
  • 49726

scrollTo 和 scrollBy 方法使用说明

一、滚动的是什么? scrollgoback.setOnClickListener(new OnClickListener() { @Override public void onCli...
  • L25000
  • L25000
  • 2015年06月03日 12:43
  • 1833

Android中View的scrollTo()和scrollBy()区别

转自:http://blog.csdn.net/manoel/article/details/39228593 首先,需要知道的是,View是可以延伸到屏幕之外的,可以想象一下ListVIe...
  • jdsjlzx
  • jdsjlzx
  • 2016年01月05日 14:40
  • 3262

【移动开发】View的scrollTo()和scrollBy()区别

首先,需要知道的是,View是可以延伸到屏幕之外的,可以想象一下ListVIew或GridView。也就是说View的尺寸可以超过屏幕的尺寸。View的大小就是onDraw()中Canvas画布的大小...
  • manoel
  • manoel
  • 2014年09月12日 13:27
  • 14591

图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反。通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在pare...
  • bigconvience
  • bigconvience
  • 2014年05月23日 14:59
  • 69402

ScrollTo,ScrollBy,offsetLeftAndRight,offsetTopAndBottom以及侧滑的简单实现

ScrollTo,ScrollBy 一、滚动的是什么 [java] view plain copy scrollgoback.se...
  • LAMP_zy
  • LAMP_zy
  • 2016年08月31日 15:18
  • 525

Android自定义控件热身之scrollTo和scrollBy详解

转载请注明出处:http://blog.csdn.net/xiaohao0724/article/details/54984850 View通过ScrollTo和ScrollBy 方法可以实...
  • xiaohao0724
  • xiaohao0724
  • 2017年02月11日 16:36
  • 288

天天记录 - Android 使用view.ScrollBy实现View随手指移动

这篇文章的原标题是《Android 使用scroller实现View随手指移动》 真是大错特错, Scroller仅仅是一个辅助类用于根据滚动速度获取每次的偏移量而已。 一 有图有真相,先上图和...
  • love_world_
  • love_world_
  • 2012年11月12日 22:34
  • 4252

Android 之 高德地图学习 二 定位

自己做的笔记,没有深层的东西,请大神绕行~ 这篇说说定位,同样少不了官方文档和Demo~ 其实就是看官方的东西然后自己打一遍,理解一遍,貌似没啥深层的东西,毕竟我们会用就行了嘛~ 学定位之前先学...
  • qq_24889075
  • qq_24889075
  • 2016年01月17日 22:24
  • 3361
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中关于scrollBy的一点点心得
举报原因:
原因补充:

(最多只允许输入30个字)