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...

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

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类...

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

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

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

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反。通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在pare...

RecyclerView scrollToPosition 无效的问题

RecyclerView是个比较蛋疼的控件,给我的第一感觉就是竟然连OnItemClick都没有, 当然,网上有很多的解决方法,可以自己实现。 然而今天,在用到这个控件时,又遇到了个奇葩的问题...
  • Pansing
  • Pansing
  • 2015年11月11日 17:01
  • 18559

【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案

一、内存泄露 垃圾回收器无法回收原本应该被回收的对象,这个对象就引发了内存泄露。 内存泄露的危害: (1)过多的内存泄露最终会导致内存溢出(OOM) (2)内存泄露导致可用内存不足,会触发频繁GC,...

Java弱引用(WeakReference)的理解与使用

看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是...

DSP学习心得,从基础一点点的写

  • 2011年02月24日 13:34
  • 345KB
  • 下载

设计文档的心得——每天进步一点点

思考步骤: 1、为什么要修改,目的是什么; 2、增加或删除的流程是做什么用的,为什么这么做,修改后会不会因其他流程发生改变; 3、如果增加请求事件或函数调用,确定传入的参...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中关于scrollBy的一点点心得
举报原因:
原因补充:

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