android开发通过Scroller实现过渡滑动效果操作示例
本文实例讲述了android开发通过Scroller实现过渡滑动效果。分享给大家供大家参考,具体如下:
主要介绍一下Scroller这个类,它可以实现过渡滑动的效果,使滑动看起来不是那么生硬,当然它用大量的重绘来实现,invalidate();通过源码看:
看构造方法
/**
*CreateaScrollerwiththedefaultdurationandinterpolator.
*/
publicScroller(Contextcontext){
this(context,null);
}
/**
*CreateaScrollerwiththespecifiedinterpolator.Iftheinterpolatoris
*null,thedefault(viscous)interpolatorwillbeused."Flywheel"behaviorwill
*beineffectforappstargetingHoneycombornewer.
*/
publicScroller(Contextcontext,Interpolatorinterpolator){
this(context,interpolator,
context.getApplicationInfo().targetSdkVersion>=Build.VERSION_CODES.HONEYCOMB);
}
/**
*CreateaScrollerwiththespecifiedinterpolator.Iftheinterpolatoris
*null,thedefault(viscous)interpolatorwillbeused.Specifywhetheror
*nottosupportprogressive"flywheel"behaviorinflinging.
*/
publicScroller(Contextcontext,Interpolatorinterpolator,booleanflywheel){
mFinished=true;
if(interpolator==null){
mInterpolator=newViscousFluidInterpolator();
}else{
mInterpolator=interpolator;
}
mPpi=context.getResources().getDisplayMetrics().density*160.0f;
mDeceleration=computeDeceleration(ViewConfiguration.getScrollFriction());
mFlywheel=flywheel;
mPhysicalCoeff=computeDeceleration(0.84f);//lookandfeeltuning
}
我们用默认的就行,传个context就行了,其他的什么差值器,先不管了
然后调用startScroll,传递我们歧视滑动位置和滑动的偏移量,还有可选的默认持续时间,默认为250毫秒
这个方法是用来赋值的,接下来会调用invalidate()进行重新绘制,然后就会onDraw(),这时候会调用
computeScroll()这个方法,我们重写这个方法,computeScrollOffset()是判断动画有没有结束的一个方法,没结束的时候,我们根据滑动的偏移位置进行移动也就是scrollto到scroller的当前位置,再次调用invalidate(),由此无数的重回进行拼接形成了平滑的滑动
/**
*Callthiswhenyouwanttoknowthenewlocation.Ifitreturnstrue,
*theanimationisnotyetfinished.
*/
publicbooleancomputeScrollOffset(){
if(mFinished){
returnfalse;
}
inttimePassed=(int)(AnimationUtils.currentAnimationTimeMillis()-mStartTime);
if(timePassed
publicvoidstartScroll(intstartX,intstartY,intdx,intdy){
startScroll(startX,startY,dx,dy,DEFAULT_DURATION);
}
publicvoidstartScroll(intstartX,intstartY,intdx,intdy,intduration){
mMode=SCROLL_MODE;
mFinished=false;
mDuration=duration;
mStartTime=AnimationUtils.currentAnimationTimeMillis();
mStartX=startX;
mStartY=startY;
mFinalX=startX+dx;
mFinalY=startY+dy;
mDeltaX=dx;
mDeltaY=dy;
mDurationReciprocal=1.0f/(float)mDuration;
}
publicclassMoveFreeViewextendsView{
privateintmovedX;
privateintmovedY;
privateScrollermScroller;
publicMoveFreeView(Contextcontext){
super(context);
}
publicMoveFreeView(Contextcontext,@NullableAttributeSetattrs){
super(context,attrs);
mScroller=newScroller(context);
}
publicMoveFreeView(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
//获取触摸点到边界坐标
intx=(int)event.getX();
inty=(int)event.getY();
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
movedX=x;
movedY=y;
break;
caseMotionEvent.ACTION_MOVE:
intoffsetX=x-movedX;
intoffsetY=y-movedY;
layout(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);
break;
}
returnsuper.onTouchEvent(event);
}
//供外界调用通过传递x,y的的滑动距离
publicvoidsmoothScrollTo(intdestinyX,intdestinyY){
//向右侧,下方滑动,请传递负值
intscrollX=getScrollX();
intscrollY=getScrollY();
intdelta=destinyX-scrollX;
intdeltaY=destinyY-scrollY;
mScroller.startScroll(scrollX,scrollY,delta,deltaY,5000);
invalidate();
}
@Override
publicvoidcomputeScroll(){
super.computeScroll();
//true则表示滑动未结束
if(mScroller.computeScrollOffset()){
((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
invalidate();
}
}
}
privateMoveFreeViewbutton;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(MoveFreeView)findViewById(R.id.custon);
button.smoothScrollTo(-400,-300);
//button.startAnimation(AnimationUtils.loadAnimation(this,R.anim.translate));
//ObjectAnimatoranimtor1=ObjectAnimator.ofFloat(button,"translationX",0,300);
//ObjectAnimatoranimtor2=ObjectAnimator.ofFloat(button,"translationY",0,300);
//ObjectAnimatoranimator3=ObjectAnimator.ofFloat(button,"rotationX",0.0f,360f);
//ObjectAnimatoranimator4=ObjectAnimator.ofFloat(button,"scaleX",1.5f,0.5f);
//AnimatorSetset=newAnimatorSet();
//set.setDuration(5000);
//set.playTogether(animtor1,animtor2,animator3,animator4);
//set.addListener(newAnimator.AnimatorListener(){
//@Override
//publicvoidonAnimationStart(Animatoranimator){
//
//}
//
//@Override
//publicvoidonAnimationEnd(Animatoranimator){
////动画结束时做一些事情
//}
//
//@Override
//publicvoidonAnimationCancel(Animatoranimator){
//
//}
//
//@Override
//publicvoidonAnimationRepeat(Animatoranimator){
//
//}
//});
//set.start();
}
}
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。