【移动应用开发技术】android用户界面之scroller_第1页
【移动应用开发技术】android用户界面之scroller_第2页
【移动应用开发技术】android用户界面之scroller_第3页
【移动应用开发技术】android用户界面之scroller_第4页
【移动应用开发技术】android用户界面之scroller_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】android用户界面之scroller

一、结构publicclassScrollerextendsObject二、概述这个类封装了滚动操作。滚动的持续时间可以通过构造函数传递,并且可以指定滚动动作的持续的最长时间。经过这段时间,滚动会自动定位到最终位置,并且通过computeScrollOffset()会得到的返回值为false,表明滚动动作已经结束。三、构造函数publicScroller(Contextcontext)使用缺省的持续持续时间和动画插入器创建一个Scroller。(译者注:interpolator这里翻译为动画插入器,见这里。)publicScroller(Contextcontext,Interpolatorinterpolator)根据指定的动画插入器创建一个Scroller,如果指定的动画插入器为空,则会使用缺省的动画插入器(粘滞viscous)创建。四、公共方法publicvoidabortAnimation()停止动画。与forceFinished(boolean)相反,Scroller滚动到最终x与y位置时中止动画。参见forceFinished(boolean)publicbooleancomputeScrollOffset()当想要知道新的位置时,调用此函数。如果返回true,表示动画还没有结束。位置改变以提供一个新的位置。publicvoidextendDuration(intextend)延长滚动动画时间。此函数允许当使用setFinalX(int)orsetFinalY(int)时,卷动动作持续更长时间并且卷动更长距离。

参数

extend卷动事件延长的时间,以毫秒为单位

参见

setFinalX(int)

setFinalY(int)publicvoidfling(intstartX,intstartY,intvelocityX,intvelocityY,intminX,intmaxX,intminY,intmaxY)在fling(译者注:快滑,用户按下触摸屏、快速移动后松开)手势基础上开始滚动。滚动的距离取决于fling的初速度。

参数

startX滚动起始点X坐标startY滚动起始点Y坐标velocityX

当滑动屏幕时X方向初速度,以每秒像素数计算velocityY

当滑动屏幕时Y方向初速度,以每秒像素数计算minX

X方向的最小值,scroller不会滚过此点。maxX

X方向的最大值,scroller不会滚过此点。minY

Y方向的最小值,scroller不会滚过此点。maxY

Y方向的最大值,scroller不会滚过此点。publicfinalvoidforceFinished(booleanfinished)强制终止的字段到特定值。(译者注:立即停止滚动?)

参数

finished

新的结束值publicfinalintgetCurrX()返回当前滚动X方向的偏移

返回值

距离原点X方向的绝对值publicfinalintgetCurrY()返回当前滚动Y方向的偏移

返回值

距离原点Y方向的绝对值publicfinalintgetDuration()返回滚动事件的持续时间,以毫秒计算。

返回值

滚动持续的毫秒数publicfinalintgetFinalX()返回滚动结束位置。仅针对“fling”手势有效

返回值

最终位置X方向距离原点的绝对距离publicfinalintgetFinalY()返回滚动结束位置。仅针对“fling”操作有效

返回值

最终位置Y方向距离原点的绝对距离publicfinalintgetStartX()返回滚动起始点的X方向的偏移

返回值

起始点在X方向距离原点的绝对距离publicfinalintgetStartY()返回滚动起始点的Y方向的偏移

返回值

起始点在Y方向距离原点的绝对距离publicfinalbooleanisFinished()返回scroller是否已完成滚动。

返回值

停止滚动返回true,否则返回falsepublicvoidsetFinalX(intnewX)设置scroller的X方向终止位置

参数

newX

新位置在X方向距离原点的绝对偏移。

参见

extendDuration(int)

setFinalY(int)publicvoidsetFinalY(intnewY)设置scroller的Y方向终止位置

参数

newY

新位置在Y方向距离原点的绝对偏移。

参见

extendDuration(int)

setFinalY(int)publicvoidstartScroll(intstartX,intstartY,intdx,intdy)以提供的起始点和将要滑动的距离开始滚动。滚动会使用缺省值250ms作为持续时间。

参数

startX水平方向滚动的偏移值,以像素为单位。正值表明滚动将向左滚动startY垂直方向滚动的偏移值,以像素为单位。正值表明滚动将向上滚动dx水平方向滑动的距离,正值会使滚动向左滚动dy垂直方向滑动的距离,正值会使滚动向上滚动publicvoidstartScroll(intstartX,intstartY,intdx,intdy,intduration)以提供的起始点和将要滑动的距离开始滚动。

参数

startX水平方向滚动的偏移值,以像素为单位。正值表明滚动将向左滚动startY垂直方向滚动的偏移值,以像素为单位。正值表明滚动将向上滚动dx水平方向滑动的距离,正值会使滚动向左滚动dy垂直方向滑动的距离,正值会使滚动向上滚动duration

滚动持续时间,以毫秒计。publicinttimePassed()返回自滚动开始经过的时间

返回值

经过时间以毫秒为单位五、简单用法:Android里Scroller类是为了实现View平滑滚动的一个Helper类。通常在自定义的View时使用,在View中定义一个私有成员mScroller=newScroller(context)。设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。

自定义一个CustomView,使用Scroller实现滚动importandroid.content.Context;importandroid.util.AttributeSet;importandroid.util.Log;importandroid.view.View;importandroid.widget.LinearLayout;importandroid.widget.Scroller;publicclassCustomViewextendsLinearLayout{

privatestaticfinalStringTAG="Scroller";

privateScrollermScroller;

publicCustomView(Contextcontext,AttributeSetattrs){

super(context,attrs);

mScroller=newScroller(context);

}

//调用此方法滚动到目标位置

publicvoidsmoothScrollTo(intfx,intfy){

intdx=fx-mScroller.getFinalX();

intdy=fy-mScroller.getFinalY();

smoothScrollBy(dx,dy);

}

//调用此方法设置滚动的相对偏移

publicvoidsmoothScrollBy(intdx,intdy){

//设置mScroller的滚动偏移量

mScroller.startScroll(mScroller.getFinalX(),mScroller.getFinalY(),dx,dy);

invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果

}

@Override

publicvoidcomputeScroll(){

//先判断mScroller滚动是否完成

if(mSputeScrollOffset()){

//这里调用View的scrollTo()完成实际的滚动

scrollTo(mScroller.getCurrX(),mScroller.getCurrY());

//必须调用该方法,否则不一定能看到滚动效果

postInvalidate();

}

puteScroll();

}}六、深度用法:

android使用Scroller实现缓慢移动

在Launcher中的Workspace中实现了左右屏幕切换效果,里面就用到了Scroller记录滑动轨迹,实现一种缓慢地向左或向右移动的效果,这里我对这种效果进行总结:我们先看一个例子:点击按钮时红经块会从左边缓慢地移向左右,这个该怎么实现呢

我们先来看一下,Scroller,这个对象里有startScroll方法

voidandroid.widget.Scroller.startScroll(intstartX,intstartY,intdx,intdy,intduration)

第一个参数是起始移动的x坐标值,第二个是起始移动的y坐标值,第三个第四个参数都是移到某点的坐标值,而duration当然就是执行移动的时间。这个有什么用呢。要知道有什么用还得再看一个方法

booleanandroid.widget.SputeScrollOffset()

当startScroll执行过程中即在duration时间内,computeScrollOffset

方法会一直返回false,但当动画执行完成后会返回返加true.

有了这两个方法还不够,我们还需要再重写viewGroup的一个方法,

computeScroll这个方法什么时候会被调用呢

官网上这样说的[size=0.9em]

publicvoidcomputeScroll[size=0.9em]()[size=0.8em]Since:APILevel1

Calledbyaparenttorequestthata

childupdateitsvaluesformScrollXandmScrollYifnecessary.This

willtypicallybedoneifthechildisanimatingascrollusingaScrollerobject.

当我们执行ontouch或invalidate()或postInvalidate()都会导致这个方法的执行

所以我们像下面这样调用,postInvalidate执行后,会去调computeScroll方法,而这个方法里再去调postInvalidate,这样就可以不断地去调用scrollTo方法了,直到mScroller动画结束,当然第一次时,我们需要手动去调用一次postInvalidate才会去调用

computeScroll方法

@Override

publicvoidcomputeScroll(){

if(mSputeScrollOffset()){

scrollTo(mScroller.getCurrX(),0);

postInvalidate();

}

}七、源码:

下面附上上面那个例子的源代码首先是MyViewGroup.javapackagecom.wb;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.LinearLayout;importandroid.widget.Scroller;publicclassMyViewGroupextendsLinearLayout{

privatebooleans1=true;

ScrollermScroller=null;

publicMyViewGroup(Contextcontext,AttributeSetattrs){

super(context,attrs);

mScroller=newScroller(context);

//TODOAuto-generatedconstructorstub

}

@Override

publicvoidcomputeScroll(){

if(mSputeScrollOffset()){

scrollTo(mScroller.getCurrX(),0);

postInvalidate();

}

}

publicvoidbeginScroll(){

if(!s1){

mScroller.startScroll(0,0,0,0,1000);

s1=true;

}else{

mScroller.startScroll(0,0,-500,0,1000);

s1=false;

}

invalidate();

}}然后是WheelActivity.javapackagecom.wb;importandroid.app.Activity;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.view.Gravity;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.AbsListView;importandroid.widget.AbsListView.LayoutParams;importandroid.widget.AbsListView.OnScrollListener;importandroid.widget.Adapter;importandroid.widget.BaseAdapter;importandroid.widget.ListView;importandroid.widget.TextView;publicclassWheelActivityextendsActivity{

privateListViewlistView=null;

privateMyViewGroupmyViewGroup;

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

myViewGroup=(MyViewGroup)findViewById(R.id.myviewGroup);

}

publicvoidscroll(View

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论