安卓快速实现dialog(toast)对错控件动画弹窗(解析+代码)

#安卓快速实现dialog(toast)对错控件动画弹窗(解析+代码)

博主做的教育类APP,教育类肯定有包含语数英,这些yingshi科目就有做题类型,自然就有相应的做题,校验做题答案需求,有校验判断就有对错之分,怎么比较好的反应并给用户良好的用户体验,就提出对错动画特效需求了

下载:本文相应代码

如图
对错GIF

一 步骤之触发页面(MainActivity )

MainActivity 页面代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mBt;
    private Button mBt2;
    private Animation mAnimation;
    private ImageView mImg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBt = findViewById(R.id.bt);
        mBt2 = findViewById(R.id.bt2);
        mBt.setOnClickListener(this);
        mBt2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt:
                new AnimDialog(this);
                break;
            case R.id.bt2:
                MyToast.showToast(this, true);
                break;
        }
    }
}

MainActivity对应布局页面activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <Button
        android:id="@+id/bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="动画实现一"
        />
    <Button
        android:id="@+id/bt2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="动画实现二"
        />

</LinearLayout>

二 自定义动画(AnimDialog)

AnimDialog代码

public class AnimDialog extends Dialog {

    private Context mContext;
    private ImageView mImg;
    private Animation mAnimation;

    public AnimDialog(@NonNull Context context) {
        super(context, R.style.dialog_full);
        mContext = context;
        setContentView(R.layout.activity_anim);
        init();
        setOnListener();
    }



    private void setOnListener() {
        mAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                mImg.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                mImg.setVisibility(View.GONE);
                dismiss();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }

    private void init() {
        mImg = findViewById(R.id.img1);
        mAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim_small);
        mImg.startAnimation(mAnimation);
        
        //按空白处不能取消动画
        setCanceledOnTouchOutside(false);
        show();
    }
}

AnimDialog 对应布局 activity_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ImageView
        android:id="@+id/img1"
        android:visibility="visible"
        android:background="@drawable/correct"
        android:layout_centerInParent="true"
        android:layout_width="200dp"
        android:layout_height="200dp"
        />

</RelativeLayout>

相关styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <!--自定义Dialog样式-->
    <style name="dialog_full">
        <item name="android:windowIsFloating">true</item>   <!--是否悬浮在界面上-->
        <item name="android:windowIsTranslucent">true</item>   <!--是否半透明-->
        <item name="android:windowNoTitle">true</item> <!--是否有标题-->
        <item name="android:windowBackground">@android:color/transparent</item>  <!--窗口背景色透明-->
        <item name="android:backgroundDimEnabled">false</item>  <!--背景是否模糊显示-->
    </style>

</resources>

动画anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:fillAfter="false">
    <!--fillBefore是指动画结束时画面停留在此动画的第一帧;-->
    <!--fillAfter是指动画结束是画面停留在此动画的最后一帧。-->

    <!--
        fromXDelta,fromYDelta   起始时X,Y座标,屏幕右下角的座标是X:320,Y:480
        toXDelta, toYDelta     动画结束时X,Y的座标
        interpolator            指定动画插入器,常见的有
                                加速减速插入器         accelerate_decelerate_interpolator
                                加速插入器             accelerate_interpolator,
                                减速插入器             decelerate_interpolator。
        fromXScale,fromYScale, 动画开始前X,Y的缩放,0.0为不显示,  1.0为正常大小
        toXScale,toYScale,    动画最终缩放的倍数, 1.0为正常大小,大于1.0放大
        pivotX,  pivotY        动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从屏幕中间开始
        startOffset,           动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒
        duration,              一次动画效果消耗的时间,单位毫秒,值越小动画速度越快
        repeatCount,           动画重复的计数,动画将会执行该值+1次
        repeatMode,            动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变
        -->

    <!--先放大-->
    <scale
        android:duration="300"
        android:fromXScale="0"
        android:fromYScale="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1"
        android:toYScale="1" />
    <!--然后缩小-->
    <scale
        android:duration="300"
        android:fromXScale="1"
        android:fromYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:startOffset="800"
        android:toXScale="0"
        android:toYScale="0" />
</set>

三 自定义动画(MyToast)

public class MyToast {

    private static Animation mAnimation;

    @SuppressLint("WrongConstant")
    public static void showToast(Activity activity, Boolean b) {
        LayoutInflater layoutInflater = activity.getLayoutInflater();
        View view = layoutInflater.inflate(R.layout.activity_anim, null);
        final ImageView img = view.findViewById(R.id.img1);
        //设置背景
        if (b) {

        } else {

        }

        mAnimation = AnimationUtils.loadAnimation(activity, R.anim.anim);
        img.startAnimation(mAnimation);

        mAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                img.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                img.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

        Toast toast = new Toast(activity);
        toast.setGravity(Gravity.CENTER, 0, 0);
        toast.setDuration(1500);
        toast.setView(view);
        toast.show();

    }
}

尾言

博主比较喜欢上实例代码,方便有须有的读者,一看就明,Demo与完整核心代码如上.如有不当之处,或者BUG请读者不吝赐教,留言博主,谢谢.

下载:本文相应代码

猜你喜欢

转载自blog.csdn.net/qXing123456789/article/details/82628559