自定义PopWindow

一、运行效果图

二、工程结构

三、自定义PopWindow

代码:

package com.example.custompopdemo;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.PopupWindow;

/**
 * Created by 袁磊 on 2017/3/11.
 */
public class MyPopWindow extends PopupWindow {
    private View contentView;

    public MyPopWindow(Activity activity) {
        //获得LayoutInfalter实例
        LayoutInflater inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        contentView = inflater.inflate(R.layout.pop_layout, null);
        /**
         * 获取屏幕的宽高
         */
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int w = dm.widthPixels;
        int h = dm.heightPixels;

        this.setContentView(contentView);//设置Pop的View
        this.setWidth(w / 2 + 50);//设置Pop的宽
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);//设置Pop的高
        this.setFocusable(true);//设置Pop可点击
        this.setOutsideTouchable(true);
        this.update();//刷新状态
        ColorDrawable dw = new ColorDrawable(0000000000); //实例化一个ColorDrawable颜色为半透明
        // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
        this.setBackgroundDrawable(dw);
        this.setAnimationStyle(R.style.AnimationPreview);//设置Pop动画效果
        LinearLayout first = (LinearLayout) contentView.findViewById(R.id.lin_first);
        LinearLayout second = (LinearLayout) contentView.findViewById(R.id.lin_second);

        first.setOnClickListener(my);
        second.setOnClickListener(my);
    }

    private View.OnClickListener my = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //通过自定义接口将回调方法公布出去
            if (popOnclickListener != null) {
                popOnclickListener.onClick(v);
            }
        }
    };

    /**
     * 显示Pop
     *
     * @param parent
     */
    public void showPopupWindow(View parent) {
        if (!this.isShowing()) {
            //以下拉方式显示Pop
            /**
             * showAsDropDown 的对齐方式是v控件的左下角与popupWindow的控件左上角对齐
             * 而popupWindow不会超出屏幕,所以显示效果是紧贴右边框
             * 先除去控件的宽度,这样popupWindow的控件右上角和v控件的左下角是对齐的,
             * 然后在设置偏移量就可以正常显示了
             * 此方法亦适用于右下角弹出
             */
            this.showAsDropDown(parent, -this.getWidth() + parent.getWidth() - 20, 0);
        } else {
            this.dismiss();
        }
    }

    /**
     * 自定义接口
     * 复制源代码中的三个抽象方法
     */
    public interface PopOnclickListener {
        void onClick(View v);
    }

    private PopOnclickListener popOnclickListener;

    public void setPopOnclickListener(PopOnclickListener popOnclickListener) {
        this.popOnclickListener = popOnclickListener;
    }
}

MyPopWindow

布局(根据需求改动):

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

    <LinearLayout
        android:id="@+id/lin_first"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_marginRight="10dp"
            android:src="@mipmap/ic_launcher" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第一个项"
            android:textColor="#000000"
            android:textSize="18sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/lin_second"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_marginRight="10dp"
            android:src="@mipmap/ic_launcher" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第二个项"
            android:textColor="#000000"
            android:textSize="18sp" />
    </LinearLayout>

</LinearLayout>

pop_layout

弹出弹入动画:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromXScale="0.001"
    android:fromYScale="0.001"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="100%"
    android:pivotY="10%"
    android:toXScale="1.0"
    android:toYScale="1.0" />

fade_in

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="100%"
    android:pivotY="10%"
    android:toXScale="0.001"
    android:toYScale="0.001" />

fade_out

四、使用

代码:

package com.example.custompopdemo;

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

public class MainActivity extends AppCompatActivity {

    private RelativeLayout relTop;
    private ImageView ivPlus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ivPlus = (ImageView) findViewById(R.id.iv_plus);
        relTop = (RelativeLayout) findViewById(R.id.rel_top);

        ivPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyPopWindow pop = new MyPopWindow(MainActivity.this);
                pop.showPopupWindow(ivPlus);
                pop.setPopOnclickListener(new MyPopWindow.PopOnclickListener() {
                    @Override
                    public void onClick(View v) {
                        switch (v.getId()) {
                            case R.id.lin_first:
                                Toast.makeText(MainActivity.this, "第一个选项", Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.lin_second:
                                Toast.makeText(MainActivity.this, "第二个选项", Toast.LENGTH_SHORT).show();
                                break;
                        }
                    }
                });
            }
        });

    }
}

MainActivity

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/rel_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#33000000">

        <ImageView
            android:id="@+id/iv_plus"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentRight="true"
            android:padding="8dp"
            android:src="@mipmap/plus" />
    </RelativeLayout>
</RelativeLayout>

activity_main

五、弄清PopWindow和Dialog的区别:http://www.cnblogs.com/chen-fan/articles/3812401.html

自定义Dialog:http://www.cnblogs.com/cheneasternsun/p/5463278.html

时间: 2024-10-22 02:39:04

自定义PopWindow的相关文章

自定义 Popwindow

popwindow 是比较常用的一种控件,为了灵活使用,会自定义 popwidow ,继承 popwindow. 这篇文章主要介绍如何自定义 popwindow ,同时响应 popwindow 中 view 的事件. 1. 定义 MenuPop 继承 popwindow 具体代码如下 : public class MenuPopwindow extends PopupWindow implements OnClickListener { private Context context; priv

自定义 popWindow弹框 工具包

前言:因为Android 没有像IOS一样的ActionSheet,虽然在github上看到有一些类似ActionSheet的库,总觉得不好用,不如自己写一个弹框通用类,样式全部自已来多好. Step 1 废话不多说,直接上代码. public class CustomPopWindow implements PopupWindow.OnDismissListener{ private static final String TAG = "CustomPopWindow"; priva

FBReaderJ学习笔记(二):PopWindow实现自定义阅读页菜单

很少写技术博客,最常用的博客还是Lofter这个:chacePM.非技术博客. 另外基于FBReaderJ本人开发了一个阅读器:悦读.有兴趣的朋友可以去安装看看,支持一下. 以下是实现的菜单截图. MainMenuPopup ConfigPopup 本文使用的是FBReaderJ-2.2.2.1. 注意:本文不涉及具体界面设计,只谈思路. 1.结构 在正式动手改代码前,我们最好先搞清楚几个PopWindow的结构和继承关系,因为FBReaderJ的封装严密,容易走入死胡同. 整个跟popup相关

分别用自定义PopupWindow和自定义Dialog实现下拉菜单

首先看下分别使用PopupWindow和Dialog实现的下拉菜单的不同之处: PopupWindow: Dialog: 由于之前用PopupWindow实现的效果不是太理想,并且弹出下拉菜单的时候背景透明度变化的也不是太好,后来改为Diaolog,项目中其他弹窗也都用的diaolog,便于更改背景透明度,整体看起来也比较统一. 下面把两种实现的方法都记录下来: **第一种:自定义PopupWindow** 首先自定义一个PopWindow: PopWindow.class: public cl

Android仿QQ复制昵称效果

本文同步自http://javaexception.com/archives/76 背景: 这几天做一个复制文本的需求,突然看到QQ上复制昵称跟QQ号的效果,觉得很不错,就想要模仿一波,办法比较简单粗暴,反编译QQ获取了那个.9图片,然后就是用PopWindow实现了. 解决办法: 自定义PopWindow public class CopyContentPopWindow extends PopupWindow { private final View content; TextView tv

Popwindow自定义动画(nexus5不支持暂未解决)

遇到一个问题,先记录一下 PopWindow自定义动画 import android.app.Activity; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.LayoutIn

android自定义TextView

Android控件中的TextView控件只有一个输入框,但是为了用于的操作方便我们应该实现一些功能: 1. 可以直接将内容删除的功能按钮 2. 可以记录用户以前输入的数据,同时能够将数据通过下拉显示,点击的时候实现输入 先上图: 下拉的图片没有做,所以和删除的图片使用同一个了,同志们可以直接在xml文件中更换就行了 分析: 肯定要使用自定义view来实现的,我们知道自定义view大概可以分为三类:自绘控件,组合控件,继承控件,我们这里是要进行增强的textView的功能,所以我这里使用的 是组

Android之自定义ListView(一)

PS:自定义View是Android中高手进阶的路线.因此我也打算一步一步的学习.看了鸿洋和郭霖这两位大牛的博客,决定一步一步的学习,循序渐进. 学习内容: 1.自定义View实现ListView的Item左右滑动显示和隐藏弹窗的效果   自定义View其实是在Android学习路上比较难掌握的一个重要点,但是也是高手的必经之路,自定义View分为很多种,我们可以直接继承View,或者是继承他的直接子类或间接子类.ViewGroup,ListView,LinearLayout,Button等等.

Android中自定义下拉样式Spinner

Android中自定义下拉样式Spinner 本文继续介绍android自定义控件系列,自定义Spinner控件的使用. 实现思路 1.定义下拉控件布局(ListView及子控件布局) 2.自定义SpinerPopWindow类 3.定义填充数据的Adapter 效果图 一.定义控件布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http:/