自定义View之组合控件(下)

前言

在自定义View之组合控件(上)中讲解初步组合自己的想要的控件,这篇将会讲解如何设置属性和设置控件的位置。

设置属性

之前在attrs.xml文件中设置了一些属性并且通关过TypedArray获取到了,但是为了保证有足够的灵活性,也要能够让使用者在代码中也能设置属性,所以要提供一些方法。例如:

//设置一个动态的颜色,可以实现按下不同颜色的效果
public void setItemTextColor(ColorStateList colorStateList) {
    mTitleTextColor = colorStateList;
}
public void setImageSize(float size) {
    mImageSize = size;
}

以这种方式设置的话,一定要设置一种刷新方式,不然可用不到控件上面去。。
例如:

private TextView createTextView(BottomMenuItem item) {
    TextView titleTextView = new TextView(getContext());
    LayoutParams textViewLayoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    titleTextView.setGravity(Gravity.CENTER);
    titleTextView.setLayoutParams(textViewLayoutParams);
    titleTextView.setText(item.getTitle());
    titleTextView.setEnabled(item.isEnabled());
    titleTextView.setTextColor(mTitleTextColor);
    titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mTitleTextSize);
    return titleTextView;
}

定义控件的位置

大家在自定义View的时候可能使用onMeasure()或者是onLayout()来定义View的子元素的位置,但是组合控件不一样,它本身是一个布局,所以直接用布局来定义就可以。例如:

private ImageView createImageView(BottomMenuItem item) {
    ImageView iconImageView = new ImageView(getContext());
    //通过LayoutParams来控制控件的位置
    LayoutParams imageLayoutParams = new LayoutParams(dpToPx(mImageSize), dpToPx(mImageSize));
    imageLayoutParams.setMargins(0, dpToPx(DEFAULT_IMAGE_MARGIN_TOP), 0, dpToPx(DEFAULT_IMAGE_MARGIN_BOTTOM));
    iconImageView.setLayoutParams(imageLayoutParams);
    iconImageView.setEnabled(item.isEnabled());
    iconImageView.setImageDrawable(item.getIcon());
    return iconImageView;
}

通过LayoutParams来控制自身的大小和位置。。不过LayoutParams有很多种,最好和你的控件要放到的布局一样就OK了。如果没有那么可以用ViewGroup的。

组合控件的注意点

  1. 通过LayoutParams是不能控制自定义ViewGroup的大小,可以通过重写onMeasure()方法来控制

总结

组合控件真的是非常简单,但是很实用,举个例子,如果有个布局我想要向里面动态添加控件,怎么办?或者是想要一个宽高成比例的布局怎么办?这个时候实用自定义组合的控件就比较好用。。

你可能感兴趣的:(自定义View之组合控件(下))