`
119568242
  • 浏览: 427002 次
  • 性别: Icon_minigender_1
  • 来自: 深圳/湛江
社区版块
存档分类
最新评论

[android]Scroller 的一些思考

    博客分类:
  • ios
 
阅读更多

参考:

Android中滑屏实现----手把手教你如何实现触摸滑屏以及Scroller类详解

http://blog.csdn.net/qinjuning/article/details/7419207

 

 

Scroller与scrollby/scrollto的区别

Scroller的构造方法是new Scroller(context ); 他是 在执行startScroll(int x,int y,int dx,int dy,int dt);请求当前context下的view 执行自己的computeScroll()方法 【注:这个方法默认是空方法,需要自己覆写】从而实现移动

 

 public void computeScroll() {     
        // TODO Auto-generated method stub  
        Log.e(TAG, "computeScroll");  
        // 如果返回true,表示动画还没有结束  
        // 因为前面startScroll,所以只有在startScroll完成时 才会为false  
        if (mScroller.computeScrollOffset()) {  
            Log.e(TAG, mScroller.getCurrX() + "======" + mScroller.getCurrY());  
            // 产生了动画效果,根据当前值 每次滚动一点  
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());  
              
            Log.e(TAG, "### getleft is " + getLeft() + " ### getRight is " + getRight());  
            //此时同样也需要刷新View ,否则效果可能有误差  
            postInvalidate();  
        }  
        else  
            Log.i(TAG, "have done the scoller -----");  
    }  

 

public class Scroller  {  
  
    private int mStartX;    //起始坐标点 ,  X轴方向  
    private int mStartY;    //起始坐标点 ,  Y轴方向  
    private int mCurrX;     //当前坐标点  X轴, 即调用startScroll函数后,经过一定时间所达到的值  
    private int mCurrY;     //当前坐标点  Y轴, 即调用startScroll函数后,经过一定时间所达到的值  
     
    private float mDeltaX;  //应该继续滑动的距离, X轴方向  
    private float mDeltaY;  //应该继续滑动的距离, Y轴方向  
    private boolean mFinished;  //是否已经完成本次滑动操作, 如果完成则为 true  
  
    //构造函数  
    public Scroller(Context context) {  
        this(context, null);  
    }  
    public final boolean isFinished() {  
        return mFinished;  
    }  
    //强制结束本次滑屏操作  
    public final void forceFinished(boolean finished) {  
        mFinished = finished;  
    }  
    public final int getCurrX() {  
        return mCurrX;  
    }  
     /* Call this when you want to know the new location.  If it returns true, 
     * the animation is not yet finished.  loc will be altered to provide the 
     * new location. */    
    //根据当前已经消逝的时间计算当前的坐标点,保存在mCurrX和mCurrY值中  
    public boolean computeScrollOffset() {  
        if (mFinished) {  //已经完成了本次动画控制,直接返回为false  
            return false;  
        }  
        int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime);  
        if (timePassed < mDuration) {  
            switch (mMode) {  
            case SCROLL_MODE:  
                float x = (float)timePassed * mDurationReciprocal;  
                ...  
                mCurrX = mStartX + Math.round(x * mDeltaX);  
                mCurrY = mStartY + Math.round(x * mDeltaY);  
                break;  
            ...  
        }  
        else {  
            mCurrX = mFinalX;  
            mCurrY = mFinalY;  
            mFinished = true;  
        }  
        return true;  
    }  
    //开始一个动画控制,由(startX , startY)在duration时间内前进(dx,dy)个单位,即到达坐标为(startX+dx , startY+dy)出  
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {  
        mFinished = false;  
        mDuration = duration;  
        mStartTime = AnimationUtils.currentAnimationTimeMillis();  
        mStartX = startX;       mStartY = startY;  
        mFinalX = startX + dx;  mFinalY = startY + dy;  
        mDeltaX = dx;            mDeltaY = dy;  
        ...  
    }  
}  

 

而scrollby 与scrollto 是直接 移动

 

 

今天看到六哥做的滑动的 发现 一个很少用到但是挺好玩的东西Scroller

 

简单的描述下

对一个view 覆写他的方法

 

	@Override
	public void computeScroll() {
		// super.computeScroll();
		if (mScroller.computeScrollOffset()) {
			scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
			postInvalidate();
		}
	}

 

那么 当它自己或者子view触发到

mScroller.startScroll(0, 0, 0, 0, duration);//全是int 初始x 初始y 位移x 位移y 持续时间

就会调用computeScroll()方法。

【关于startScroll 调用startScroll 并不是一次,是把位移时间切割成很小的时间 然后每次调用computeScroll】

而之所以能达到位移的效果 实际上移动的是 把覆写computeScroll的view移动,从而看起 内部的子view也看起来移动了。

 

 

 

 

scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
//这句代码就是移动this这个view 到mScroller.getCurrX(), mScroller.getCurrY()
//mScroller.getCurrX(), mScroller.getCurrY() 随着持续时间duration 持续改变 直到结束

 

 

api:http://developer.android.com/reference/android/widget/Scroller.html

中文api:http://www.cnblogs.com/over140/archive/2010/12/16/1907528.html

4楼:http://www.eoeandroid.com/thread-43927-1-1.html

 

 

另外 6哥写的一个左右滑动ralativelayout ~

 

 

 

 

分享到:
评论
2 楼 119568242 2012-10-29  
@ ghosta3  =-=表示 如果你上次做那个。。。我就用画的了。。。
1 楼 ghosta3 2012-10-29  
=.= 表示一直用scroller,你原来用什么写

相关推荐

    android scroller学习demo

    在Android开发中,`Scroller`是一个非常重要的组件,它主要用于实现平滑的滚动效果,尤其是在处理触摸事件和动画时。本示例“android scroller学习demo”将带你深入理解如何利用`Scroller`实现类似QQ ListView的侧滑...

    Android Scroller完全解析

    在Android开发中,我们经常需要实现一些平滑的滚动效果,比如ScrollView、ViewPager的滑动,这些都离不开一个关键的类——`Scroller`。`Scroller`是Android SDK提供的一种动画机制,它不直接处理UI更新,而是计算出...

    android Scroller使用小例子

    在Android开发中,`Scroller`是一个非常重要的工具类,主要用于实现平滑的滚动效果。它并不直接控制View的移动,而是提供一个离散的、可定制的动画过程,通过计算出一系列连续的位置变化,然后由ViewGroup或者View...

    Android之Scroller(滑动)完全解析

    在Android开发中,`Scroller`是一个非常重要的组件,它主要用于处理平滑的滚动效果,尤其是在没有用户交互的情况下。在本篇文章中,我们将深入探讨`Scroller`的工作原理,以及如何在实际应用中使用它来实现平滑滚动...

    Android Scroller大揭秘

    Android Scroller是Android系统中用于实现平滑滚动效果的重要组件,它主要用于控制View或者 ViewGroup的动画滚动效果,比如ScrollView、HorizontalScrollView等滚动视图的流畅滚动。Scroller并不直接处理屏幕上的...

    Android Scroller练习-仿ViewPager效果

    4. 可以添加一些额外的逻辑,比如限制滑动范围,防止超出页面边界,或者实现弹性滑动效果,当滑动速度过快时,`Scroller`会自动计算一个回弹效果。 5. 最后,设置适配器,填充`ViewPageDemo`的内容,可以是多个`...

    Android 使用Scroller自动滚动第二种实现

    在Android开发中,Scroller是一个非常重要的工具类,它主要用于实现平滑的动画效果,比如ScrollView、ViewPager等组件的滑动。本篇文章将探讨如何利用Scroller实现Android界面的自动滚动,这是一种不同于常见动画库...

    Android Scroller实现View弹性滑动Demo

    在Android开发中,`Scroller`是一个非常重要的工具类,它并不直接控制View的滚动,而是提供了一套平滑滚动的计算逻辑。`Scroller`主要用于处理View的弹性滑动效果,比如在ScrollView、ViewPager或者自定义View中实现...

    android Scroller粗暴分析

    在Android开发中,`Scroller`是一个非常重要的组件,它主要用于处理平滑的滚动效果,尤其是在没有用户交互时,如动画或自动滚动。本篇文章将深入剖析`Scroller`的工作原理,以及它如何与子视图(child views)配合...

    android scroller滑动效果简单demo

    为了增强用户体验,`Scroller`还提供了一些额外的功能,如`fling()`方法用于实现惯性滑动。这个方法允许用户快速滑动后,View会继续滑动一段时间并逐渐减速,模拟真实物理世界的滑动效果。`fling()`的参数包括起始...

    Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果 源码程序

    Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,项目详情http://blog.csdn.net/xiaanming/article/details/17539199

    详解Android Scroller与computeScroll的调用机制关系

    在Android开发中,`Scroller`和`computeScroll`是两个关键的概念,它们与ViewGroup的滚动动画密切相关。本文将详细解析这两个概念及其调用机制之间的关系。 首先,`Scroller`是一个内部类,它并不直接参与ViewGroup...

    Android Scroller及下拉刷新组件原理解析

    Android事件拦截机制 Android中事件的传递和拦截和View树结构是相关联的,在View树中,分为叶子节点和普通节点,普通节点有子节点只能是ViewGroup,叶子节点可以是View或者ViewGroup。Android和事件分发拦截相关的...

    Android利用Scroller实现简单的物体漂浮移动效果

    `Scroller`类是Android系统提供的一种用于处理平滑滚动和动画的关键工具,尤其在没有触摸事件或者手势操作时,它可以帮助我们实现各种复杂的滚动和动画效果。本篇文章将深入探讨如何利用`Scroller`来实现一个简单的...

    深入理解Android中Scroller的滚动原理

    Scroller在Android中是一个核心组件,它主要用于实现View的平滑滚动效果,使得视图能够按照预设的时间和轨迹进行连续、平滑的移动,而不是简单地瞬移。Scroller本身并不直接改变View的位置,而是提供计算滚动过程的...

    android scrollTo,scrollBy与Scroller demo

    `scrollTo`、`scrollBy`和`Scroller`是Android视图组件中处理滚动的核心方法,它们各自扮演着不同的角色,共同实现了平滑且可控的滚动效果。下面我们将深入探讨这三个概念及其在实际开发中的应用。 1. `scrollTo`...

    Android仿ViewPager,自定义Scroller模拟动画

    本篇将深入探讨如何在Android中仿制ViewPager,通过自定义Scroller来模拟动画,从而达到更灵活的页面滑动体验。 首先,我们要理解Scroller在Android中的作用。Scroller并非一个View或者ViewGroup,而是一个辅助类,...

Global site tag (gtag.js) - Google Analytics