第一次寫博客,寫了一個自定義的custombarbar控制元件,
先上效果吧

實作非常簡單如下
private void bindData() {
barbar1.addMiddleViewExist(barbar1.getTextView("標題1"));
barbar2.addMiddleViewExist(barbar2.getTextView("標題2"));
barbar2.addLeftView(barbar2.getImageView(R.mipmap.back));
barbar3.addMiddleViewExist(barbar3.getTextView("標題3"));
barbar3.addLeftView(barbar3.getImageView(R.mipmap.back));
barbar3.addLeftView(barbar3.getImageView(R.mipmap.back));
barbar4.addLeftView(barbar4.getImageView(R.mipmap.back));
barbar4.addMiddleViewExist(barbar4.getTextView("標題4"));
barbar4.addRightView(barbar4.getTextView("右1"));
barbar4.addRightView(barbar4.getTextView("右2"));
barbar5.addMiddleViewExist(barbar5.getTextView("標題5"));
barbar5.addLeftView(barbar5.getTextView("左1"));
barbar5.addLeftView(barbar5.getTextView("左2"));
barbar5.addRightView(barbar5.getImageView(R.mipmap.add));
barbar5.addRightView(barbar5.getTextView("右2"));
barbar5.addRightView(barbar5.getTextView("右3"));
barbar6.addMiddleViewExist(barbar6.getTextView("標題6"));
barbar6.addLeftView(barbar6.getTextView("左1"));
barbar6.addLeftView(barbar6.getTextView("左2"));
barbar6.addLeftView(barbar6.getTextView("左3"));
barbar6.addRightView(barbar6.getImageView(R.mipmap.add));
barbar6.addRightView(barbar6.getTextView("右2"));
barbar6.addRightView(barbar6.getTextView("右3"));
barbar6.addRightView(barbar6.getTextView("右4"));
}
主要是動態控制顯示,可擴展性強
上控制元件代碼........
/**
* addLeftView 添加左邊控制元件,按先后順序排列
* addRightView 添加右邊控制元件,按先后順序排列
* addMiddleViewExist 添加中間控制元件,只允許同時存在一個
*
* @author fmh
*/
public class CustomBarbar extends RelativeLayout {
private ArrayList<ViewItem> views = new ArrayList<>(0);
/**
* 間隙
*/
private int gap = 0;
public CustomBarbar(Context context) {
super(context);
}
public CustomBarbar(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public CustomBarbar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
private void init(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CustomBarbar);
gap = a.getDimensionPixelSize(R.styleable.CustomBarbar_gap, 10);
a.recycle();
}
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);
View lastViewByModel = null;
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) {
lastViewByModel = item.view;
}
}
//中間只允許放一個
if (model == Model.MIDDLE && lastViewByModel != null) {
removeView(lastViewByModel);
lastViewByModel = null;
}
if (lastViewByModel == null) {
lp.addRule(rule);
} else {
switch (model) {
case LEFT:
lp.leftMargin = gap;
lp.addRule(RIGHT_OF, lastViewByModel.getId());
break;
case RIGHT:
lp.rightMargin = gap;
lp.addRule(LEFT_OF, lastViewByModel.getId());
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)添加中間控制元件,只允許同時存在一個
方法如其名,代碼邏輯也很簡單,希望大家多多提意見
我在控制元件內定義了一個getImageView和getTextView主要是這2個使用頻率較高,添加其他的控制元件就可以自行初始化對應的控制元件
以前主要是做手機系統研發,最近開始寫app,所以自己會寫一些通用的東西
github地址:https://github.com/ff525257/custombarbar
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/152780.html
標籤:其他
下一篇:wx朋友圈Hook(一)
