Android 实现底部弹出对话框效果

本文主要是利用Dialog 实现 从屏幕底部弹出对话框的效果 并且有动画效果。

线上效果图:

首先先在style.xml中定义对话框的样式 如下

 

    <style name="dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item><!--边框-->
        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
        <item name="android:windowNoTitle">true</item><!--无标题-->
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowBackground">@color/transparent</item><!--背景透明-->
        <item name="android:background">@color/transparent</item>
        <item name="android:backgroundDimAmount">0.5</item>
        <item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item><!--动画-->
    </style>

 

 

动画样式如下

    <style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog">
        <item name="android:windowEnterAnimation">@anim/bottom_anim_dialog_in</item>
        <item name="android:windowExitAnimation">@anim/bottom_anim_dialog_out</item>
    </style>

 


bottom_anim_dialog_in.xml

 

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="150"
    android:fromYDelta="100%"
    android:toYDelta="0" />

 

 

bottom_anim_dialog_out.xml

 

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="150"
    android:fromYDelta="0"
    android:toYDelta="100%" />


最后在Dialog的构造方法中 使用此样式 

 

 

 super(context, R.style.BottomAnimDialogStyle);

 

 

这里实现的对话框样式是仿造iOS经典样式 布局文件如下 bottom_anim_dialog_layout.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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/back_bg"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_item1"
            android:layout_width="match_parent"
            android:layout_height="@dimen/distance_size_50"
            android:gravity="center"
            android:text="换绑银行卡"
            android:textColor="@color/light_black"
            android:textSize="@dimen/font_size_16" />

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/distance_size_split_line"
            android:background="@color/having_line" />

        <TextView
            android:id="@+id/tv_item2"
            android:layout_width="match_parent"
            android:layout_height="@dimen/distance_size_50"
            android:gravity="center"
            android:text="解绑银行卡"
            android:textColor="@color/light_red"
            android:textSize="@dimen/font_size_16" />

    </LinearLayout>

    <TextView
        android:id="@+id/tv_item3"
        android:layout_width="match_parent"
        android:layout_height="@dimen/distance_size_50"
        android:layout_marginTop="@dimen/distance_size_8"
        android:background="@drawable/back_bg"
        android:gravity="center"
        android:text="取消"
        android:textColor="@color/light_black"
        android:textSize="@dimen/font_size_16" />

</LinearLayout>


整个dialog的文件代码如下

 

 

package com.ppdai.installment.view.dialog;

import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

import com.ppdai.installment.R;
import com.ppdai.installment.utils.DensityUtil;

public class BottomAnimDialog extends Dialog {


    private final Context mContext;

    private final String mItem1Name;
    private final String mItem2Name;
    private final String mItem3Name;


    private BottonAnimDialogListener mListener;
    private TextView mTvItem1;
    private TextView mTvItem2;
    private TextView mTvItem3;

    public BottomAnimDialog(Context context, String item1Name, String item2Name, String item3Name) {

        super(context, R.style.BottomAnimDialogStyle);
        this.mContext = context;

        this.mItem1Name = item1Name;
        this.mItem2Name = item2Name;
        this.mItem3Name = item3Name;

        initView();

    }


    private void initView() {

        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(mContext.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.bottom_anim_dialog_layout, null);

        Window window = this.getWindow();
        if (window != null) { //设置dialog的布局样式 让其位于底部 
            window.setGravity(Gravity.BOTTOM);
            WindowManager.LayoutParams lp = window.getAttributes();
            lp.y = DensityUtil.dip2px(mContext,10); //设置居于底部的距离
            window.setAttributes(lp);
        }

        mTvItem1 = (TextView) view.findViewById(R.id.tv_item1);
        mTvItem2 = (TextView) view.findViewById(R.id.tv_item2);
        mTvItem3 = (TextView) view.findViewById(R.id.tv_item3);

        mTvItem1.setOnClickListener(new clickListener());
        mTvItem2.setOnClickListener(new clickListener());
        mTvItem3.setOnClickListener(new clickListener());

        setContentView(view);

        setData();
    }


    private void setData() {
        mTvItem1.setText(mItem1Name);
        mTvItem2.setText(mItem2Name);
        mTvItem3.setText(mItem3Name);
    }

    public void setItem1TextColor(int colorId) {//设置item的字体颜色
        if (mTvItem1 != null) {
            mTvItem1.setTextColor(colorId);
        }
    }

    public void setItem2TextColor(int colorId) {
        if (mTvItem2 != null) {
            mTvItem2.setTextColor(colorId);
        }
    }

    public void setItem3TextColor(int colorId) {
        if (mTvItem3 != null) {
            mTvItem3.setTextColor(colorId);
        }
    }

    public void setClickListener(BottonAnimDialogListener listener) {
        this.mListener = listener;
    }

    public interface BottonAnimDialogListener {
        void onItem1Listener();

        void onItem2Listener();

        void onItem3Listener();
    }


    private class clickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.tv_item1:
                    if (mListener != null) {
                        mListener.onItem1Listener();
                    }
                    break;
                case R.id.tv_item2:
                    if (mListener != null) {
                        mListener.onItem2Listener();
                    }
                    break;
                case R.id.tv_item3:
                    if (mListener != null) {
                        mListener.onItem3Listener();
                    }
                    break;
            }
        }
    }
}


最后直接使用:

 

 BottomAnimDialog dialog = new BottomAnimDialog(BankCardManagerActivity.this, "嘻嘻嘻嘻", "哈哈哈哈", "取消");
                dialog.setClickListener(new BottomAnimDialog.BottonAnimDialogListener() {
                    @Override
                    public void onItem1Listener() {
                       // TO_DO 
                        dialog.dismiss();
                    }

                    @Override
                    public void onItem2Listener() {
                         // TO_DO 
                        dialog.dismiss();
                    }

                    @Override
                    public void onItem3Listener() {
                        dialog.dismiss();
                    }
                });

 dialog.show();

 

就是这么简单 。

 

扫描下方二维码关注公众号,及时获取文章推送

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值