LoadingActivity.class
public class LoadingActivity extends Activity {
private LoadingDialog mLoadingDialog;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading);
initDialog();
}
private void initDialog() {
mLoadingDialog = new LoadingDialog(this, R.style.Dialog_Fullscreen);
mLoadingDialog.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
styles.xml 此处dialog类型可以设置为固定模板
<style name="Dialog_Fullscreen">
<item name="android:windowIsFloating">true</item> //解决dialog.setCanceledOnTouchOutside的问题
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->//dialog的背景一定要设置为透明,不然再设置为其他颜色背景是总是无效的。
</style>
LoadingDialog.class
public class LoadingDialog extends Dialog {
private ImageView mLoadingView;
public LoadingDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_loading);
mLoadingView = findViewById(R.id.loading_iv);
((AnimationDrawable) mLoadingView.getBackground()).start();
WindowManager.LayoutParams attributes = getWindow().getAttributes();
attributes.dimAmount = 0.6f;
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
setCanceledOnTouchOutside(true);
}
@Override
protected void onStop() {
super.onStop();
((AnimationDrawable) mLoadingView.getBackground()).stop();
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/d300"
android:layout_height="@dimen/d300"
android:layout_gravity="center"
android:background="@drawable/loading_dialog_bg"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/loading_iv"
android:layout_width="@dimen/d120"
android:layout_height="@dimen/d120"
android:background="@mipmap/list_loading_01"/>
// android:background="@drawable/loading"
<TextView
android:id="@+id/tv_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="连接中..."
android:textColor="@color/color_white"
android:textSize="16sp"/>
</LinearLayout>
知识点一:动画的显示
显示方式①: 将动画列表作为loading的背景,并设置动画开始和停止。
loading.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/list_loading" android:duration="80"/>
<item android:drawable="@mipmap/list_loading_01" android:duration="80"/>
<item android:drawable="@mipmap/list_loading_02" android:duration="80"/>
<item android:drawable="@mipmap/list_loading_03" android:duration="80"/>
<item android:drawable="@mipmap/list_loading_04" android:duration="80"/>
<item android:drawable="@mipmap/list_loading_05" android:duration="80"/>
<item android:drawable="@mipmap/list_loading_06" android:duration="80"/>
<item android:drawable="@mipmap/list_loading_07" android:duration="80"/>
</animation-list>
fragment_loading.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/d300"
android:layout_height="@dimen/d300"
android:layout_gravity="center"
android:background="@drawable/loading_dialog_bg"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/loading_iv"
android:layout_width="@dimen/d120"
android:layout_height="@dimen/d120"
android:background="@drawable/loading"/>
<TextView
android:id="@+id/tv_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="连接中..."
android:textColor="@color/color_white"
android:textSize="16sp"/>
</LinearLayout>
设置开启及关闭动画
((AnimationDrawable) mLoadingView.getBackground()).start();
((AnimationDrawable) mLoadingView.getBackground()).stop();
显示方式②:使用一张图片进行无限旋转,产生动画效果
rotate_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:duration="1000"//fromDegrees 到 toDegrees 角度所花费的时间,通常设置为1000
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"//设置旋转速度,此处为匀速
android:pivotX="50%" //旋转中心的X坐标
android:pivotY="50%" //旋转中心的Y坐标
android:repeatCount="infinite" //重复的次数,默认为0,必须是int,可以为-1表示不停止
android:toDegrees="360"
/>
</set>
//android:repeatMode 重复的模式,默认为restart,即重头开始重新运行,可以为reverse即从结束开始向前重新运行。在android:repeatCount大于0或为infinite时生效
mLoadingView = findViewById(R.id.loading_iv);
Animation rotateAnimation = AnimationUtils.loadAnimation(mContext, R.anim.rotate_anim);
rotateAnimation.setInterpolator(new LinearInterpolator());//设置轮播的不进行停顿
mLoadingView.startAnimation(rotateAnimation);
知识点二:setCanceledOnTouchOutside失效的解决
<item name="android:windowIsFloating">true</item>
遇坑的地方:之前设置dialog的背景的时候,总是不成功,因为没有将dialog的默认背景设置为透明,即style.xm中 Dialog_Fullscreen的属性一定要有以下item.
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->