在网络情况较差时,网络请求可能会耗费大量时间。 为了提升用户体验,在执行网络请求开始时,App会弹出一个加载动画(Loader)。网络请求结束后,加载动画(Loader)消失。 Loader框架采用“建造者模式”(Builder Pattern)。
LoaderCreator用于设置Loading的相关参数(如,样式) LoaderCreator是Loading的唯一生成器。
package com.qilu.core.ui.loader; import android.content.Context; import com.wang.avi.AVLoadingIndicatorView; import com.wang.avi.Indicator; import java.util.WeakHashMap; public final class LoaderCreator { private static final WeakHashMap<String, Indicator> LOADING_MAP = new WeakHashMap<>(); static AVLoadingIndicatorView create(String type, Context context) { final AVLoadingIndicatorView avLoadingIndicatorView = new AVLoadingIndicatorView(context); if (LOADING_MAP.get(type) == null) { final Indicator indicator = getIndicator(type); LOADING_MAP.put(type, indicator); } avLoadingIndicatorView.setIndicator(LOADING_MAP.get(type)); return avLoadingIndicatorView; } private static Indicator getIndicator(String name) { if (name == null || name.isEmpty()) { return null; } final StringBuilder drawableClassName = new StringBuilder(); if (!name.contains(".")) { final String defaultPackageName = AVLoadingIndicatorView.class.getPackage().getName(); drawableClassName.append(defaultPackageName) .append(".indicators") .append("."); } drawableClassName.append(name); try { final Class<?> drawableClass = Class.forName(drawableClassName.toString()); return (Indicator) drawableClass.newInstance(); } catch (Exception e) { e.printStackTrace(); return null; } } }枚举类型LoaderStyle保存Loader的样式
package com.qilu.core.ui.loader; @SuppressWarnings("unused") public enum LoaderStyle { BallPulseIndicator, BallGridPulseIndicator, BallClipRotateIndicator, BallClipRotatePulseIndicator, SquareSpinIndicator, BallClipRotateMultipleIndicator, BallPulseRiseIndicator, BallRotateIndicator, CubeTransitionIndicator, BallZigZagIndicator, BallZigZagDeflectIndicator, BallTrianglePathIndicator, BallScaleIndicator, LineScaleIndicator, LineScalePartyIndicator, BallScaleMultipleIndicator, BallPulseSyncIndicator, BallBeatIndicator, LineScalePulseOutIndicator, LineScalePulseOutRapidIndicator, BallScaleRippleIndicator, BallScaleRippleMultipleIndicator, BallSpinFadeLoaderIndicator, LineSpinFadeLoaderIndicator, TriangleSkewSpinIndicator, PacmanIndicator, BallGridBeatIndicator, SemiCircleSpinIndicator, CustomIndicator }类QiluLoader是Loader实例的具体操作类,相关操作包括创建、显示、隐藏。
package com.qilu.core.ui.loader; import android.content.Context; import android.support.v7.app.AppCompatDialog; import android.view.Gravity; import android.view.Window; import android.view.WindowManager; import com.qilu.core.R; import com.qilu.core.util.dimen.DimenUtil; import com.wang.avi.AVLoadingIndicatorView; import java.util.ArrayList; public class QiluLoader { private static final int LOADER_SIZE_SCALE = 8; //缩放比 private static final int LOADER_OFFSET_SCALE = 10; //偏移量 private static final String DEFAULT_LOADER = LoaderStyle.BallClipRotatePulseIndicator.name(); private static final ArrayList<AppCompatDialog> LOADERS = new ArrayList<>(); public static void showLoading(Context context, Enum<LoaderStyle> type) { showLoading(context, type.name()); } public static void showLoading(Context context, String type) { final AppCompatDialog dialog = new AppCompatDialog(context, R.style.dialog); final AVLoadingIndicatorView avLoadingIndicatorView = LoaderCreator.create(type, context); dialog.setContentView(avLoadingIndicatorView); int deviceWidth = DimenUtil.getScreenWidth(); int deviceHeight = DimenUtil.getScreenHeight(); final Window dialogWindow = dialog.getWindow(); if (dialogWindow != null) { final WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.width = deviceWidth / LOADER_SIZE_SCALE; lp.height = deviceHeight / LOADER_SIZE_SCALE; lp.height = lp.height + deviceHeight / LOADER_OFFSET_SCALE; lp.gravity = Gravity.CENTER; } LOADERS.add(dialog); dialog.show(); } public static void showLoading(Context context) { showLoading(context, DEFAULT_LOADER); } public static void stopLoading() { for (AppCompatDialog dialog : LOADERS) { if (dialog != null) { if (dialog.isShowing()) { dialog.cancel(); //此处不使用dialog.dismiss(),因为cancel()不只是让Loading消失,还可以加入其它的回调操作。 } } } } }