[安卓开发] 自定义View之一: 组合View

来源:互联网 发布:具体营销数据分析 编辑:程序博客网 时间:2024/06/08 13:48

一、自定义View的分类

1、组合View
2、继承重写View
3、全写View

这里讨论组合View

二、简介

组合View,就是组合一些View来形成一个新的View。例如QQ的头部栏,可以看到左边是ImageView,中间的TextView,右边是TextView,
当界面切换的时候,只是改变了文字。这个时候,我们就可以写一个View,把他们组合起来,形成一个我们的View

这里写图片描述
这里写图片描述

三、了解

看平常经常见的设置宽度,你知道前面的android是什么意思吗?

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);

四、实现

这里简单实现一个头部自定义View的demo。效果图: (简陋了点),大家明白意思就行了
这里写图片描述

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

2 0