自定义View之组合控件

原创 2017年01月03日 09:23:36

第一步:定义属性—-在res下的values目录下创建一个attrs.xml的文件,定义一些自己用到的属性

有关属性的详解

<resources>
    <declare-styleable name="TopBar">
        <attr name="title" format="string"></attr>
        <attr name="titleTextSize" format="dimension"></attr>
        <attr name="titleTextColor" format="color"></attr>
        <attr name="leftTextColor" format="color"></attr>
        <attr name="leftBackground" format="reference|color"></attr>
        <attr name="leftText" format="string"></attr>
        <attr name="rightTextColor" format="color"></attr>
        <attr name="rightBackground" format="reference|color"></attr>
        <attr name="rightText" format="string"></attr>
    </declare-styleable>
</resources>

定义完属性后,新建一个自定义的类继承ViewGroup.这里继承至RelativeLayout

/**
 * 组合控件
 */
public class CompoundControl extends RelativeLayout{
    private topbarClickListener topbarClickListener;
    private Button leftButton,rightButton;
    private TextView mTextTitle;
    private String leftText,mRightText,mTitleText;
    private int leftTextColor,mRightTextColor,mTitleTextColor;
    private float mTitleTextSize;
    private Drawable mRightBackground,mLeftBackground;
    private LayoutParams LeftlayoutParams,rightLayoutParams,TitleLayoutParams;
    public CompoundControl(Context context) {
        super(context);

    }

    public CompoundControl(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);//记得调用初始化
    }

    public CompoundControl(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);//记得调用初始化
    }

    /**
     * 获取自定义的属性 设置属性参数
     * @param context
     * @param attrs
     */
    private void init(Context context,AttributeSet attrs){
        /**
         * 第一步引用自定义属性
         */
        TypedArray array=context.obtainStyledAttributes(attrs,R.styleable.TopBar);
        /**
         * 赋值  
         */

        //左边的按钮
        leftTextColor = array.getColor(R.styleable.TopBar_leftTextColor,0);
        leftText=array.getString(R.styleable.TopBar_leftText);
        mLeftBackground=array.getDrawable(R.styleable.TopBar_leftBackground);

        //右边的
        mRightBackground=array.getDrawable(R.styleable.TopBar_rightBackground);
        mRightText=array.getString(R.styleable.TopBar_rightText);
        mRightTextColor=array.getColor(R.styleable.TopBar_rightTextColor,0);

        //标题
        mTitleText=array.getString(R.styleable.TopBar_title);
        mTitleTextColor=array.getColor(R.styleable.TopBar_titleTextColor,0);
        mTitleTextSize=array.getDimension(R.styleable.TopBar_titleTextSize,10);
        /**
         * 记得调用recycler避免重新创建的时候错误
         */
        array.recycle();//回收

        /**
         * 自定义三个控件
         */
        leftButton=new Button(context);
        rightButton=new Button(context);
        mTextTitle=new TextView(context);

        leftButton.setText(leftText);
        leftButton.setTextColor(leftTextColor);
        leftButton.setBackground(mLeftBackground);

        rightButton.setText(mRightText);

        mTextTitle.setText(mTitleText);
        mTextTitle.setTextColor(mTitleTextColor);
        mTextTitle.setTextSize(mTitleTextSize);
        mTextTitle.setGravity(Gravity.CENTER);

        /**
         * 设置控件的大小
         */
        LeftlayoutParams=new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        LeftlayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,TRUE);
        /**
         * 添加到ViewGroup
         */
        addView(leftButton,LeftlayoutParams);

        rightLayoutParams=new LayoutParams(LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        rightLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);
        addView(rightButton,rightLayoutParams);

        TitleLayoutParams=new LayoutParams(LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        TitleLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT,TRUE);
        addView(mTextTitle,TitleLayoutParams);
        setOnClickListener();


    }

    /**
     * 设置点击事件  我在这里只写了左边的点击事件
     * 自定义一个接口  通过映射接口去调用实现方法
     */
    private void setOnClickListener(){
        leftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                topbarClickListener.leftClick();
            }
        });
    }


    /**
     * 给外部提供一个调用的方法
     * @param on
     */
    public void setTopbarClickListener(topbarClickListener on
    ){
        this.topbarClickListener=on;
    }

点击事件接口

public interface topbarClickListener {

    void leftClick();
    void rightClick();
}

引用自定义的类—注意名字空间 xmlns:cumtor可以随便起名

<wifi.yeeloor.com.scoller.CompoundControl
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cumtor="http://schemas.android.com/apk/res-auto"
    android:id="@+id/topBar"
    cumtor:leftText="Back"
    cumtor:leftTextColor="#000000"
    cumtor:title="自定义标题"
    cumtor:titleTextSize="15sp"
    cumtor:titleTextColor="#123412"
    cumtor:rightText="More"
    android:layout_width="match_parent"
    android:layout_height="40dp"></wifi.yeeloor.com.scoller.CompoundControl>
<!--记得属性必须全写-->

然后通过引用<include>调用到相应的位置

    <include layout="@layout/topbar" android:id="@+id/mainTopbar"></include>
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android View体系(十)自定义组合控件

上一篇我们讲到了自定义View,接着我们来讲讲常用的自定义组合控件,自定义组合控件就是多个控件组合起来成为一个新的控件,主要用来解决多次重复的使用同一类型的布局。比如我们应用的顶部的标题栏,还有弹出的...
  • itachi85
  • itachi85
  • 2016年05月19日 17:10
  • 10465

Android自定义控件View(三)组合控件

不少人应该见过小米手机系统音量控制UI,一个圆形带动画效果的音量加减UI,效果很好看。它是怎么实现的呢?这篇博客来揭开它的神秘面纱。先上效果图 相信很多人都知道Android自定义控件的三种方式,A...
  • feidu804677682
  • feidu804677682
  • 2015年05月30日 09:49
  • 6560

自定义组合控件,自定义View,接口点击事件

 先写自定义组合控件的布局LoginView 继承自LinearLayout public class LoginViewextends LinearLayoutimplements Vi...
  • Developer_Sir
  • Developer_Sir
  • 2017年11月05日 20:11
  • 155

自定义控件(一):组合控件的使用

一.组合控件的作用   对于view控件的理解,对于一个控件能够在应用中显示出来.需要java代码的实现,在布局文件中的xml格式的出现简化了布局.但布局文件中的属性,也是需要事先人为指定的.这里需...
  • dygcomed
  • dygcomed
  • 2016年08月22日 14:48
  • 193

Android 自定义view第二弹——组合控件

概述:本篇为自定义控件的三种实现方式第一种—组合控件,在此篇中,我将以一个例子的形式来展现组合控件的实现方式。一组合控件的定义自定义组合控件一般来说都是以ViewGroup及其子类(LinearLay...
  • qq_33553515
  • qq_33553515
  • 2017年01月18日 18:10
  • 358

Android自定义View使用canvas实现轮播图效果

1.功能分析 1.1 左右滑动切换图片,并且实现循环切换。 1.2 自动切换图片 1.3 导航圆点跟随轮播变更 1.4 点击图片,实现监听反馈 1.5 图片需要适配屏幕,按定义宽高显示 ...
  • ljzdyh
  • ljzdyh
  • 2016年07月25日 14:13
  • 1998

Android自定义view组合控件解析

在开发中,或许一个业务需求中会出现很多系统控件组合成的布局,并且经常需要复用。在一款app中,可能不同的界面 类似的view要出现很多次,这个时候 就可以设计自己的view控件,就称为组合控件吧。 这...
  • qq_14902389
  • qq_14902389
  • 2016年10月13日 23:58
  • 851

分分钟搞定自定义控件之组合控件--自定义View入门篇

今天给大家详细讲解一下如何实现自定义组合控件,组合控件其实很简单。大家可以自由地组合任意控件。好了,下面开始我们的正文。 我们要实现的效果如右图底部所示,其实呢!大家只要把握规律,还是挺容易的。 ...
  • qq_21004057
  • qq_21004057
  • 2016年09月22日 23:08
  • 506

自定义View之组合控件

前言:很多时候我们需要将一些控件组合起来封装成一个新的完整的控件重复地运用在APP中,这篇博客通过一个例子把完整的步骤记录下来。        接下来封装一个简单的标题栏,效果如下:         ...
  • chenhao0428
  • chenhao0428
  • 2016年07月21日 09:29
  • 563

Android组合控件(无限轮播图)

android 自定义控件 是的,真的是自定义控件。 相对于自定义控件的控件是什么呢?当然是原生的控件啦! 比如说: 1、Button 、TextView 、ImageView...
  • TrillGates
  • TrillGates
  • 2016年12月27日 17:10
  • 293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义View之组合控件
举报原因:
原因补充:

(最多只允许输入30个字)