一个WP8样式的进度对话框。对应Android转圈圈的ProgressBar。使用方法和普通的dialog一样
public class Win8ProgressDialog extends Dialog {
private WPLoading loading;
public Win8ProgressDialog(Context context) {
super(context);
}
public Win8ProgressDialog(Context context, int theme) {
super(context, theme);
}
public void setLoading(WPLoading loading) {
this.loading = loading;
}
@Override
public void cancel() {
loading.cancel();
super.cancel();
}
public Win8ProgressDialog(Context context, boolean cancelable,
OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
public static class Builder {
private Context mContext;
private boolean canceledOnTouchOutside = true;
private boolean cancelable = true;
public Builder(Context context) {
mContext = context;
}
public Builder setCanceledOnTouchOutside(boolean flag) {
canceledOnTouchOutside = flag;
return this;
}
public Builder setCancelable(boolean flag) {
cancelable = flag;
return this;
}
public Win8ProgressDialog create() {
final Win8ProgressDialog dialog = new Win8ProgressDialog(mContext,
R.style.WPDialog);
WPLoading loading = new WPLoading(mContext);
dialog.setLoading(loading);
dialog.setCancelable(cancelable);
dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);
dialog.setCanceledOnTouchOutside(false);
dialog.addContentView(loading, new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
loading.startAnimate();
return dialog;
}
}
}
WPLoading是Win8ProgressDialog显示的view,其实是一个包含了运动五个小蓝点的RelativeLayout,小蓝点的动画使用了一个先减速后加速的插值器DecelerateAccelerateStopInterpolator
public class WPLoading extends RelativeLayout {
private int size = 10;
private int delay = 300;
private int duration = 3200;
private String color = "#0000ff";
private AnimatorSet animatorSet = new AnimatorSet();
public WPLoading(Context context) {
super(context);
LayoutParams params0 = new LayoutParams(
DisplayUtil.getScreenWidth(context), size);
View view = new View(context);
view.setLayoutParams(params0);
addView(view);
}
public void startAnimate() {
LayoutParams params = new LayoutParams(size, size);
animatorSet = new AnimatorSet();
ArrayList<Animator> animators = new ArrayList<Animator>();
for (int i = 0; i < 5; i++) {
View view = new View(getContext());
view.setBackgroundColor(Color.parseColor(color));
addView(view);
view.setLayoutParams(params);
view.setX(-size);
ObjectAnimator headAnimator = ObjectAnimator.ofFloat(view, "x",
view.getX(), DisplayUtil.getScreenWidth(getContext()));
headAnimator.setDuration(duration);
headAnimator
.setInterpolator(new DecelerateAccelerateStopInterpolator());
headAnimator.setStartDelay(delay * i);
headAnimator.setRepeatCount(-1);
animators.add(headAnimator);
}
animatorSet.playTogether(animators);
animatorSet.start();
}
public WPLoading(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WPLoading(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void cancel() {
animatorSet.end();
}
// 先减速再加速的插值器,在加速完成后会再停止一会儿,循环地进行这个动画,就和WP8的Loading样式一样了
class DecelerateAccelerateStopInterpolator implements
android.view.animation.Interpolator {
private float mFactor = 1.0f;
private float tailFactor = 0.6f;
public DecelerateAccelerateStopInterpolator() {
}
public DecelerateAccelerateStopInterpolator(float factor) {
mFactor = factor;
}
public float getInterpolation(float x) {
float result;
if (x > tailFactor) {
result = 1;
} else if (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;
}
return result;
}
}
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。