您的位置:首页 > 移动开发 > Android开发

启动应用显示弹窗动画,倒计时后自动消失

2017-01-09 16:20 881 查看
项目里要求做一个启动应用时显示的弹窗动画,效果图如下



黑色矩形方框即是tvRight,动画显示的锚点。

粉色星星为textview,下面的动画要设置到textview上。左右摆动时要像第二排的效果,textview可以完整的显示;如果动画设置不对,则摆动过程中会被背景图掩盖,显示效果如第三排所示。

思路有两个:1.dialog2.popupWindow

dialog实现:

自定义一个Dia_Anim类。上代码。

public class Dia_Anim{
public View mContentView;
protected Context mContext;
private Dialog dialog;
private TextView tvDiaToast;
// 倒计时器,用来设置动画显示时间
private CountDownTimer cdt;
public Dia_Anim(Context context) {
mContentView = LayoutInflater.from(context).inflate(getLayoutId(), null);
dialog = new Dialog(context, R.style.ActionSheetDialogStyle);
dialog.setContentView(mContentView);
}
//在这里传入自定义的布局
protected int getLayoutId() {
return R.layout.dia_anim;
}

//定义一个view,定位在页面显示的位置,到达目标位置后左右微摆动,持续3秒后消失
public Dialog getDialog(){
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
//背景透明度
lp.dimAmount = 0.0f;
//lp.x和lp.y是dialog定位坐标
WindowManager wm =(WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
lp.x= width/2;
lp.y= height/2;
lp.width = width;//定义对话框的宽度为屏幕宽度
//对话框的透明度
lp.alpha = 0.9f;
dialog.getWindow().setAttributes(lp);

// 左右微摆动动画
TranslateAnimation animation;
//左右摇摆就是向一个方向移动,然后设置反方向的属性,再设置重复次数
animation = new TranslateAnimation(-15,15,0,0);
animation.setDuration(500);
animation.setRepeatCount(5);
animation.setRepeatMode(Animation.REVERSE);
//注意动画是定义给textView的。如果定义给mContentView会出现text左右摆动时被遮盖的效果。
dialog.findViewById(R.id.tv_dia_toast).startAnimation(animation);
((TextView)mContentView.findViewById(R.id.tv_dia_toast)).setTextSize(12);
cdt = new CountDownTimer(3000,1000) {
@Override
public void onTick(long millisUntilFinished) {

}
@Override
public void onFinish() {
//倒计时3秒结束时对话框消失
dialog.dismiss();
}
};
cdt.start();
return dialog;
}
}


对话框的布局文件dia_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/amin"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:background="@drawable/bg_dia_toast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:id="@+id/tv_dia_toast"
android:text="@string/dia_qrcode_toast"
android:textColor="@color/white"
android:paddingTop="@dimen/dia_qrcode_margin_top"
android:paddingBottom="@dimen/dia_qrcode_margin_bottom"
android:paddingLeft="@dimen/dia_qrcode_margin_left"
android:paddingRight="@dimen/dia_qrcode_margin_left"
android:layout_marginRight="@dimen/dia_qrcode_margin_right"/>
</RelativeLayout>


在Activity或者fragment里调用对话框

Dia_Anim dia_anim = new Dia_Anim(mContext);//需要传入一个context
dia_anim.getDialog().show();


难点:动画效果一定要设定给textView,dialog的背景设为透明,宽度定义为match_parent,背景图片也要设置给textView。这样动画就是文本框在对话框上左右晃动。

2.popupWindow实现

public class POP_Anim extends PopupWindow{
//背景activity
private Activity context;
//布局
private View mContentView;

public POP_Anim(Activity context) {
if(null!=context){
this.context = context;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mContentView = inflater.inflate(R.layout.dia_anim, null);
int w = context.getWindowManager().getDefaultDisplay().getWidth();
// 设置PopupWindow的View
this.setContentView(mContentView);
// 设置PopupWindow弹出窗体的宽
this.setWidth(w / 2 + 50);
// 设置PopupWindow弹出窗体的高
this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
}
}

public void showPopupWindow(View parent){
//左右微摆动动画
TranslateAnimation animation;
//左右摇摆就是向一个方向移动,然后设置反方向的属性,再设置重复次数
animation = new TranslateAnimation(-15,15,0,0);
//animation.setInterpolator(new OvershootInterpolator());
animation.setDuration(500);
animation.setRepeatCount(5);
animation.setRepeatMode(Animation.REVERSE);
mContentView.findViewById(R.id.tv_dia_toast).startAnimation(animation);
CountDownTimer cdt = new CountDownTimer(3000,1000) {
@Override
public void onTick(long millisUntilFinished) {

}
@Override
public void onFinish() {
dismiss();
}
};
cdt.start();
if (!this.isShowing()) {
// 以下拉方式显示popupwindow
this.showAsDropDown(parent, parent.getLayoutParams().width / 2, 18);
} else {
this.dismiss();
}
}
}


自定义popupWindow的布局也使用dia_anim.xml

在activity或fragment里调用时要用异步调用。否则会报空。

tvRight.post(new Runnable() {
@Override
public void run() {
POP_Anim popAnim = new POP_Anim(getActivity());
popAnim.showPopupWindow(tvRight);
}
});


tvRight是动画显示的锚点。

总结:使用popupwindow不需要计算动画显示的位置,只需设置动画所附的控件view;使用dialog需要计算动画显示的精确位置。

使用popupwindow需要异步显示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android