#安卓动画对错弹窗快速实现dialog与toast控件(解析+代码)
博主做的教育类APP,教育类肯定有包含语数英,这些yingshi科目就有做题类型,自然就有相应的做题,校验做题答案需求,有校验判断就有对错之分,怎么比较好的反应并给用户良好的用户体验,就提出对错动画特效需求了
下载:本文相应代码
如图
一 步骤之触发页面(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请读者不吝赐教,留言博主,谢谢.
下载:本文相应代码