仿WP8样式的Android ProgressBar
一个WP8样式的进度对话框。对应Android转圈圈的ProgressBar。使用方法和普通的dialog一样
publicclassWin8ProgressDialogextendsDialog{privateWPLoadingloading;publicWin8ProgressDialog(Contextcontext){super(context);}publicWin8ProgressDialog(Contextcontext,inttheme){super(context,theme);}publicvoidsetLoading(WPLoadingloading){this.loading=loading;}@Overridepublicvoidcancel(){loading.cancel();super.cancel();}publicWin8ProgressDialog(Contextcontext,booleancancelable,OnCancelListenercancelListener){super(context,cancelable,cancelListener);}publicstaticclassBuilder{privateContextmContext;privatebooleancanceledOnTouchOutside=true;privatebooleancancelable=true;publicBuilder(Contextcontext){mContext=context;}publicBuildersetCanceledOnTouchOutside(booleanflag){canceledOnTouchOutside=flag;returnthis;}publicBuildersetCancelable(booleanflag){cancelable=flag;returnthis;}publicWin8ProgressDialogcreate(){finalWin8ProgressDialogdialog=newWin8ProgressDialog(mContext,R.style.WPDialog);WPLoadingloading=newWPLoading(mContext);dialog.setLoading(loading);dialog.setCancelable(cancelable);dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);dialog.setCanceledOnTouchOutside(false);dialog.addContentView(loading,newLayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));loading.startAnimate();returndialog;}}}
WPLoading是Win8ProgressDialog显示的view,其实是一个包含了运动五个小蓝点的RelativeLayout,小蓝点的动画使用了一个先减速后加速的插值器DecelerateAccelerateStopInterpolator
publicclassWPLoadingextendsRelativeLayout{privateintsize=10;privateintdelay=300;privateintduration=3200;privateStringcolor="#0000ff";privateAnimatorSetanimatorSet=newAnimatorSet();publicWPLoading(Contextcontext){super(context);LayoutParamsparams0=newLayoutParams(DisplayUtil.getScreenWidth(context),size);Viewview=newView(context);view.setLayoutParams(params0);addView(view);}publicvoidstartAnimate(){LayoutParamsparams=newLayoutParams(size,size);animatorSet=newAnimatorSet();ArrayList<Animator>animators=newArrayList<Animator>();for(inti=0;i<5;i++){Viewview=newView(getContext());view.setBackgroundColor(Color.parseColor(color));addView(view);view.setLayoutParams(params);view.setX(-size);ObjectAnimatorheadAnimator=ObjectAnimator.ofFloat(view,"x",view.getX(),DisplayUtil.getScreenWidth(getContext()));headAnimator.setDuration(duration);headAnimator.setInterpolator(newDecelerateAccelerateStopInterpolator());headAnimator.setStartDelay(delay*i);headAnimator.setRepeatCount(-1);animators.add(headAnimator);}animatorSet.playTogether(animators);animatorSet.start();}publicWPLoading(Contextcontext,AttributeSetattrs){super(context,attrs);}publicWPLoading(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);}publicvoidcancel(){animatorSet.end();}//先减速再加速的插值器,在加速完成后会再停止一会儿,循环地进行这个动画,就和WP8的Loading样式一样了classDecelerateAccelerateStopInterpolatorimplementsandroid.view.animation.Interpolator{privatefloatmFactor=1.0f;privatefloattailFactor=0.6f;publicDecelerateAccelerateStopInterpolator(){}publicDecelerateAccelerateStopInterpolator(floatfactor){mFactor=factor;}publicfloatgetInterpolation(floatx){floatresult;if(x>tailFactor){result=1;}elseif(x>tailFactor/2){result=(float)Math.pow((x-tailFactor/2)*2/tailFactor,2*mFactor)/2+0.5f;}else{result=(float)(1.0f-Math.pow((tailFactor-2*x)/tailFactor,2*mFactor))/2;}returnresult;}}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。