效果:
先简单了解下Lottie动画:
github: lottieAndroid
获取动画资源网站:Lottie动画获取
简单使用:(lottie功能很强大,这里说简单使用,其他的使用请自行查看)
res目录下新建raw,把自己的lottie动画(json格式)放到里边
xml中:
<com.airbnb.lottie.LottieAnimationViewandroid:id="@+id/base_lottie_anim"android:layout_width="wrap_content"android:layout_height="wrap_content"app:lottie_autoPlay="true" 是否自动播放app:lottie_loop="true" 是否循环播放app:lottie_rawRes="@raw/loading_anim" 资源路径/>
代码中动态切换动画:
//绑定控件lottieAnimationView = findViewById(R.id.base_lottie_anim); //设置动画public void setAnim(int rawResId) {
//传入R.raw.xxx资源名就可以LottieCompositionFactory.fromRawRes(getContext(), rawResId).addListener(new LottieListener<LottieComposition>() {
@Overridepublic void onResult(LottieComposition result) {
lottieAnimationView.setComposition(result);}});}//清理数据(可以放在Base类的onDestory中)public void removeAnim() {
if (lottieAnimationView != null) {
lottieAnimationView.clearAnimation();}}
实现自定义的Progress:
自定义dialog主题样式:
<!--dialog底色透明--><style name="dialogTransparent" parent="@android:style/Theme.Dialog"><item name="android:windowFrame">@null</item> <!--边框--><item name="android:windowIsFloating">true</item> <!--是否浮现在activity之上--><item name="android:windowBackground">@android:color/transparent</item> <!--dialog底色背景透明--><item name="android:windowNoTitle">true</item> <!--是否无标题栏--><item name="android:backgroundDimEnabled">true</item> <!--大背景色是否不透明--></style>
xml代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.airbnb.lottie.LottieAnimationViewandroid:id="@+id/base_lottie_anim"android:layout_width="wrap_content"android:layout_height="wrap_content"app:lottie_autoPlay="true"app:lottie_loop="true"app:lottie_rawRes="@raw/loading_anim"/>
</LinearLayout>
java代码:
/*** 自定义加载框progress*/
public class MyProgressDialog extends Dialog {
private LottieAnimationView lottieAnimationView;public MyProgressDialog(@NonNull Context context) {
super(context);}public MyProgressDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);}@Overrideprotected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//不用style就加上这两句,用了style就不需要这两句//Objects.requireNonNull(getWindow()).requestFeature(Window.FEATURE_NO_TITLE); // 设置dialog无标题栏//getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //设置背景色透明setContentView(R.layout.base_my_progress_dialog);lottieAnimationView = findViewById(R.id.base_lottie_anim);setDialogStyle();}//清理数据public void removeAnim() {
if (lottieAnimationView != null) {
lottieAnimationView.clearAnimation();}}//设置动画public void setAnim(int rawResId) {
LottieCompositionFactory.fromRawRes(getContext(), rawResId).addListener(new LottieListener<LottieComposition>() {
@Overridepublic void onResult(LottieComposition result) {
lottieAnimationView.setComposition(result);}});}//设置dialog风格private void setDialogStyle() {
WindowManager.LayoutParams layoutParams = Objects.requireNonNull(getWindow()).getAttributes();layoutParams.gravity = Gravity.CENTER; //设置dialog居中Resources resources = getContext().getResources();DisplayMetrics displayMetrics = resources.getDisplayMetrics();int width = displayMetrics.widthPixels; //获取屏幕宽度int height = displayMetrics.heightPixels; //获取屏幕高度getWindow().setLayout(width / 3, height / 6); //设置宽高setCanceledOnTouchOutside(true);//设置dialog点击空白可取消}
}