12.View的滑动

1.scrollTo和ScrollBy

为了实现滑动,View提供了两个方法来让我们实现这个功能,那就是scrollTo和scrollBy方法,

scrollTo的方法如下:

/**
     * Set the scrolled position of your view. This will cause a call to
     * {@link #onScrollChanged(int, int, int, int)} and the view will be
     * invalidated.
     * @param x the x position to scroll to
     * @param y the y position to scroll to
     */
    public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            //用于通知父控件需要清空这个View的缓存
            invalidateParentCaches();
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);

            if (!awakenScrollBars()) {
                postInvalidateOnAnimation();
            }
        }
    }

接下来我们来看这个方法,这个方法的参数x,y分别代表,我们想要让这个View偏离最初位置的大小,比如x为100,那么就偏离最初100个像素点,其中,从左向右滑动是负的,从右向左是正的,View从上向下是负的,从下往上滑动是负的,

这个方法是绝对滑动,比如当前横纵偏离都是90,这时候参数为scroll( 100 , 100 ) 那么做的操作就是向上滑动10,向左滑动10,。

接下来我们看到invalidateParentCaches 这个方法,这个方法是用于通知父控件,当前的控件已经失效了,要让父控件清空当前这个View的缓存,并且重新创建这个View。

awakeScrollBars 返回为true代表着有动画正在进行,为false就是其他情况。当有动画在进行的时候,我们就不应该继续执行滚动动画,而当前没有动画在进行,我们就调用postInvalidateOnAnimation 这个,这个方法支持在异步线程刷新UI,并且带有动画效果。

接下来介绍scrollBy方法:

    /**
     * Move the scrolled position of your view. This will cause a call to
     * {@link #onScrollChanged(int, int, int, int)} and the view will be
     * invalidated.
     * @param x the amount of pixels to scroll by horizontally
     * @param y the amount of pixels to scroll by vertically
     */
    public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }

可以看到,scrollBy方法就是基于scrollTo方法,scrollBy方法是相对偏移,比如当前滚动为90 90 ,我们需要调用scrollByt(10, 10 ) 结果,滚动偏移就成了100 , 100 。

2. 使用动画

使用动画也可以完成滑动效果,不过,动画的交互感会比较弱,因为上面的第一种方法的滚动偏移量,是可以动态改变的,这意味着什么?这意味着,我们可以在onTouchEvent去控制,可以结合用户的手势来完成各种滚动效果,在这边,我们就暂时不详细谈了。接下来我们来复习下动画的使用。

第一种方法是使用XML

 <?xml version="1.0" encoding="utf-8"?>
     <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:fillAfter="true"
            android:zAdjustment="normal">
            <translate
                android:duration="100"
                android:fromXDelta="0"
                android:formXDelta="0"
                android:interpolator="@android:anim/linear_interpolator"
                android:toXDelta="100"
                android:toYDelta="100"   />
    </set>

这个方法会让我们把View从原始位置往下移动100个像素

另外一种是使用属性动画

ObjectAnimator.ofFloat( tragetView,"translationX",0,100).setDuraltion( 100 ).start();

动画的缺点主要是,执行动画过程中,是不可逆的。

3.改变布局参数

尽管这里我不太愿意介绍,但是,其实setLayoutParams也可以用于做动画效果,但是,这边不推荐使用,因为当你使用的是比较复杂的控件的时候,尤其是带图片资源,setLayoutParams带来的开销是很大的,耗费CPU资源较多,在一些低配置的机器上,运行的效果不理想。

但是,在使用拖拽效果的时候,一些小元素还是很适合用setLayoutParams的。                                    0.

时间: 2024-11-05 11:55:38

12.View的滑动的相关文章

android中实现view可以滑动的六种方法

在android开发中,经常会遇到一个view需要它能够支持滑动的需求.今天就来总结实现其滑动的六种方法.其实每一种方法的 思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现view的滑动效果. 一.通过Layout方法来实现滑动 如果你将滑动后的目标位置的坐标传递给Layout,这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. 这就是利用Layout方法实现滑动的核心思路.我们来看一下代码: 新建项目,然后自定义一个view,代码如下:

一个Demo带你彻底掌握View的滑动冲突

最近在重新学习Android自定义View这一块的内容,遇到了平时开发中经常碰到的一个棘手问题:View的滑动冲突.相信不少小伙伴都有相同的感觉,看似简单真正做起来却又不知道从何下手.今天就从一个简单的Demo带你彻底掌握解决View滑动冲突的办法. 老规矩,先上图: 示例图中是一个常见的下拉回弹,手指向下滑动的时候,整个布局会一起滑动.下拉到一定距离的时候松手,布局会自动回弹到开始的位置:手指向上滑动的时候,布局的子View会滑动到最底部,然后手指再向下滑动,布局的子View会滑动到最顶部,最

view的滑动冲突解决方案

一.常见的滑动冲突场景 1.外部滑动方向和内部滑动方向不一致 2.外部滑动方向和内部滑动方向一致 3.上面两种情况的嵌套 二.滑动冲突处理的原则 场景1的处理原则是:当用户左右滑动时,需要让外部的view拦截点击事件,当用户上下滑动时,需要让内部的view拦截点击事件.场景2和场景3比较特殊,无法如同场景1一样原则的处理冲突,需要在业务上寻找突破点.比如业务上规定:当处于某种状态时需要外部View响应用户的滑动,而处于另一种状态时则需要内部View来响应View的滑动,根据这种业务上的需求我们也

View的滑动冲突

View的滑动冲突指的是当有内外两层View同时可以滑动的时候,这个时候就会产生滑动冲突.那么应该如何解决滑动呢,其实要用到View的事件分发机制. View的滑动冲突主要有以下三个场景: 场景一:外部滑动方向和内部滑动方向不一致: 场景二:外部滑动方向和内部滑动方向一致: 场景三:以上两种情况的嵌套. 这里主要讨论场景一的滑动冲突的解决,其他两种思想都是类似的,根据具体情况而定. 对于场景一,它的滑动冲突处理规则是:当用户左右滑动时,需要外部的View拦截点击事件,当用户上下滑动时,需要内部的

View 的滑动

View 的滑动 学习自 <Android开发艺术探索> 滑动漫谈 因为Android手机屏幕大小的原因,所以为了显式更多的信息,我们必须采用滚动的方式来处理,因为滚动就涉及到了滑动,有的滑动十分生硬,而有的滑动却是圆润并且绚丽的,View的滑动就是我们本章要学习的内容. 使用scrollTo/scrollBy 注意,这种方式只是改变了View内容的位置,并没有改变View的位置,以Button为例,那就是仅仅改变了Button中的文本的位置,而没有改变Button的位置. scrollTo

自定义控件(视图)2期笔记12:View的滑动冲突之 外部拦截法

1. 外部拦截法: 点击事件通过父容器拦截处理,如果父容器需要就拦截,不需要就不拦截. 2. 下面通过一个Demo示例说明: (1)首先我们创建一个Android工程,如下: (2)我们来到activity_main.xml,如下: 1 <com.himi.viewconflict.ui.RevealLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="htt

android中实现view可以滑动的六种方法续篇(一)

承接上一篇,如果你没有读过前四章方法,可以点击下面的链接: http://www.cnblogs.com/fuly550871915/p/4985053.html 下面开始讲第五中方法. 五.利用Scroller类实现滑动 (1)基础知识总结 为了便于下面的阅读代码,先来总结一下关于Scroller类的基础知识.利用Scroller类实现滑动,需要三个步骤: 步骤一: 初始化Scroller对象,即mScroller = new Scroller(context)步骤二: 重写computeSc

自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法

1. 内部拦截法: 父容器不拦截事件,所有的事件全部都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交给父容器进行处理. 这种方法和Android中的事件分发机制不一样,需要配合requestDisallowInterceptTouchEvent方法才能正常工作,使用起来较外部拦截法稍显负责一点. 我们需要重写子元素的dispatchTouchEvent方法. 这种方法的伪代码是: 1 @Override 2 public boolean dispatchTouchEvent(Motio

ArcGIS API for JavaScript 4.2学习笔记[12] View的弹窗(Popup)

看本文前最好对第二章(Mapping and Views)中的Map和View类有理解. 视图类有一个属性是Popup类型的popup,查阅API知道这个就是视图的弹窗,每一个View的实例都有一个popup. 这个popup属性在View对象实例化的时候就实例化了的,即随着View的出生,它也会出生,它拥有默认的样子,它显示的文字也是默认的样式. 我们看看Popup这个类: 直接继承自Accessor,位于widgets模块下,说明Popup(弹窗)也是小部件的一种.但是为什么要单独拿出来讲呢