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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。