为了用户体验用好,App在网络请求时通常都会显示个进度显示圈圈,提示用户耐心等待,最脍炙人口的莫过于登录啦。
接下来我们就通过Dialog来实现,然后在BaseActivity,BaseFragment中提供方法供调用
先看看自定义的dialog
1 package com.example.kbr.utils; 2 3 import android.animation.ObjectAnimator; 4 import android.animation.ValueAnimator; 5 import android.app.Dialog; 6 import android.content.Context; 7 import android.os.Bundle; 8 import android.support.annotation.NonNull; 9 import android.support.annotation.Nullable; 10 import android.support.v7.widget.AppCompatImageView; 11 import android.view.animation.Animation; 12 import android.widget.ImageView; 13 14 /** 15 * Created by keranbin on 2017/12/19. 16 */ 17 18 public class LoadingDialog extends Dialog { 19 private ObjectAnimator objectAnimator = null; 20 private AppCompatImageView circle; 21 private long duration = 2000; 22 23 public LoadingDialog(@NonNull Context context) { 24 super(context); 25 } 26 27 public LoadingDialog(@NonNull Context context, int themeResId) { 28 super(context, themeResId); 29 } 30 31 protected LoadingDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) { 32 super(context, cancelable, cancelListener); 33 } 34 35 @Override 36 protected void onCreate(Bundle savedInstanceState) { 37 super.onCreate(savedInstanceState); 38 setContentView(R.layout.dialog_loading); 39 } 40 41 42 @Override 43 public void show() { 44 super.show(); 45 startAnim(); 46 setOnDismissListener(dialog -> { 47 endAnim(); 48 }); 49 } 50 51 /** 52 * 启动动画 53 */ 54 private void startAnim() { 55 setCanceledOnTouchOutside(false); 56 circle = findViewById(R.id.loading); 57 objectAnimator = ObjectAnimator.ofFloat(circle, "rotation", 0.0f, 360.0f); 58 //设置动画时间 59 objectAnimator.setDuration(duration); 60 //设置动画重复次数,这里-1代表无限 61 objectAnimator.setRepeatCount(Animation.INFINITE); 62 //设置动画循环模式。 63 objectAnimator.setRepeatMode(ValueAnimator.RESTART); 64 objectAnimator.start(); 65 } 66 67 68 /** 69 * 结束动画 70 */ 71 private void endAnim() { 72 objectAnimator.end(); 73 objectAnimator = null; 74 circle = null; 75 } 76 77 }
布局也非常简单
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 android:layout_width="match_parent" 5 android:layout_height="wrap_content" 6 android:alpha="0.4" 7 android:background="#000000" 8 android:gravity="center" 9 android:orientation="vertical" 10 android:paddingBottom="20dp" 11 android:paddingLeft="16dp" 12 android:paddingRight="16dp" 13 android:paddingTop="20dp"> 14 15 <android.support.v7.widget.AppCompatImageView 16 android:id="@+id/loading" 17 android:layout_width="48dp" 18 android:layout_height="48dp" 19 app:srcCompat="@drawable/loading" /> 20 </RelativeLayout>
BaseActivity,BaseFragment中提供方法
1 private LoadingDialog dialog; 2 3 4 public void showLoading(){ 5 if (dialog == null) { 6 dialog = new LoadingDialog(this); 7 } 8 dialog.show(); 9 } 10 11 12 public void clearLoading(){ 13 if (dialog != null) { 14 dialog.dismiss(); 15 } 16 }
在需要用到的地方调用即可
1 showLoading(); 2 3 //执行网络耗时任务(这里时模拟) 4 new Thread(new Runnable() { 5 @Override 6 public void run() { 7 try { 8 Thread.sleep(10000); 9 clearLoading(); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 } 14 }).start();