自定义actionbar

第一次写博客,写了一个自定义的custombarbar控件,

先上效果吧

自定义actionbar

 

主要是动态控制显示,可扩展性强

上代码........

/**
 * addLeftView 添加左边控件,按先后顺序排列
 * addRightView 添加右边控件,按先后顺序排列
 * addMiddleViewExist 添加中间控件,只允许同时存在一个
 *
 * @author fmh
 */
public class CustomBarbar extends RelativeLayout {
    private ArrayList<ViewItem> views = new ArrayList<>(0);

    public CustomBarbar(Context context) {
        super(context);
    }

    public CustomBarbar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomBarbar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public View addLeftView(View view) {
        return addCustomView(view, Model.LEFT);
    }

    public View addRightView(View view) {
        return addCustomView(view, Model.RIGHT);
    }

    public View addMiddleViewExist(View view) {
        return addCustomView(view, Model.MIDDLE);
    }

    private View addCustomView(View view, Model model) {
        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        int lastLeftId = -1;
        int rule = ALIGN_PARENT_LEFT;
        switch (model) {
            case LEFT:
                rule = ALIGN_PARENT_LEFT;
                break;
            case RIGHT:
                rule = ALIGN_PARENT_RIGHT;
                break;
            case MIDDLE:
                rule = CENTER_IN_PARENT;
                break;
        }
        for (ViewItem item : views) {
            if (item.model == model) {
                lastLeftId = item.view.getId();
            }
        }
        //中间只允许放一个
        if (model == Model.MIDDLE && lastLeftId != -1) {
            removeView(findViewById(lastLeftId));
            lastLeftId = -1;
        }

        if (lastLeftId == -1) {
            lp.addRule(rule);
        } else {
            switch (model) {
                case LEFT:
                    lp.leftMargin = 25;
                    lp.addRule(RIGHT_OF, lastLeftId);
                    break;
                case RIGHT:
                    lp.rightMargin = 25;
                    lp.addRule(LEFT_OF, lastLeftId);
                    break;
                case MIDDLE:
                    break;
            }

        }


        lp.addRule(CENTER_VERTICAL);
        addView(view, lp);
        views.add(new ViewItem(view, model));
        view.setId(views.size());
        return view;
    }

    /**
     * 获取textview
     *
     * @param text
     * @return
     */
    public TextView getTextView(String text) {
        TextView textView = new TextView(getContext());
        textView.setText(text);
        return textView;
    }

    /**
     * 获取ImageView
     *
     * @param resId
     * @return
     */
    public ImageView getImageView(int resId) {
        ImageView imageView = new ImageView(getContext());
        if (resId != NO_ID) {
            imageView.setImageResource(resId);
        }
        return imageView;
    }

    private class ViewItem {
        public View view;
        public Model model = Model.LEFT;

        public ViewItem(View view, Model model) {
            this.view = view;
            this.model = model;
        }

    }

    public enum Model {
        LEFT, MIDDLE, RIGHT
    }

}

 

 

addLeftView(View)
addRightView(View)
addMiddleViewExist(View)

方法如其名,代码逻辑也很简单

 

 

简单粗暴,至于25就是2个控件间隙,直接写死了,不可取哈.....

 

github地址:https://github.com/ff525257/custombarbar

后续可能会更新,哈哈哈哈哈哈