通用的popupwindow底部弹出框

前段时间做项目的时候,有几个底部弹出框,当时因为忙着赶进度所有就单独写了好几个popupwindow.后来就想着怎么实现一个通用的PopupWindow工具类

就是在要用到的时候创建该工具类的对象,并传入相应的框体布局,就可以实现了.

先看看效果,下面的两是调用同一个PopupWindowUtils创建的:

     

ok,先看看popupWindow的具体实现

import android.app.Activity;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupWindow;

/**
 * Created by 95 on 2017/8/22.
 */

public class PopupWindowUtils extends View implements View.OnTouchListener{
    private Activity mContext;
    private int mXml;
    public View mMenuView;
    public PopupWindow popupWindow;

    public PopupWindowUtils(Activity mContext, int mXml) {
        super(mContext);
        this.mContext = mContext;
        this.mXml = mXml;
        newPopu();
    }
//创建popupWinow对象
    private void newPopu() {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        mMenuView = inflater.inflate(mXml, null);
        popupWindow = new PopupWindow(mMenuView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);

        popupWindow.setAnimationStyle(R.style.popwin_anim_style);//弹出,关闭动画
        ColorDrawable dw = new ColorDrawable(mContext.getResources().getColor(R.color.btn));//popupWindow的背景设置为透明
        popupWindow.setBackgroundDrawable(dw);
        //popupWindow 的取消监听当dismiss()被调用的时候发生
        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
              background(1f);
            }
        });
        //触摸监听
        mMenuView.setOnTouchListener(this);
    }
//popupWindow状态改变的时候修改整体背景
    private void background(float mfloat) {
        WindowManager.LayoutParams lp = mContext.getWindow().getAttributes();
        lp.alpha = mfloat;
        mContext.getWindow().setAttributes(lp);
        mContext.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    }

    //触摸关闭
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int height = mMenuView.getHeight();
        int y = (int) event.getY();
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (y < height) {
                popupWindow.dismiss();
            }
        }
        return true;
    }

    //弹出
    public void show() {
        background(0.5f);
        View rootView = ((ViewGroup) mContext.findViewById(android.R.id.content)).getChildAt(0);
        popupWindow.showAtLocation(rootView, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
    }
//外部调用关闭
    public void dismiss() {
        popupWindow.dismiss();
    }
}

弹出,关闭的动画

在style.xml添加

 <style name="popwin_anim_style">
        <item name="android:windowEnterAnimation">@anim/ppwindow_show_anim</item>
        <item name="android:windowExitAnimation">@anim/ppwindow_hide_anim</item>
    </style>  

并创建anim文件和动画

1.开启

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:toXDelta="0"
        android:fromYDelta="200"
        android:toYDelta="0"
        />
    <alpha
        android:duration="300"
        android:fromAlpha="0"
        android:toAlpha="1"
        />
</set>

2.关闭

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:toXDelta="0"
        android:fromYDelta="0"
        android:toYDelta="200"
        />
    <alpha
        android:duration="300"
        android:fromAlpha="1"
        android:toAlpha="0"
        />
</set>
popupWindow的背景设置为透明
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#00000000"/>
</selector>

ok,popupWindowUtils就完成了,现在就该调用了

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private PopupWindowUtils popup;
    private PopupWindowUtils popup2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1://创建第一个
                popup = new PopupWindowUtils(this, R.layout.activity_popu1);
                popup.mMenuView.findViewById(R.id.popupbtn1).setOnClickListener(this);
                popup.mMenuView.findViewById(R.id.popupbtn2).setOnClickListener(this);
                popup.mMenuView.findViewById(R.id.popupbtn3).setOnClickListener(this);
                popup.show();//弹出
                break;
            case R.id.button2://创建第二个
                popup2 = new PopupWindowUtils(this, R.layout.activity_popu2);
                popup2.mMenuView.findViewById(R.id.popup2btn1).setOnClickListener(this);
                popup2.mMenuView.findViewById(R.id.popup2btn2).setOnClickListener(this);
                popup2.mMenuView.findViewById(R.id.popup2btn3).setOnClickListener(this);
                popup2.mMenuView.findViewById(R.id.popup2btn4).setOnClickListener(this);
                popup2.show();//弹出
                break;
            //------------------第一个的使用-----------------
            case R.id.popupbtn1:
                Toast.makeText(MainActivity.this, "相机", Toast.LENGTH_LONG).show();
                break;
            case R.id.popupbtn2:
                Toast.makeText(MainActivity.this, "相册", Toast.LENGTH_LONG).show();
                break;
            case R.id.popupbtn3:
                Toast.makeText(MainActivity.this, "退出", Toast.LENGTH_LONG).show();
                popup.dismiss();//关闭
                break;
            //--------------------第二个的使用-----------------
            case R.id.popup2btn1:
                Toast.makeText(MainActivity.this,"popup2打电话",Toast.LENGTH_LONG).show();
                break;
            case R.id.popup2btn2:
                Toast.makeText(MainActivity.this,"popup2发短信",Toast.LENGTH_LONG).show();
                break;
            case R.id.popup2btn3:
                Toast.makeText(MainActivity.this,"popup2发邮件",Toast.LENGTH_LONG).show();
                break;
            case R.id.popup2btn4:
                Toast.makeText(MainActivity.this,"popup2退出",Toast.LENGTH_LONG).show();
                popup2.dismiss();//关闭
                break;
        }
    }

}

MainActivity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="map.com.mypopupwindow.MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_margin="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="获取图片" />
    <Button
        android:layout_below="@+id/button1"
        android:id="@+id/button2"
        android:layout_margin="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="联系方式" />
</RelativeLayout>

popup1布局

<?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="wrap_content"
    android:background="#00000000"
    android:orientation="vertical">

    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#00000000"
        android:gravity="center"
        android:orientation="vertical">

        <Button
            android:clickable="true"
            android:id="@+id/popupbtn1"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/btn"
            android:text="相机" />

        <Button
            android:id="@+id/popupbtn2"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/btn"
            android:text="相册" />

        <Button
            android:id="@+id/popupbtn3"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/btn"
            android:text="取消" />
    </LinearLayout>
</LinearLayout>

popup2布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
<LinearLayout
    android:layout_gravity="center"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="300dp"
    android:layout_height="wrap_content">
    <Button
        android:id="@+id/popup2btn1"
        android:layout_marginTop="2dp"
        android:text="打电话"
        android:background="#ffffff"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/popup2btn2"
        android:layout_marginTop="2dp"
        android:text="发短信"
        android:background="#ffffff"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/popup2btn3"
        android:layout_marginTop="2dp"
        android:text="发邮件"
        android:background="#ffffff"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/popup2btn4"
        android:layout_marginTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:text="取消" />

</LinearLayout>
</LinearLayout>

ok.所有代码都在这了,

使用的话直接使用popupWindowUtils就可以了

时间: 2024-12-08 15:55:56

通用的popupwindow底部弹出框的相关文章

UIActionSheet底部弹出框

<底部弹出框来提示用户信息>    1.遵循代理方法<UIActionSheetDelete>    2.调用放法 [UIActionSheet *sheet=[UIActionSheet alloc]initWithTitle:@“通关了!” delegate:self cancelButtonTitle:@“取消” destructiveButtonTitle:@“购买” otherButtonTitles:@“购买1”,@“购买2”,nil]    [sheet showIn

PopupWindow底部弹出

说明:从屏幕底部弹出PopupWindow,有弹出隐藏动画效果.背景设置透明度. 效果图例如以下: 1.MainActivity.java   显示popwindow,宽高跟屏幕大小一样,设置一个透明度背景 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCo

ionic中自定义底部弹出框

通用部分:<script>     MY_FUNCTION = (function() {        var upSheet = document.createElement('div');        upSheet.setAttribute('style', 'display:none;position:absolute;left:0px;top:0px;z-index: 9999;');        upSheet.style.width = document.documentE

Android 底部弹出Dialog(横向满屏)

项目中经常需要底部弹出框,这里我整理一下其中我用的比较顺手的一个方式(底部弹出一个横向满屏的dialog). 效果图如下所示(只显示关键部分): 步骤如下所示: 1.定义一个dialog的布局(lay_share.xml) 1 <?xml version="1.0" encoding="utf-8"?> 2 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

Android 底部弹出提示框的解决办法(使用Activity以及PopupWindow)

本片文章主要谈探讨了如何实现在底部弹出提示框背景为半透明效果的实现.想要实现此种效果一般有两种方式一个是使用Activity设置Theme另一种方式就是使用PopupWindow设置样式实现效果. 一,使用Activity 首先是此activity的布局文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.andro

Android-实现底部弹出PopupWindow并让背景逐渐变暗

Android-实现底部弹出PopupWindow并让背景逐渐变暗 在android开发中,经常需要通过点击某个按钮弹出对话框或者选择框,通过Dialog或者PopupMenu.PopupWindow都能实现. 这里主要介绍后两者:PopupMenu.PopupWindow的实现. 先看两个效果图左边PopupMenu,右边PopupWindow: Android-实现底部弹出PopupWindow并让背景逐渐变暗 一PopupMenu实现 二PopupWindow实现 一.PopupMenu实

弹出框滑动,底部不跟着滑动

弹出框里有滚动条,并且页面也有滚动条时,在弹出框内滑动时底部页面也会跟着滑动,试了下当弹出框出现时加上$('body').css({'height','100%','overflow','hidden'});不起作用,后来在弹出框上加上以下代码便起作用了. $('body').css({ 'overflow':'hidden', 'position': 'fixed', 'top': scrollTop*(-1) }); 弹出框关闭后,再恢复 $('body').css({ 'overflow'

android PopupWindow实现从底部弹出或滑出选择菜单或窗口

本实例弹出窗口主要是继承PopupWindow类来实现的弹出窗体,布局可以根据自己定义设计.弹出效果主要使用了translate和alpha样式实现,具体实习如下: 第一步:设计弹出窗口xml: Xml代码   <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

【Android】android PopupWindow实现从底部弹出或滑出选择菜单或窗口

转载自:android PopupWindow实现从底部弹出或滑出选择菜单或窗口 Android PopupWindow的使用和分析 Popupwindow的使用 PopupWindow用法