前言
在自定义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的。
组合控件的注意点
- 通过LayoutParams是不能控制自定义ViewGroup的大小,可以通过重写onMeasure()方法来控制
总结
组合控件真的是非常简单,但是很实用,举个例子,如果有个布局我想要向里面动态添加控件,怎么办?或者是想要一个宽高成比例的布局怎么办?这个时候实用自定义组合的控件就比较好用。。