什么叫深度呢?这个是我个人理解。记录下学习的内容!
一般的自定义view的方式与步骤 (这个是我以前写的另外一篇文章)。
现在开始来讲实用性更强的自定义:
其实也就依照android系统自己view的实现方式来实现自己想要的view,在慕课网有介绍(我也就是概括下)。
1、设计自己需要的属性:这个在values目录下新建一个attrs.xml文件(如果没有的话)。然后在里面定义declare-styleable元素如下。

<resources>
    <declare-styleable name="AmountView">
        <!-- 左右2边+-按钮的宽度 -->
        <attr name="btnWidth" format="dimension" />
        <!-- 中间TextView的宽度 -->
        <attr name="tvWidth" format="dimension" />
        <!--<attr name="tvColor" format="color"/>-->
        <attr name="tvTextSize" format="dimension"/>
        <attr name="btnTextSize" format="dimension"/>
    </declare-styleable>
</resources>

通过后面的format来确定该属性是什么类型值。
2、也是需要实现一个自己的View。通过继承Relativelayout布局。然后在带属性的构造方法中实现定义的属性跟上面1中写好的属性进行绑定(这个是重点) 1->。

TypedArray obtainStyledAttributes = getContext().obtainStyledAttributes(attrs, R.styleable.AmountView);
        int btnWidth = obtainStyledAttributes.getDimensionPixelSize(R.styleable.AmountView_btnWidth, LayoutParams.WRAP_CONTENT);
        int tvWidth = obtainStyledAttributes.getDimensionPixelSize(R.styleable.AmountView_tvWidth, 80);
        int tvTextSize = obtainStyledAttributes.getDimensionPixelSize(R.styleable.AmountView_tvTextSize, 0);
        int btnTextSize = obtainStyledAttributes.getDimensionPixelSize(R.styleable.AmountView_btnTextSize, 0);
        obtainStyledAttributes.recycle();

先来说明下这段代码的意思,通过上下文来获得刚才在attrs.xml下设置的属性,返回的TypedArray类型对象值是指attrs里名为AmountView的所有内容映射。
下面的方法就是通过对应attrs中format设置的格式来获取值的,第一个参数就是对应的属性了,第二个参数为默认值。最后要记得回收下资源,这个是避免浪费资源以及一些可能碰到缓存引起的问题。
2->通过new出控件来动态设置参数,如:btn.setWidth(btnWidth);这里的btnWidth就是上面获取的尺寸。当然还可以再设置Gravity等属性。
3->通过LayoutParams btnParamas = new LayoutParams(btnWidth,LayoutParams.MATCH_PARENT);
以及btnParams.addRule(Relativelayout.ALIGN_PARENT_LIFT,TRUE);来设置该按钮控件在布局的大小以及相应位置。
4->通过addView();方法把按钮对象以及参数对象传进去实现真正添加到ViewGroup中:addView(btn,btnParams);
3、在项目中需要用到的xml文件中添加该控件,添加方式一样是包名+类名。不过这个控件可以用到自己定义的属性,前提得在最外层的布局中添加自动引用xml文件方式,类似java的Import导包一样功能效果,xmlns理解为xml文件的namespace的缩写。 xmlns:app="http://schemas.android.com/apk/res-auto"

<com.hiwhitley.demo.AmountView
        android:id="@+id/amount_view"
        android:layout_width="wrap_content"
        android:layout_height="36dp"
        android:layout_centerInParent="true"
        android:layout_gravity="right"
        android:layout_marginRight="15dp"
        app:btnTextSize="14sp"
        app:btnWidth="36dp"
        app:tvWidth="50dp"/>

这最后三个属性就是引用自己定义的属性。

4、实现定义View中按钮的点击事件(模拟android系统的点击事件—接口回调)在自定义View类中实现:
①先定义一个接口并声明接口内需要实现的方法 :

public interface OnAmountChangeListener {
        void onAmountChange(View view, int amount);
    }

②声明接口对象: private OnAmountChangeListener mListener;
③暴露一个方法,把接口作为参数传递到实现的方法并初始化接口对象:

public void setOnAmountChangeListener(OnAmountChangeListener onAmountChangeListener) {
        this.mListener = onAmountChangeListener;
    }

④在MainActivity中调用改方法:

mAmountView.setOnAmountChangeListener(new AmountView.OnAmountChangeListener() {
            @Override
            public void onAmountChange(View view, int amount) {
                Toast.makeText(getApplicationContext(), "Amount=>  " + amount, Toast.LENGTH_SHORT).show();
            }
        });

自此自定义点击事件已完成。
<————————————————————————————————–>
另外我们还可以在自定义控件中写一些方法,比如是否隐藏按钮

public void isValide(boolean b){
    if(b){
    btn.setVisibility(View.VSIBLE);
    }else{
    btn.setVisibility(View.GONE);
    }
};

然后在MainActivity中调用mAmountView.isValide(true);

《——————-记录完结————————》