码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2016-07-19 10:48:59      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

一、自定义View的分类

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

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

标签:

原文地址:http://blog.csdn.net/niubitianping/article/details/51933523

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!