自定义view基础

1.在values文件夹下创建attrs.xml文件

<!--1.在values目录下创建attrs文件  通过declare-styleable来告诉系统这个是我们自定义的属性-->
<declare-styleable name="gyx">
    <!--自定义属性的名字-->
    <attr name="title_" format="string"/>
    <attr name="titleSize" format="dimension"/>
    <attr name="titleColor" format="color"/>
    <attr name="leftTitle" format="string"/>
    <attr name="leftbackground" format="reference|color"/>
    <attr name="leftColor" format="reference|color"/>
    <attr name="rightTitle" format="string"/>
    <attr name="rightbackground" format="reference|color"/>
    <attr name="rightColor" format="reference|color"/>
</declare-styleable>

2.自定义一个类用来继承已有viewgroup 内部封装了接口 可供外部类去调用
public class MyTopBar extends RelativeLayout {
private Button leftButton, rightButton;
private TextView title;
private int leftbuttonColor;//左边button的颜色
private Drawable leftbuttonbg;//左边button的背景
private String leftText;//左边button的文字
private int rightbuttonColor;//右边button的颜色
private Drawable rightbuttonbg;//右边button的背景
private String rightText;//右边button的文字
private int titleColor;//标题的颜色
private float titleSize;//标题文字的大小
private String titleText;//标题的文字

public interface TopBarOnClick {
    void leftClick();

    void rightClick();
}

public TopBarOnClick mTopBarOnClick;

public void setOnTopBarClick(TopBarOnClick mTopBarOnClick) {
    this.mTopBarOnClick = mTopBarOnClick;
}

public MyTopBar(Context context) {//如果不用自定义属性的话这个就可以
    super(context);
}

//把一个控件放到一个layout里面  则需要LayoutParams
private LayoutParams leftParams, rightParams, titleParams;

public void setLeftButtonIsVisible(boolean flag){
if (flag ) {
rightButton.setVisibility(View.GONE);
}else {
leftButton.setVisibility(View.GONE);
}
}
//需要自定义属性 要用这个方法
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public MyTopBar(Context context, AttributeSet attrs) {
super(context, attrs);
// TypedArray存储在xml文件中获取的值
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.gyx);
leftbuttonColor = typedArray.getColor(R.styleable.gyx_leftColor, 0);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值
leftbuttonbg = typedArray.getDrawable(R.styleable.gyx_leftbackground);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值
leftText = typedArray.getString(R.styleable.gyx_leftTitle);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值

    rightbuttonColor = typedArray.getColor(R.styleable.gyx_rightColor, 0);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值
    rightbuttonbg = typedArray.getDrawable(R.styleable.gyx_rightbackground);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值
    rightText = typedArray.getString(R.styleable.gyx_rightTitle);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值

    titleColor = typedArray.getColor(R.styleable.gyx_titleColor, 0);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值
    titleSize = typedArray.getDimension(R.styleable.gyx_titleSize, 0f);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值
    titleText = typedArray.getString(R.styleable.gyx_title_);//通过R.styleable.gyx找到styleable在通过后面添加下划线加上属性的名字从而找到具体属性值
    typedArray.recycle();//回收  释放资源 或者是由于缓存造成一些错误
    leftButton = new Button(context);
    rightButton = new Button(context);
    title = new TextView(context);

    leftButton.setTextColor(leftbuttonColor);
    leftButton.setBackground(leftbuttonbg);
    leftButton.setText(leftText);
    rightButton.setTextColor(rightbuttonColor);
    rightButton.setBackground(rightbuttonbg);
    rightButton.setText(rightText);

    title.setTextColor(titleColor);
    title.setTextSize(titleSize);
    title.setText(titleText);
    title.setGravity(Gravity.CENTER);
    setBackgroundColor(0xFFF59563);
    leftParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);//增加一个规则  TURE是常量 而非真假的true  这个是RelaiveLayout特有的
    addView(leftButton, leftParams);

    rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
    addView(rightButton, rightParams);

    titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
    titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
    addView(title, titleParams);
    leftButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mTopBarOnClick != null) {
                mTopBarOnClick.leftClick();
            }
        }
    });
    rightButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mTopBarOnClick != null) {
                mTopBarOnClick.rightClick();
            }
        }
    });
}

}
3.布局引入 首先是导入包 命名空间可以随便写xmlns:cusmtom=”http://schemas.android.com/apk/res-auto”
重命名一下 要不和系统的重名了
com.suralight.widgets.MyTopBar
android:id=”@+id/mytopbar”
android:layout_width=”match_parent”
android:layout_height=”50dp”
cusmtom:titleColor=”#f00”
cusmtom:titleSize=”15sp”
cusmtom:title_=”dkdfdl”
cusmtom:leftColor=”@color/colorAccent”
cusmtom:leftTitle=”我是左边按钮”
cusmtom:leftbackground=”@color/colorPrimary”
cusmtom:rightColor=”@color/colorAccent”
cusmtom:rightTitle=”我是右边按钮”
cusmtom:rightbackground=”#000”
/>
4.外部类去调用
myTopBar.setOnTopBarClick(this);
@Override
public void leftClick() {
myTopBar.setLeftButtonIsVisible(true);
}
@Override
public void rightClick() {
myTopBar.setLeftButtonIsVisible(false);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值