自定义popupwindow(解决位置控制困惑)

一。main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:orientation="vertical">
    
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    
        <Button
            android:id="@+id/btn1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button 1" />

        <Button
            android:id="@+id/btn2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Button 2" />
        
    </LinearLayout>
    
    <LinearLayout
        
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    
        <Button
            android:id="@+id/btn3"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:text="Button 3" />

    </LinearLayout>
    
    <Button
            android:id="@+id/btn4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right|bottom"
            android:text="Btn4" />
    
</LinearLayout>

二、ActionItem

package net.londatiga.android;

import android.graphics.drawable.Drawable;
import android.view.View.OnClickListener;

/*
 * 弹出框选项
 */
public class ActionItem {

    private Drawable icon;
    private String title;
    private OnClickListener listener;

    public ActionItem() {// 构造方法
    }

    public ActionItem(Drawable icon) {// 构造方法
        this.icon = icon;
    }

    public void setTitle(String title) {// 设置文字标题
        this.title = title;
    }

    public String getTitle() {// 返回文字标题
        return this.title;
    }

    public void setIcon(Drawable icon) {// 设置图标
        this.icon = icon;
    }

    public Drawable getIcon() {// 返回图标
        return this.icon;
    }

    public void setOnClickListener(OnClickListener listener) {// 设置监听
        this.listener = listener;
    }

    public OnClickListener getListener() {// 返回监听
        return this.listener;
    }
}

三、

CustomPopupWindow
package net.londatiga.android;

import android.content.Context;

import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.PopupWindow;

public class CustomPopupWindow {
    
    protected final View anchor;
    
    protected final PopupWindow window;
    
    private View root;
    
    private Drawable background = null;
    
    protected final WindowManager windowManager;


    public CustomPopupWindow(View anchor) {
        this.anchor = anchor;
        this.window = new PopupWindow(anchor.getContext());
        window.setFocusable(true);
        window.setBackgroundDrawable(new BitmapDrawable());
        windowManager = (WindowManager) anchor.getContext().getSystemService(Context.WINDOW_SERVICE);
    }
    
    protected void onShow() {
        
    }

    protected void preShow() {
        onShow();
        window.setBackgroundDrawable(background);
        window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
        window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
        window.setTouchable(true);
        window.setFocusable(true);
        window.setOutsideTouchable(true);
        window.setContentView(root);
    }

    public void setBackgroundDrawable(Drawable background) {
        this.background = background;
    }

    public void setContentView(View root) {
        this.root = root;
        window.setContentView(root);
    }

    public void setContentView(int layoutResID) {
        LayoutInflater inflator = (LayoutInflater) anchor.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        setContentView(inflator.inflate(layoutResID, null));
    }

    public void setOnDismissListener(PopupWindow.OnDismissListener listener) {
        window.setOnDismissListener(listener);
    }

    public void showDropDown() {
        showDropDown(0, 0);
    }

    public void showDropDown(int xOffset, int yOffset) {
        preShow();
        window.setAnimationStyle(R.style.Animations_PopDownMenu);
        window.showAsDropDown(anchor, xOffset, yOffset);
    }

    public void dismiss() {
        window.dismiss();
    }
}

四、QuickAction 

package net.londatiga.android;

import android.content.Context;

import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup;
import java.util.ArrayList;

public class QuickAction extends CustomPopupWindow {
    
    private final View root;
    private final ImageView mArrowUp;
    private final ImageView mArrowDown;
    private final LayoutInflater inflater;
    private final Context context;

    protected static final int ANIM_GROW_FROM_LEFT = 1;  
    protected static final int ANIM_GROW_FROM_RIGHT = 2;
    protected static final int ANIM_GROW_FROM_CENTER = 3;
    protected static final int ANIM_REFLECT = 4;
    protected static final int ANIM_AUTO = 5;

    private int animStyle; 
    
    private ViewGroup mTrack;
    private ScrollView scroller;
    private ArrayList<ActionItem> actionList;

    
    public QuickAction(View anchor) {
        super(anchor);

        actionList = new ArrayList<ActionItem>();
        context = anchor.getContext();
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        root = (ViewGroup) inflater.inflate(R.layout.popup, null);

        mArrowDown = (ImageView) root.findViewById(R.id.arrow_down);
        mArrowUp = (ImageView) root.findViewById(R.id.arrow_up);

        setContentView(root);

        mTrack = (ViewGroup) root.findViewById(R.id.tracks);
        scroller = (ScrollView) root.findViewById(R.id.scroller);
        animStyle = ANIM_AUTO;
        
    }

    public void setAnimStyle(int animStyle) {
        this.animStyle = animStyle;
    }

    public void addActionItem(ActionItem action) {
        actionList.add(action);
    }

    public void show() {
        
        preShow();
        int xPos, yPos;
        int[] location = new int[2];
        anchor.getLocationOnScreen(location);
        Rect anchorRect = new Rect(location[0], location[1], location[0]+ anchor.getWidth(), location[1] + anchor.getHeight());

        createActionList();

        root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
        
        root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        int rootHeight = root.getMeasuredHeight();
        int rootWidth = root.getMeasuredWidth();

        int screenWidth = windowManager.getDefaultDisplay().getWidth();
        int screenHeight = windowManager.getDefaultDisplay().getHeight();

        if ((anchorRect.left + rootWidth) > screenWidth) {
            xPos = anchorRect.left - (rootWidth - anchor.getWidth());
        } else {
            if (anchor.getWidth() > rootWidth) {
                xPos = anchorRect.centerX() - (rootWidth / 2);
            } else {
                xPos = anchorRect.left;
            }
        }

        int dyTop = anchorRect.top;
        int dyBottom = screenHeight - anchorRect.bottom;

        boolean onTop = (dyTop > dyBottom) ? true : false;

        if (onTop) {
            if (rootHeight > dyTop) {
                yPos = 15;
                LayoutParams l = scroller.getLayoutParams();
                l.height = dyTop - anchor.getHeight();
            } else {
                yPos = anchorRect.top - rootHeight;
            }
        } else {
            yPos = anchorRect.bottom;

            if (rootHeight > dyBottom) {
                LayoutParams l = scroller.getLayoutParams();
                l.height = dyBottom;
            }
        }

        showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up),
                anchorRect.centerX() - xPos);

        setAnimationStyle(screenWidth, anchorRect.centerX(), onTop);

        window.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos);
    }

    private void setAnimationStyle(int screenWidth, int requestedX,
            boolean onTop) {
        int arrowPos = requestedX - mArrowUp.getMeasuredWidth() / 2;

        switch (animStyle) {
        case ANIM_GROW_FROM_LEFT:
            window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left
                    : R.style.Animations_PopDownMenu_Left);
            break;

        case ANIM_GROW_FROM_RIGHT:
            window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right
                    : R.style.Animations_PopDownMenu_Right);
            break;

        case ANIM_GROW_FROM_CENTER:
            window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center
                    : R.style.Animations_PopDownMenu_Center);
            break;

        case ANIM_REFLECT:
            window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Reflect
                    : R.style.Animations_PopDownMenu_Reflect);
            break;

        case ANIM_AUTO:
            if (arrowPos <= screenWidth / 4) {
                window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left
                        : R.style.Animations_PopDownMenu_Left);
            } else if (arrowPos > screenWidth / 4
                    && arrowPos < 3 * (screenWidth / 4)) {
                window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center
                        : R.style.Animations_PopDownMenu_Center);
            } else {
                window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right
                        : R.style.Animations_PopDownMenu_Right);
            }

            break;
        }
    }

    private void createActionList() {
        View view;
        String title;
        Drawable icon;
        OnClickListener listener;

        for (int i = 0; i < actionList.size(); i++) {
            title = actionList.get(i).getTitle();
            icon = actionList.get(i).getIcon();
            listener = actionList.get(i).getListener();

            view = getActionItem(title, icon, listener);

            view.setFocusable(true);
            view.setClickable(true);

            mTrack.addView(view);
        }
    }

    private View getActionItem(String title, Drawable icon,
            OnClickListener listener) {
        LinearLayout container = (LinearLayout) inflater.inflate(R.layout.action_item, null);

        ImageView img = (ImageView) container.findViewById(R.id.icon);
        
        TextView text = (TextView) container.findViewById(R.id.title);

        if (icon != null) {
            img.setImageDrawable(icon);
        }

        if (title != null) {
            text.setText(title);
            text.setTextSize(14);
        }

        if (listener != null) {
            container.setOnClickListener(listener);
        }

        return container;
    }

    private void showArrow(int whichArrow, int requestedX) {
        final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp
                : mArrowDown;
        final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown
                : mArrowUp;

        final int arrowWidth = mArrowUp.getMeasuredWidth();

        showArrow.setVisibility(View.VISIBLE);

        ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams) showArrow
                .getLayoutParams();

        param.leftMargin = requestedX - arrowWidth / 2;

        hideArrow.setVisibility(View.INVISIBLE);
    }
}

五、 TestQuickAction

package net.londatiga.android;

import android.app.Activity;
import android.os.Bundle;

import android.view.View;
import android.view.View.OnClickListener;

import android.widget.Button;
import android.widget.Toast;

public class TestQuickAction extends Activity {
    QuickAction qa;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        final ActionItem first = new ActionItem();

        first.setTitle("删除数据");
         first.setIcon(getResources().getDrawable(R.drawable.dashboard));
        first.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                qa.dismiss();
                Toast.makeText(TestQuickAction.this, "Dashboard",
                        Toast.LENGTH_SHORT).show();
            }
        });

        final ActionItem second = new ActionItem();

        second.setTitle("更新数据");
        // second.setIcon(getResources().getDrawable(R.drawable.kontak));
        second.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                qa.dismiss();
                Toast.makeText(TestQuickAction.this, "User & Group",
                        Toast.LENGTH_SHORT).show();
            }
        });

        Button btn1 = (Button) this.findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                qa = new QuickAction(v);

                qa.addActionItem(first);
                qa.addActionItem(second);

                qa.show();
            }
        });

        Button btn2 = (Button) this.findViewById(R.id.btn2);
        btn2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                qa = new QuickAction(v);

                qa.addActionItem(first);
                qa.addActionItem(second);
                qa.setAnimStyle(QuickAction.ANIM_REFLECT);

                qa.show();
            }
        });

        Button btn3 = (Button) this.findViewById(R.id.btn3);
        btn3.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                qa = new QuickAction(v);

                qa.addActionItem(first);
                qa.addActionItem(second);

                qa.show();
            }
        });

        Button btn4 = (Button) this.findViewById(R.id.btn4);
        btn4.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                qa = new QuickAction(v);

                qa.addActionItem(first);
                qa.addActionItem(second);
                qa.setAnimStyle(QuickAction.ANIM_GROW_FROM_LEFT);
                qa.show();
            }
        });

    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:orientation="vertical">
    
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    
        <Button
            android:id="@+id/btn1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button 1" />

        <Button
            android:id="@+id/btn2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Button 2" />
        
    </LinearLayout>
    
    <LinearLayout
        
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    
        <Button
            android:id="@+id/btn3"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:text="Button 3" />

    </LinearLayout>
    
    <Button
            android:id="@+id/btn4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right|bottom"
            android:text="Btn4" />
    
</LinearLayout>

action_item

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:clickable="true"
    android:focusable="true"
    android:gravity="center"
    android:background="@drawable/action_item_btn">
            
    <ImageView
        android:id="@+id/icon" 
        android:gravity="center"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>

    <TextView 
        android:id="@+id/title"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
         
        android:gravity="center"
        android:paddingLeft="5dip"
        android:paddingRight="10dip"
        android:paddingBottom="5dip"
        android:textSize="21sp"
        android:textColor="#fff"/>
                                             
</LinearLayout>         

popup

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
        
    <ScrollView 
        android:id="@+id/scroller"
        android:layout_marginTop="16dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/popup"
        android:fadingEdgeLength="5dip"
        android:scrollbars="none">
        
        <LinearLayout
            android:id="@+id/tracks"
            android:orientation="vertical"
            
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="10dip"/>
       
    </ScrollView >
     
     <ImageView
        android:id="@+id/arrow_up"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/arrow_up" />
        
     <ImageView
        android:id="@+id/arrow_down"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/scroller"
          android:layout_marginTop="-4dip"
        android:src="@drawable/arrow_down" />

</RelativeLayout>

(在F:\java\p自定义popupwindow\quickAction)

原文地址:https://www.cnblogs.com/ct732003684/p/2869841.html