有没有觉得常见的弹出菜单都很丑,常见的上下文菜单也很难看,当弹出一个菜单提供功能的时候,整个一点效果都没有。显得很突兀。 下面介绍一个菜单。重写了popupwindow 。效果图如下。 github地址github传送门

话不多说上代码:
public class PathPopupWindow extends PopupWindow {    private final int CONST_R = 100;//圆半径    private final int CONST_ICON_SIZE = 35;    private Context context;    private FrameLayout frameLayout;    private ImageView imageView;    private View view_circle;    private List itemViews = new ArrayList();    private int itempadding = 0;    private OnPathItemClickListener mOnPathItemClickListener;    public void setOnPathItemClickListener(OnPathItemClickListener mOnPathItemClickListener){        this.mOnPathItemClickListener = mOnPathItemClickListener;    }    protected PathPopupWindow() {    }    public PathPopupWindow(Context context, List items) {        this(context,items, Color.BLACK,12, Color.TRANSPARENT);    }    public PathPopupWindow(Context context, List items, int textColor, int textSize, int itembgResId) {        super(context);        this.context = context;        setFocusable(true);        itempadding = DensityUtil.dip2px(context, 8);        int itemWidth = DensityUtil.dip2px(context,CONST_ICON_SIZE + textSize + 4) + itempadding * 2;        int width = DensityUtil.dip2px(context, CONST_R * 2 + 30) + itemWidth;         int height = DensityUtil.dip2px(context, CONST_R * 2 + 30 + textSize) + itemWidth;        setWidth(width);        setHeight(height);        setBackgroundDrawable(new ColorDrawable());        frameLayout = new FrameLayout(context);        view_circle = new View(context);        view_circle.setBackgroundResource(R.drawable.bg_circle);        int Radius = DensityUtil.dip2px(context, CONST_R);        int pading = (width - Radius * 2)/2;        FrameLayout.LayoutParams view_flp = new FrameLayout.LayoutParams(Radius * 2, Radius * 2);        view_flp.leftMargin = view_flp.topMargin = (width - Radius * 2) / 2;        frameLayout.addView(view_circle, view_flp);        for(int i = 0;i//确定每个元素的显示位置。            LinearLayout linearLayout = createItem(i,items.get(i),textColor,textSize,itembgResId);            int x = (int) (Math.cos(2 * Math.PI / items.size() * i + Math.PI / 2) * Radius);            int y = (int) (Math.sin(2 * Math.PI / items.size() * i + Math.PI / 2) * Radius);            FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(itemWidth,itemWidth);            flp.leftMargin = Radius + x + pading - itemWidth / 2;            flp.topMargin = Radius - y + pading - itemWidth / 2;            frameLayout.addView(linearLayout, flp);            itemViews.add(linearLayout);        }        imageView = new ImageView(context);        imageView.setImageResource(R.drawable.tianmao);        FrameLayout.LayoutParams iv_flp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);        iv_flp.gravity = Gravity.CENTER;        iv_flp.topMargin = -DensityUtil.dip2px(context, textSize ) / 2;        frameLayout.addView(imageView,iv_flp);        setContentView(frameLayout);   //设置这个popupWindow显示的内容        frameLayout.setOnClickListener(new OnClickListener() {            public void onClick(View v) {                dismiss();            }        });    }    public void show(View view){        showAtLocation(view, Gravity.CENTER, 0, 0);        //显示的动画         {            RotateAnimation rotate = new RotateAnimation(360, 0,                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);            rotate.setDuration(500);            rotate.setFillAfter(true);            imageView.startAnimation(rotate);        }        {            ScaleAnimation scaleAnimation = new ScaleAnimation(0.3f, 1f, 0.3f, 1f, Animation.RELATIVE_TO_SELF,0.5f,                    Animation.RELATIVE_TO_SELF,0.5f);            scaleAnimation.setDuration(300);            scaleAnimation.setFillAfter(true);            view_circle.startAnimation(scaleAnimation);        }        int Radius = DensityUtil.dip2px(context, CONST_R);        for(int i = 0;iint x = (int) (Math.cos(2 * Math.PI / itemViews.size() * i + Math.PI / 2) * Radius);            int y = (int) (Math.sin(2 * Math.PI / itemViews.size() * i + Math.PI / 2) * Radius);            TranslateAnimation translateAnimation = new TranslateAnimation(-x, 0F, y, 0F);            translateAnimation.setDuration(500);            translateAnimation.setFillAfter(true);            translateAnimation.setInterpolator(new OvershootInterpolator(2F));            itemViews.get(i).startAnimation(translateAnimation);        }    }    private boolean isdimissing = false;    @Override    public void dismiss() {        if(isdimissing || !isShowing()){            return;        }        isdimissing = true;        //消失的动画        {            RotateAnimation rotate = new RotateAnimation(0, 360,                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);            rotate.setDuration(500);            rotate.setFillAfter(false);            imageView.startAnimation(rotate);        }        {            ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 0.3f, 1f, 0.3f, Animation.RELATIVE_TO_SELF,0.5f,                    Animation.RELATIVE_TO_SELF,0.5f);            scaleAnimation.setDuration(500);            scaleAnimation.setFillAfter(false);            view_circle.startAnimation(scaleAnimation);        }        int Radius = DensityUtil.dip2px(context, CONST_R);        for(int i = 0;iint x = (int) (Math.cos(2 * Math.PI / itemViews.size() * i + Math.PI / 2) * Radius);            int y = (int) (Math.sin(2 * Math.PI / itemViews.size() * i + Math.PI / 2) * Radius);            TranslateAnimation translateAnimation = new TranslateAnimation(0F, -x, 0F, y);            translateAnimation.setDuration(300);            translateAnimation.setFillAfter(false);            if(i == itemViews.size() - 1){                translateAnimation.setAnimationListener(new AnimationListener() {                    public void onAnimationStart(Animation animation) {                    }                    public void onAnimationRepeat(Animation animation) {                    }                    public void onAnimationEnd(Animation animation) {                        PathPopupWindow.super.dismiss();                        isdimissing = false;                    }                });            }            itemViews.get(i).startAnimation(translateAnimation);        }    }    private LinearLayout createItem(final int position, final PathItem item, int textColor, int textSize, int itembgResId){        LinearLayout linearLayout = new LinearLayout(context);        linearLayout.setPadding(itempadding, itempadding, itempadding, itempadding);        if(item.backgroundResId != -1){            linearLayout.setBackgroundResource(item.backgroundResId);        }else if(itembgResId != -1){            linearLayout.setBackgroundResource(itembgResId);        }else{            linearLayout.setBackgroundColor(Color.TRANSPARENT);        }        linearLayout.setOrientation(LinearLayout.VERTICAL);        final ImageView imageView = new ImageView(context);        if(item.imageResId != -1){            imageView.setImageResource(item.imageResId);            ColorMatrix cMatrix = new ColorMatrix();            cMatrix.set(new float[]{1, 0, 0, 0, 255, 0, 1, 0, 0, 255, // 改变亮度                    0, 0, 1, 0, 255, 0, 0, 0, 1, 0});            imageView.setColorFilter(new ColorMatrixColorFilter(cMatrix));        }else{            try {                imageView.setImageDrawable(context.getPackageManager().getApplicationIcon(context.getPackageName()));            }catch (Exception e){                e.printStackTrace();            }        }        LinearLayout.LayoutParams llp_imageview = new LinearLayout.LayoutParams(DensityUtil.dip2px(context, CONST_ICON_SIZE),                DensityUtil.dip2px(context, CONST_ICON_SIZE));        llp_imageview.gravity = Gravity.CENTER_HORIZONTAL;        linearLayout.addView(imageView, llp_imageview);        LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);        llp.gravity = Gravity.CENTER_HORIZONTAL;        TextView textView = new TextView(context);        textView.setTextColor(textColor);        textView.setTextSize(textSize);        textView.setText(item.name);        linearLayout.addView(textView, llp);        linearLayout.setOnClickListener(new OnClickListener() {            public void onClick(View v) {                if(mOnPathItemClickListener != null){                    mOnPathItemClickListener.onItemClick(position, item);                }            }        });        return linearLayout;    }    public interface OnPathItemClickListener{        void onItemClick(int position, PathItem item);    }}

更多相关文章

  1. Android(安卓)LsitView的实现
  2. 错误总结1,动态加载部分不能显示的原因
  3. Android实现文字垂直滚动、纵向走马灯效果的实现方式汇总
  4. Android_之动画1
  5. Android动画介绍汇总
  6. Android中EditText输入字数统计和限制
  7. Android(安卓)中的显示单位
  8. Android实现侧滑菜单DrawerLayout
  9. Android(安卓)Studio导入项目app module一直不显示

随机推荐

  1. Android::开机自启动C程序
  2. Android(安卓)7.0后访问文件权限:android.
  3. Android--Activity运用实验
  4. Android(安卓)Binder框架实现之Parcel详
  5. android学习日记(一) 获取某一会话的所有
  6. Android(安卓)Action Bar学习(一)--基本
  7. 关于android.support.v4.app.Fragment与a
  8. Android(安卓)Studio 项目模板修改
  9. 如何不让EditText不获得焦点
  10. android String.xlm中使用emoji表情的方