Dialog 自定义一些常见效果

项目地址: Dialog
简介:自定义一些常见的 Dialog 效果,居中显示、顶部显示、仿 IOS 版淘宝、回弹效果、宽度和高度占屏比等

自定义一些常见的Dialog效果,居中显示、顶部显示、仿IOS版淘宝、回弹效果、宽度和高度占屏比等,先看效果。






SimpleDialog

package org.alex.dialog.base;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import org.alex.alexlibrary.R;
import org.alex.dialog.annotation.AnimType;
/**
 * 作者:Alex
 * 时间:2016年09月03日    21:29
 * 简述:
 */
@SuppressWarnings("all")
public abstract class SimpleDialog<D extends SimpleDialog> extends BaseDialog<D> implements View.OnClickListener {
    public SimpleDialog(Context context) {
        super(context,R.style.alex_dialog_base_light_style);
    }
    public SimpleDialog(Context context, int theme) {
        super(context, theme);
    }
    /**
     * 显示对话框,无动画
     */
    @Override
    public void show() {
        if (Gravity.BOTTOM == gravity) {
            show(AnimType.BOTTOM_2_TOP);
        } else if (Gravity.TOP == gravity) {
            show(AnimType.TOP_2_BOTTOM);
        } else if (Gravity.CENTER == gravity) {
            show(animType);
        } else {
            super.show();
        }
    }
    /**
     * 显示对话框,强制转换对话框的动画类型
     */
    public void show(@AnimType int animType) {
        Window window = getWindow();
        /*如果根据  AnimType 的类型,强制选择Dialog出现的位置*/
        if (AnimType.BOTTOM_2_TOP == animType) {
            setGravity(Gravity.BOTTOM);
            window.setWindowAnimations(R.style.alex_dialog_anim_bottom2top);
        } else if (AnimType.TOP_2_BOTTOM == animType) {
            setGravity(Gravity.TOP);
            window.setWindowAnimations(R.style.alex_dialog_anim_top2bottom);
        } else if (AnimType.CENTER_SCALE == animType) {
            setGravity(Gravity.CENTER);
            window.setWindowAnimations(R.style.alex_dialog_anim_scale);
        } else if (AnimType.CENTER_NORMAL == animType) {
            setGravity(Gravity.CENTER);
            window.setWindowAnimations(R.style.alex_dialog_anim_alpha);
        }
        super.show();
    }
}

Bottom2TopDialog

package org.alex.dialog.base;
import android.content.Context;
import org.alex.alexlibrary.R;
import org.alex.dialog.annotation.AnimType;
/**
 * 作者:Alex
 * 时间:2016年09月10日    17:33
 * 简述:
 */
public abstract class Bottom2TopDialog<D extends Bottom2TopDialog> extends SimpleDialog<D> {
    public Bottom2TopDialog(Context context) {
        super(context, R.style.alex_dialog_base_light_style);
    }
    /**
     * 显示对话框,无动画
     */
    @Override
    public void show() {
        show(AnimType.BOTTOM_2_TOP);
    }
    /**
     * 显示对话框,强制转换对话框的动画类型
     *
     * @param animType
     */
    @Override
    public void show(@AnimType int animType) {
        super.show(animType);
    }
}

TaoBaoDialog

package org.alex.dialog.base;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import org.alex.dialog.anim.BaseAnimatorSet;
import org.alex.dialog.annotation.AnimType;
/**
 * 作者:Alex
 * 时间:2016年09月10日    12:56
 * 简述:
 */
public abstract class TaoBaoDialog<D extends TaoBaoDialog> extends SimpleDialog<D> {
    private BaseAnimatorSet inAnimSet;
    private BaseAnimatorSet outAnimSet;
    private View rootView;
    protected int duration;
    protected int backgroundColor;
    private View parentView;
    public TaoBaoDialog(Context context, View rootView, int theme) {
        super(context, theme);
        this.rootView = rootView;
        initView();
    }
    protected void initView() {
        duration = 300;
        backgroundColor = Color.parseColor("#111111");
        parentView = (View) rootView.getParent();
        parentView.setBackgroundColor(backgroundColor);
        inAnimSet = new WindowsInAs();
        outAnimSet = new WindowsOutAs();
    }
    /**
     * 显示对话框,强制转换对话框的动画类型
     */
    @Override
    public void show() {
        show(AnimType.BOTTOM_2_TOP);
    }
    /**
     * 显示对话框,强制转换对话框的动画类型
     *
     * @param animType
     */
    @Override
    public void show(@AnimType int animType) {
        super.show(AnimType.BOTTOM_2_TOP);
        parentView.setBackgroundColor(backgroundColor);
        if (rootView != null && inAnimSet != null) {
            inAnimSet.duration(duration).playOn(rootView);
        }
    }
    @Override
    public void dismiss() {
        super.dismiss();
        new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                parentView.setBackgroundColor(0);
            }
        }.sendEmptyMessageDelayed(100, duration);
        if (rootView != null && outAnimSet != null) {
            outAnimSet.duration(duration).playOn(rootView);
        }
    }
    private final class WindowsInAs extends BaseAnimatorSet {
        @Override
        public void setAnimation(View view) {
            ObjectAnimator rotationX = ObjectAnimator.ofFloat(view, "rotationX", 10, 0f).setDuration(150);
            rotationX.setStartDelay(200);
            animatorSet.playTogether(
                    ObjectAnimator.ofFloat(view, "scaleX", 1.0f, 0.8f).setDuration(350),
                    ObjectAnimator.ofFloat(view, "scaleY", 1.0f, 0.8f).setDuration(350),
                    ObjectAnimator.ofFloat(view, "rotationX", 0f, 10).setDuration(200),
                    rotationX,
                    ObjectAnimator.ofFloat(view, "translationY", 0, -0.1f * displayMetrics.heightPixels).setDuration(350)
            );
        }
    }
    private final class WindowsOutAs extends BaseAnimatorSet {
        @Override
        public void setAnimation(View view) {
            ObjectAnimator rotationX = ObjectAnimator.ofFloat(view, "rotationX", 10, 0f).setDuration(150);
            rotationX.setStartDelay(200);
            animatorSet.playTogether(
                    ObjectAnimator.ofFloat(view, "scaleX", 0.8f, 1.0f).setDuration(350),
                    ObjectAnimator.ofFloat(view, "scaleY", 0.8f, 1.0f).setDuration(350),
                    ObjectAnimator.ofFloat(view, "rotationX", 0f, 10).setDuration(200),
                    rotationX,
                    ObjectAnimator.ofFloat(view, "translationY", -0.1f * displayMetrics.heightPixels, 0).setDuration(350)
            );
        }
    }
}

点击事件 怎么写?

package com.alex.mvpapp.dialog;
import android.content.Context;
import android.view.View;
import com.alex.mvpapp.R;
import org.alex.dialog.annotation.ClickPosition;
import org.alex.dialog.base.Top2BottomDialog;
/**
 * 作者:Alex
 * 时间:2016年09月10日    17:40
 * 简述:
 */
public class NoticeDialog extends Top2BottomDialog<NoticeDialog> {
    public NoticeDialog(Context context) {
        super(context);
    }
    @Override
    public int getLayoutRes() {
        return R.layout.dialog_notice;
    }
    @Override
    public void onCreateDialog() {
        setOnCilckListener(R.id.tv_submit,R.id.tv_cancel);
    }
    @Override
    public void onClick(View v) {
        if(R.id.tv_submit == v.getId()){
           onDialogClickListener(ClickPosition.SUBMIT);
        }else  if(R.id.tv_cancel == v.getId()){
            onDialogClickListener(ClickPosition.CANCEL);
        }
    }
}

点击事件 怎么响应?

package com.alex.mvpapp.ui.testdialog;
/**
 * 作者:Alex
 * 时间:2016年09月09日    23:41
 * 简述:
 * {@link com.alex.mvpapp.ui.MainActivity}
 */
public class DialogActivity extends BaseActivity {
    /**
     * 执行在 onCreateView 中
     * 通过 findView 初始主视图化控件
     * 初始化所有基础数据,
     */
    @Override
    public void onCreateData() {
        super.onCreateData();
        MyOnDialogClickListener onDialogClickListener = new MyOnDialogClickListener();
        loadingDialog = new LoadingDialog(this);//.setOnKeyListener(SimpleOnKeyListener.dismissNotKillActivity(this));
        oneButtonDialog = new OneButtonDialog(this).setOnDialogClickListener(onDialogClickListener);
        selectedProductDialog = new SelectedProductDialog(this, findViewById(Window.ID_ANDROID_CONTENT)).setOnDialogClickListener(onDialogClickListener);
        noticeDialog = new NoticeDialog(this).tag("noticeDialog").setOnDialogClickListener(onDialogClickListener);
        setOnClickListener(R.id.tv_loadingDialog, R.id.tv_oneButtonDialog, R.id.tv_taobao, R.id.tv_notice);
    }
    private final class MyOnDialogClickListener implements OnDialogClickListener<SimpleDialog> {
        @Override
        public void onDialogClick(SimpleDialog dialog, @ClickPosition String clickPosition) {
            LogUtil.e("tag = " + dialog.tag + " clickPosition =" + clickPosition);
            dialog.dismiss();
        }
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值