Android实现创意LoadingView动画效果
Android上的热火锅煮萝卜蔬菜的Loading动画效果。这是一个锅煮萝卜的Loading动画,效果仿照自之前IOS上看到的一个效果,觉得挺有意思,就移植过来了,在此完成了Dialog的样式,方便使用者作为LoadingView去使用。
关键性代码:
packageyellow5a5.demo.boilingloadingview.View; importandroid.animation.Animator; importandroid.animation.AnimatorListenerAdapter; importandroid.animation.ValueAnimator; importandroid.content.Context; importandroid.graphics.drawable.ClipDrawable; importandroid.os.Handler; importandroid.os.Message; importandroid.util.AttributeSet; importandroid.util.TypedValue; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.animation.Animation; importandroid.view.animation.AnimationUtils; importandroid.widget.ImageView; importandroid.widget.RelativeLayout; importjava.util.Timer; importjava.util.TimerTask; importyellow5a5.demo.boilingloadingview.R; /** *CreatedbyWeiwuon16/1/2. */ publicclassBoilingPanViewextendsRelativeLayout{ privateViewmView; privateClipDrawablemWaterDrawable; privateWaterViewmWaterView; privateFlameViewmFlameView; privateViewmPea1; privateViewmPea2; privateImageViewmPotato; privateImageViewmCarrot; privateImageViewmCoverView; privateAnimationmLeftInAnim; privateAnimationmRightInAnim; privatebooleanisRightRotate=true; privateValueAnimatormCoverAnim; privateBoilingAnimListenermBoilingAnimListener; publicinterfaceBoilingAnimListener{ //初始动画结束监听 voidonFirstAnimEnd(); } publicvoidsetBoilingAnimListener(BoilingAnimListenerl){ this.mBoilingAnimListener=l; } privateHandlermHandle=newHandler(newHandler.Callback(){ @Override publicbooleanhandleMessage(Messagemsg){ if(msg.what==0X0000){ mWaterDrawable.setLevel(mWaterDrawable.getLevel()+800); } returnfalse; } }); publicBoilingPanView(Contextcontext){ this(context,null); } publicBoilingPanView(Contextcontext,AttributeSetattrs){ this(context,attrs,0); } publicBoilingPanView(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); mView=LayoutInflater.from(context).inflate(R.layout.boiling_pan,this,true); initView(); initStartAnim(); initCoverAnim(); } privatevoidinitView(){ mWaterView=(WaterView)mView.findViewById(R.id.img_water); mFlameView=(FlameView)mView.findViewById(R.id.flame); mCoverView=(ImageView)mView.findViewById(R.id.img_cover); mPea1=mView.findViewById(R.id.img_pea1); mPea2=mView.findViewById(R.id.img_pea2); mPotato=(ImageView)mView.findViewById(R.id.img_potato); mCarrot=(ImageView)mView.findViewById(R.id.img_carrot); mWaterDrawable=(ClipDrawable)mWaterView.getDrawable(); } privatevoidinitStartAnim(){ mLeftInAnim=AnimationUtils.loadAnimation(getContext(),R.anim.left_in_anim); mRightInAnim=AnimationUtils.loadAnimation(getContext(),R.anim.right_in_anim); } /* 抖动的盖子 */ privatevoidinitCoverAnim(){ mCoverAnim=ValueAnimator.ofFloat(0f,1f,0f).setDuration(800); mCoverAnim.setRepeatMode(Animation.REVERSE); mCoverAnim.setRepeatCount(-1); mCoverAnim.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){ @Override publicvoidonAnimationUpdate(ValueAnimatoranimation){ floatvalue=(float)animation.getAnimatedValue(); if(isRightRotate){ mCoverView.setRotation(value*5); }else{ mCoverView.setRotation(-value*5); } mCoverView.setTranslationY(-value*TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,5,getResources().getDisplayMetrics())); } }); mCoverAnim.addListener(newAnimatorListenerAdapter(){ @Override publicvoidonAnimationRepeat(Animatoranimation){ super.onAnimationRepeat(animation); isRightRotate=!isRightRotate; } }); } /* 开始启动的动画 */ publicvoidbeginFirstInAnim(){ mPea1.setVisibility(VISIBLE); mPea2.setVisibility(VISIBLE); mPotato.setVisibility(VISIBLE); mCarrot.setVisibility(VISIBLE); mCoverView.setVisibility(VISIBLE); mPea1.startAnimation(mLeftInAnim); mPea2.startAnimation(mLeftInAnim); mPotato.startAnimation(mLeftInAnim); mCarrot.startAnimation(mRightInAnim); mCoverView.startAnimation(mRightInAnim); mRightInAnim.setAnimationListener(newAnimation.AnimationListener(){ @Override publicvoidonAnimationStart(Animationanimation){ } @Override publicvoidonAnimationEnd(Animationanimation){ if(mBoilingAnimListener!=null){ //这里是为了给外部留有操作的空间 mBoilingAnimListener.onFirstAnimEnd(); }else{ beginBoilingAnim(); } } @Override publicvoidonAnimationRepeat(Animationanimation){ } }); } /* 开始加水燃火动画 */ publicvoidbeginBoilingAnim(){ finalTimertimer=newTimer(); timer.schedule(newTimerTask(){ @Override publicvoidrun(){ mHandle.sendEmptyMessage(0X0000); if(mWaterDrawable.getLevel()>=10000){ timer.cancel(); } } },0,50); mFlameView.startFlaming(); mCoverAnim.start(); } /* 重置动画 */ publicvoidresetAnim(){ mWaterDrawable.setLevel(0); mWaterView.resetBubbleAnim(); mFlameView.stopFlaming(); mPea1.setVisibility(INVISIBLE); mPea2.setVisibility(INVISIBLE); mPotato.setVisibility(INVISIBLE); mCarrot.setVisibility(INVISIBLE); mCoverView.setVisibility(INVISIBLE); } }
希望本文所述对大家学习Android软件编程有所帮助。