标签:
1、组合View
2、继承重写View
3、全写View
组合View,就是组合一些View来形成一个新的View。例如QQ的头部栏
**
android:layout_width="match_parent"
上面这个前缀android是根据 根控件的
xmlns:**android**="http://schemas.android.com/apk/res/android"
这个来命名的,这是系统的。我们要自定义View的属性,就加这个属性
xmlns:app="http://schemas.android.com/apk/res-auto"
app就是我们定义的前缀名,当然你可以随便修改。
实现类里面通过下面的代码来获取到自定义的属性,
TypedArray ta = mContext.obtainStyledAttributes(attrs,R.styleable.TopBar);
1、atts.xml , 自定义View 的属性 ,在values下新建文件atts.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 头部的自定义View的属性 -->
<declare-styleable name="TopBar">
<!-- 文字 -->
<attr name="title" format="string"/>
<attr name="leftText" format="string"/>
<attr name="rightText" format="string"/>
<!-- 背景 -->
<attr name="titleBack" format="reference|color"/>
<attr name="leftBack" format="reference|color"/>
<attr name="rightBack" format="reference|color"/>
<!-- 字体颜色 -->
<attr name="titleTextColor" format="color"/>
<attr name="leftTextColor" format="color"/>
<attr name="rightTextColor" format="color"/>
<!-- 字体大小 -->
<attr name="leftTextSize" format="dimension"/>
<attr name="rightTextSize" format="dimension"/>
<attr name="titleTextSize" format="dimension"/>
</declare-styleable>
</resources>
2、新建TopBar.java ,自定义view的内容类
public class TopBar extends LinearLayout {
//控件
private Button btHeadLeft;
private TextView tvHeadTitle;
private Button btHeadRight;
//左边的Button
private String leftText;
private Drawable leftBack;
private int leftTextColor;
private float leftTextSize;
//右边的Button
private String rightText;
private Drawable rightBack;
private int rightTextColor;
private float rightTextSize;
//中间的标题
private String titleText;
private Drawable titleBack;
private int titleTextColor;
private float titleTextSize;
private Context mContext;
private LayoutParams leftParams,rightParams,titleParams;
public TopBar(Context context) {
super(context);
}
public TopBar(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initView(attrs);
initListener();
}
/**
* 初始化View
* @param attrs atts文件
*/
private void initView(AttributeSet attrs){
//获取自定义View的值
TypedArray ta = mContext.obtainStyledAttributes(attrs,R.styleable.TopBar);
rightText = ta.getString(R.styleable.TopBar_rightText);
rightBack = ta.getDrawable(R.styleable.TopBar_rightBack);
rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor,0);
rightTextSize = ta.getDimension(R.styleable.TopBar_rightTextSize,0);
leftText = ta.getString(R.styleable.TopBar_leftText);
leftBack = ta.getDrawable(R.styleable.TopBar_leftBack);
leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor,0);
leftTextSize = ta.getDimension(R.styleable.TopBar_leftTextSize,0);
titleText = ta.getString(R.styleable.TopBar_title);
titleBack = ta.getDrawable(R.styleable.TopBar_titleBack);
titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor,0);
titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize,0);
ta.recycle(); //回收
//初始化控件
btHeadLeft = new Button(mContext);
tvHeadTitle = new TextView(mContext);
btHeadRight = new Button(mContext);
//为控件设置值
btHeadLeft.setText(leftText);
btHeadLeft.setTextColor(leftTextColor);
btHeadLeft.setTextSize(leftTextSize);
btHeadLeft.setBackground(leftBack);
btHeadRight.setText(rightText);
btHeadRight.setTextColor(rightTextColor);
btHeadRight.setTextSize(rightTextSize);
btHeadRight.setBackground(rightBack);
tvHeadTitle.setText(titleText);
tvHeadTitle.setTextColor(titleTextColor);
tvHeadTitle.setTextSize(titleTextSize);
tvHeadTitle.setBackground(titleBack);
//设置View的背景颜色
this.setBackgroundColor(0xFF593363);
//设置布局属性
leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
titleParams.weight = 1;
tvHeadTitle.setGravity(Gravity.CENTER);
this.addView(btHeadLeft,leftParams);
this.addView(tvHeadTitle,titleParams);
this.addView(btHeadRight,rightParams);
}
/**
* 初始化回调事件
*/
private void initListener(){
btHeadLeft.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
iTopBarOnClicklistener.leftOnClick();
}
});
btHeadRight.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
iTopBarOnClicklistener.rightOnClick();
}
});
tvHeadTitle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
iTopBarOnClicklistener.titleOnClick();
}
});
}
public Button getBtHeadLeft() {
return btHeadLeft;
}
public void setBtHeadLeft(Button btHeadLeft) {
this.btHeadLeft = btHeadLeft;
}
public TextView getTvHeadTitle() {
return tvHeadTitle;
}
public void setTvHeadTitle(TextView tvHeadTitle) {
this.tvHeadTitle = tvHeadTitle;
}
public Button getBtHeadRight() {
return btHeadRight;
}
public void setBtHeadRight(Button btHeadRight) {
this.btHeadRight = btHeadRight;
}
public String getLeftText() {
return leftText;
}
public void setLeftText(String leftText) {
this.leftText = leftText;
}
public Drawable getLeftBack() {
return leftBack;
}
public void setLeftBack(Drawable leftBack) {
this.leftBack = leftBack;
}
public int getLeftTextColor() {
return leftTextColor;
}
public void setLeftTextColor(int leftTextColor) {
this.leftTextColor = leftTextColor;
}
public float getLeftTextSize() {
return leftTextSize;
}
public void setLeftTextSize(float leftTextSize) {
this.leftTextSize = leftTextSize;
}
public String getRightText() {
return rightText;
}
public void setRightText(String rightText) {
this.rightText = rightText;
}
public Drawable getRightBack() {
return rightBack;
}
public void setRightBack(Drawable rightBack) {
this.rightBack = rightBack;
}
public int getRightTextColor() {
return rightTextColor;
}
public void setRightTextColor(int rightTextColor) {
this.rightTextColor = rightTextColor;
}
public float getRightTextSize() {
return rightTextSize;
}
public void setRightTextSize(float rightTextSize) {
this.rightTextSize = rightTextSize;
}
public String getTitleText() {
return titleText;
}
public void setTitleText(String titleText) {
this.titleText = titleText;
}
public Drawable getTitleBack() {
return titleBack;
}
public void setTitleBack(Drawable titleBack) {
this.titleBack = titleBack;
}
public int getTitleTextColor() {
return titleTextColor;
}
public void setTitleTextColor(int titleTextColor) {
this.titleTextColor = titleTextColor;
}
public float getTitleTextSize() {
return titleTextSize;
}
public void setTitleTextSize(float titleTextSize) {
this.titleTextSize = titleTextSize;
}
public Context getmContext() {
return mContext;
}
public void setmContext(Context mContext) {
this.mContext = mContext;
}
public LayoutParams getLeftParams() {
return leftParams;
}
public void setLeftParams(LayoutParams leftParams) {
this.leftParams = leftParams;
}
public LayoutParams getRightParams() {
return rightParams;
}
public void setRightParams(LayoutParams rightParams) {
this.rightParams = rightParams;
}
public LayoutParams getTitleParams() {
return titleParams;
}
public void setTitleParams(LayoutParams titleParams) {
this.titleParams = titleParams;
}
/**
* 显示隐藏左边的View
* @param vis View.VISIABLE ...
*/
public void setLeftVisibility(int vis){
btHeadLeft.setVisibility(vis);
}
/**
* 显示隐藏右边的View
* @param vis View.VISIABLE ...
*/
public void setRightVisibility(int vis){
btHeadRight.setVisibility(vis);
}
//点击的回调接口
public void setiTopBarOnClicklistener(ITopBarOnClicklistener iTopBarOnClicklistener) {
this.iTopBarOnClicklistener = iTopBarOnClicklistener;
}
private ITopBarOnClicklistener iTopBarOnClicklistener;
public interface ITopBarOnClicklistener{
void leftOnClick();
void titleOnClick();
void rightOnClick();
}
public void setTopBarOnClickListener(ITopBarOnClicklistener iTopBarOnClicklistener){
this.iTopBarOnClicklistener = iTopBarOnClicklistener;
}
}
MainActivty.java
public class MainActivity extends AppCompatActivity implements TopBar.ITopBarOnClicklistener{
private TopBar tbHeader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tbHeader = (TopBar) findViewById(R.id.tb_header);
tbHeader.setiTopBarOnClicklistener(this);
tbHeader.setLeftVisibility(View.GONE);
}
@Override
public void leftOnClick() {
Toast.makeText(this,"left",Toast.LENGTH_SHORT).show();
}
@Override
public void titleOnClick() {
Toast.makeText(this,"title",Toast.LENGTH_SHORT).show();
}
@Override
public void rightOnClick() {
Toast.makeText(this,"right",Toast.LENGTH_SHORT).show();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- 通过完整路径来引用自定义View ,app的属性就是自己在atts里面定义的属性 -->
<com.example.topbar.TopBar
android:id="@+id/tb_header"
android:layout_width="match_parent"
android:layout_height="50dp"
app:leftText="左边"
app:leftTextColor="@color/colorAccent"
app:leftTextSize="13sp"
app:leftBack="@color/colorPrimary"
app:rightBack="@color/colorPrimaryDark"
app:rightText="右边"
app:rightTextColor="@color/colorAccent"
app:rightTextSize="12sp"
app:title="标题"
app:titleTextColor="@color/colorAccent"
app:titleTextSize="12sp"
/>
</RelativeLayout>
demo下载: http://download.csdn.net/detail/niubitianping/9578419
标签:
原文地址:http://blog.csdn.net/niubitianping/article/details/51933523