转载请注明出处:王亟亟的大牛之路
我们平时自定义的一些Button通常是改改颜色啊,文本啊,圆角啊之类的。如果要做到再高级点就需要用一个大布局还拼接了,如果一个页面有很多样式不同的这样的按钮,还真不怎么好操作。
今天给大家上一个FancyButton能很好的帮助我们简化这些操作
项目结构:
只有一个类外加一些assets包下的字体文件或资源文件的一些Icon就能呈现以下效果:
首先先介绍下FancyButton这个类的一些重要的方法和实现:
继承LinearLayout根据我们的实际场景需要再判断为水平还是垂直的LinearLayout
public class FancyButton extends LinearLayout
一系列的初始化操作和参数申明
private Context mContext;
// 初始化背景参数
private int mDefaultBackgroundColor = Color.BLACK;
private int mFocusBackgroundColor = 0;
//初始化字体参数
private int mDefaultTextColor = Color.WHITE;
private int mDefaultIconColor = Color.WHITE;
private int mTextPosition = 1;
private int mDefaultTextSize = 15;
private int mDefaultTextGravity = 0x11; // Gravity.CENTER
private String mText = null;
// 初始化Icon参数
private Drawable mIconResource = null;
private int mFontIconSize = 15;
private String mFontIcon = null;
private int mIconPosition = 1;
private int mIconPaddingLeft = 10;
private int mIconPaddingRight = 10;
private int mIconPaddingTop = 0;
private int mIconPaddingBottom = 0;
private int mBorderColor = Color.TRANSPARENT;
private int mBorderWidth = 0;
private int mRadius = 0;
private Typeface mTextTypeFace = null;
private Typeface mIconTypeFace = null;
/**
* 标识图标位置的标记
*/
public static final int POSITION_LEFT = 1;
public static final int POSITION_RIGHT = 2;
public static final int POSITION_TOP = 3;
public static final int POSITION_BOTTOM = 4;
//默认字体
private String mDefaultIconFont = "fontawesome.ttf";
private String mDefaultTextFont = "robotoregular.ttf";
private ImageView mIconView;
private TextView mFontIconView;
private TextView mTextView;
构造函数
/**
* 默认构造函数
* @param context : Context
*/
public FancyButton(Context context){
super(context);
this.mContext = context;
mTextTypeFace = Typeface.createFromAsset(mContext.getAssets(), String.format("fonts/%s", mDefaultTextFont));
mIconTypeFace = Typeface.createFromAsset(mContext.getAssets(), String.format("iconfonts/%s", mDefaultIconFont));
initializeFancyButton();
}
/**
* 默认构造函数调用布局
* @param context : Context
* @param attrs : Attributes Array
*/
public FancyButton(Context context, AttributeSet attrs){
super(context,attrs);
this.mContext = context;
TypedArray attrsArray = context.obtainStyledAttributes(attrs,R.styleable.FancyButtonsAttrs, 0, 0);
initAttributsArray(attrsArray);
attrsArray.recycle();
initializeFancyButton();
}
对一些控件所需的素材进行初始化操作
/**
* 各种初始化
*/
private void initializeFancyButton(){
initializeButtonContainer();
mTextView = setupTextView();
mIconView = setupIconView();
mFontIconView = setupFontIconView();
int iconIndex,textIndex;
View view1,view2;
if(mIconView == null && mFontIconView == null && mTextView == null){
Button tempTextView = new Button(mContext);
tempTextView.setText("Fancy Button");
this.addView(tempTextView);
}else{
this.removeAllViews();
setupBackground();
ArrayList<View> views = new ArrayList<>();
if(mIconPosition == POSITION_LEFT || mIconPosition == POSITION_TOP){
if(mIconView != null){
views.add(mIconView);
}
if(mFontIconView != null){
views.add(mFontIconView);
}
if(mTextView != null){
views.add(mTextView);
}
}else{
if(mTextView != null){
views.add(mTextView);
}
if(mIconView != null){
views.add(mIconView);
}
if(mFontIconView != null){
views.add(mFontIconView);
}
}
for(View view : views){
this.addView(view);
}
}
}
/**
* 设置文本视图
* @return : TextView
*/
private TextView setupTextView(){
if (mText != null) {
TextView textView = new TextView(mContext);
textView.setText(mText);
textView.setGravity(mDefaultTextGravity);
textView.setTextColor(mDefaultTextColor);
textView.setTextSize(mDefaultTextSize);
textView.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f));
if (!isInEditMode() && mTextTypeFace!=null) {
textView.setTypeface(mTextTypeFace);
}
return textView;
}
return null;
}
/**
* 设置字体图标视图
* @return : TextView
*/
private TextView setupFontIconView(){
if(mFontIcon!=null){
TextView fontIconView = new TextView(mContext);
fontIconView.setTextColor(mDefaultIconColor);
LayoutParams iconTextViewParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,1f);
iconTextViewParams.rightMargin = mIconPaddingRight;
iconTextViewParams.leftMargin = mIconPaddingLeft;
iconTextViewParams.topMargin = mIconPaddingTop;
iconTextViewParams.bottomMargin = mIconPaddingBottom;
if(mTextView != null){
if(mIconPosition==POSITION_TOP || mIconPosition==POSITION_BOTTOM){
iconTextViewParams.gravity = Gravity.CENTER;
fontIconView.setGravity(Gravity.CENTER);
}
else{
fontIconView.setGravity(Gravity.CENTER_VERTICAL);
iconTextViewParams.gravity = Gravity.CENTER_VERTICAL;
}
}else{
iconTextViewParams.gravity = Gravity.CENTER;
fontIconView.setGravity(Gravity.CENTER_VERTICAL);
}
fontIconView.setLayoutParams(iconTextViewParams);
if(!isInEditMode()){
fontIconView.setTextSize(mFontIconSize);
fontIconView.setText(mFontIcon);
fontIconView.setTypeface(mIconTypeFace);
}else{
fontIconView.setText("O");
}
return fontIconView;
}
return null;
}
/**
* 文本图标资源视图
* @return : ImageView
*/
private ImageView setupIconView(){
if (mIconResource != null){
ImageView iconView = new ImageView(mContext);
iconView.setImageDrawable(mIconResource);
iconView.setPadding(mIconPaddingLeft, mIconPaddingTop, mIconPaddingRight, mIconPaddingBottom);
LayoutParams iconViewParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
if(mTextView!=null){
if(mIconPosition==POSITION_TOP || mIconPosition==POSITION_BOTTOM)
iconViewParams.gravity = Gravity.CENTER;
else
iconViewParams.gravity = Gravity.START;
iconViewParams.rightMargin = 10;
iconViewParams.leftMargin = 10;
}else{
iconViewParams.gravity = Gravity.CENTER_VERTICAL;
}
iconView.setLayoutParams(iconViewParams);
return iconView;
}
return null;
}
/**
* 初始化属性数组
* @param attrsArray : Attributes array
*/
private void initAttributsArray(TypedArray attrsArray){
mDefaultBackgroundColor = attrsArray.getColor(R.styleable.FancyButtonsAttrs_defaultColor,mDefaultBackgroundColor);
mFocusBackgroundColor = attrsArr