zoukankan      html  css  js  c++  java
  • 自定义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)

  • 相关阅读:
    sfs2x 连接 mongodb
    java websocket
    webstorm 4.0 注册码
    解决 sfs2 admin tool 找不到扩展
    window 注册表五大类
    opengl 学习第二日
    java google Protobuf
    扩展 java sencha touch PhonegapPlugin
    sencha touch2 kryonet socket phonegap 通信 作者:围城
    sencha touch2 layout 笔记
  • 原文地址:https://www.cnblogs.com/ct732003684/p/2869841.html
Copyright © 2011-2022 走看看