NiftyDialogEffects:集成了多种动画效果的Dialog控件

在这个网站上有很多用js实现的对话框效果:http://tympanus.net/Development/ModalWindowEffects/

现在有人做出了相同效果的android版本,几乎和上面的一模一样,界面如下:

动画效果:

Image

要查看更多的动画效果请参考上面给出的网站链接。

该项目的git地址为:https://github.com/sd6352051/NiftyDialogEffects

可能该项目是用android studio创建的吧,但是因为被墙的原因android studio不是很好用。虽然不能直接导入eclipse,不过相信有点基础知识的都会转为eclipse项目的。

用法示例;

1
2
3
4
5
NiftyDialogBuilder dialogBuilder=NiftyDialogBuilder.getInstance( this );
dialogBuilder
     .withTitle( "Modal Dialog" )
     .withMessage( "This is a modal Dialog." )
     .show();

和alertdialog的用法类似。上面是最简单的用法,如果要运用动画等更多其他参数设置,可以参考下面的用法:

更多参数设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
dialogBuilder
     .withTitle( "Modal Dialog" )                                  //.withTitle(null)  no title
     .withTitleColor( "#FFFFFF" )                                  //def
     .withDividerColor( "#11000000" )                              //def
     .withMessage( "This is a modal Dialog." )                     //.withMessage(null)  no Msg
     .withMessageColor( "#FFFFFF" )                                //def
     .withIcon(getResources().getDrawable(R.drawable.icon))
     .withDuration(700)                                          //def
     .withEffect(effect)                                         //def Effectstype.Slidetop
     .withButton1Text( "OK" )                                      //def gone
     .withButton2Text( "Cancel" )                                  //def gone
     .isCancelableOnTouchOutside( true )                           //def    | isCancelable(true)
     .setCustomView(R.layout.custom_view,v.getContext())         //.setCustomView(View or ResId,context)
     .setButton1Click( new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             Toast.makeText(v.getContext(), "i'm btn1" , Toast.LENGTH_SHORT).show();
                     }
     })
     .setButton2Click( new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             Toast.makeText(v.getContext(), "i'm btn2" ,Toast.LENGTH_SHORT).show();
         }
     })
     .show();

简要的介绍下该项目的实现方法:

dialog部分的代码很少,其实就是自定义了一个继承子Dialog的NiftyDialogBuilder,并实现了DialogInterface。

其中非常重要的是

1
2
3
4
5
6
7
8
9
10
this .setOnShowListener( new OnShowListener() {
     @Override
     public void onShow(DialogInterface dialogInterface) {
         mLinearLayoutView.setVisibility(View.VISIBLE);
         if (type== null ){
             type=Effectstype.Slidetop;
         }
         start(type);
     }
});

监听对话框开始显示的事件,然后设置动画类型,之后调用start方法将动画效果运用到dialog的contentview中:

1
2
3
4
5
6
7
private void start(Effectstype type){
     BaseEffects animator = type.getAnimator();
     if (mDuration != -1){
         animator.setDuration(Math.abs(mDuration));
     }
     animator.start(mRelativeLayoutView);
}

mRelativeLayoutView就是dialog的contentview的主要部分,Effectstype可以获得各种动画类型,每一种动画类型都是有专门的类实现的。

动画类型部分:

有如下动画类型:

所有动画类型都继承子抽象类BaseEffects

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public abstract  class BaseEffects {
     private static final int DURATION = 1 * 700;
     protected long mDuration =DURATION ;
     private AnimatorSet mAnimatorSet;
     {
         mAnimatorSet = new AnimatorSet();
     }
     protected abstract void setupAnimation(View view);
     public void start(View view) {
         reset(view);
         setupAnimation(view);
         mAnimatorSet.start();
     }
     public void reset(View view) {
         ViewHelper.setPivotX(view, view.getMeasuredWidth() / 2.0f);
         ViewHelper.setPivotY(view, view.getMeasuredHeight() / 2.0f);
     }
     public AnimatorSet getAnimatorSet() {
         return mAnimatorSet;
     }
                                                                                                                                      
     public void setDuration(long duration) {
         this .mDuration = duration;
     }
}

以SlideTop为例介绍是如何实现该抽象类的:

1
2
3
4
5
6
7
8
9
public class SlideTop extends BaseEffects{
     @Override
     protected void setupAnimation(View view) {
         getAnimatorSet().playTogether(
                 ObjectAnimator.ofFloat(view, "translationY" , -300, 0).setDuration(mDuration),
                 ObjectAnimator.ofFloat(view, "alpha" , 0, 1).setDuration(mDuration*3/2)
         );
     }
}

这些动画放到一个叫Effectstype的枚举类中,然后需要的时候直接调用type.getAnimator()方法就能得到动画的实例,就像start方法中做的那样。

 

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0812/1644.html

转载于:https://www.cnblogs.com/shanzei/p/3907577.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值