自定義組合控制元件
阿新 • • 發佈:2019-01-07
com.hybunion.customview.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.hybunion.customview.R;
/**
* Created by Hbj on 2016/8/19.
*/
public class TopBar extends RelativeLayout {
// 包含topbar上的元素:左按鈕、右按鈕、標題
private Button mLeftButton, mRightButton;
private TextView mTitleView;
// 佈局屬性,用來控制組件元素在ViewGroup中的位置
private LayoutParams mLeftParams, mTitlepParams, mRightParams;
// 左按鈕的屬性值,即我們在atts.xml檔案中定義的屬性
private int mLeftTextColor;
private Drawable mLeftBackground;
private String mLeftText;
// 右按鈕的屬性值,即我們在atts.xml檔案中定義的屬性
private int mRightTextColor;
private Drawable mRightBackground;
private String mRightText;
// 標題的屬性值,即我們在atts.xml檔案中定義的屬性
private float mTitleTextSize;
private int mTitleTextColor;
private String mTitle;
// 對映傳入的介面物件
private topbarClickListener mListener;
public TopBar(Context context) {
super(context);
}
public TopBar(Context context, AttributeSet attrs) {
super(context, attrs);
// 設定topbar的背景
setBackgroundColor(0xFFF59563);
/**
* 通過這個方法,將你在atts.xml中定義的declare-styleable的所有屬性的值儲存到TypedArray中
*/
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar);
//從TypedArray中取出對應的值來為要設定的屬性賦值
mLeftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
mLeftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);
mLeftText = ta.getString(R.styleable.TopBar_leftText);
mRightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
mRightBackground = ta.getDrawable(R.styleable.TopBar_rightBackGround);
mRightText = ta.getString(R.styleable.TopBar_rightText);
mTitleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 10);
mTitleTextColor = ta.getColor(R.styleable.TopBar_mtitleTextColor, 0);
mTitle = ta.getString(R.styleable.TopBar_mtitle);
// 獲取完TypedArray的值後,一般要呼叫
// recyle方法來避免重新建立的時候的錯誤
ta.recycle();
mLeftButton = new Button(context);
mRightButton = new Button(context);
mTitleView = new TextView(context);
// 為建立的元件元素賦值
// 值就來源於我們在引用的xml檔案中給對應屬性的賦值
mLeftButton.setTextColor(mLeftTextColor);
mLeftButton.setBackground(mLeftBackground);
mLeftButton.setText(mLeftText);
mRightButton.setTextColor(mRightTextColor);
mRightButton.setBackground(mRightBackground);
mRightButton.setText(mRightText);
mTitleView.setText(mTitle);
mTitleView.setTextSize(mTitleTextSize);
mTitleView.setTextColor(mTitleTextColor);
mTitleView.setGravity(Gravity.CENTER);
/**
* 為元件元素設定相應的佈局元素
*/
//左控制元件
mLeftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
mLeftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);
// 新增到ViewGroup
addView(mLeftButton, mLeftParams);
//右控制元件
mRightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
mRightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
addView(mRightButton, mRightParams);
//中間的控制元件
mTitlepParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
mTitlepParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
addView(mTitleView, mTitlepParams);
// 按鈕的點選事件,不需要具體的實現,
// 只需呼叫介面的方法,回撥的時候,會有具體的實現
mLeftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mListener.leftClick();
}
});
mRightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mListener.rightClick();
}
});
}
public TopBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// 暴露一個方法給呼叫者來註冊介面回撥
// 通過介面來獲得回撥者對介面方法的實現
public void setOnTopbarClickListener(topbarClickListener mListener) {
this.mListener = mListener;
}
// 介面物件,實現回撥機制,在回撥方法中
// 通過對映的介面物件呼叫介面中的方法
// 而不用去考慮如何實現,具體的實現由呼叫者去建立
public interface topbarClickListener {
//左按鈕點選事件
void leftClick();
//右按鈕點選事件
void rightClick();
}
/**
* 設定按鈕的顯示與否 通過id區分按鈕,flag區分是否顯示
*
* @param id id
* @param flag 是否顯示
*/
public void setButtonVisable(int id, boolean flag) {
if (flag) {
if (id == 0) {
mLeftButton.setVisibility(View.VISIBLE);
} else {
mRightButton.setVisibility(VISIBLE);
}
} else {
if (id == 0) {
mLeftButton.setVisibility(GONE);
} else {
mRightButton.setVisibility(GONE);
}
}
}
}