/**
* 根据指定的宽高比,动态设置imageview的高
* @author cui
*
*/
public class RatioImageView extends ImageView {
public float ratio = 0f;
public RatioImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* xml 中使用自定义属性的时候,走这个方法
* @param context
* @param attrs
*/
public RatioImageView(Context context, AttributeSet attrs) {
super(context, attrs);
ratio = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res/com.tencent.apps", "ratio", 0f);
}
public RatioImageView(Context context) {
super(context);
}
/**
* 要复用这个类ratio就必须动态设置
* 方法一:setRatio(int ratio)
* 方法二:自定义属性attrx.xml
*/
public void setRatio(int ratio){
this.ratio = ratio;
}
/**
* MeasureSpec: 测量规则,由size和mode组成
* size : 表示当前控件具体的像素值
* mode : 测量的模式,共三种:
* MeasureSpec.AT_MOST : 对应的是wrap_content;
* MeasureSpec.EXACTLY : 对应的是match_parent,具体的dp值
* MeasureSpec.UNSPECIFIED : 未定义的,一般多用于ListView对adapter的View测量中
*
* widthMeasureSpec: 是父View通过size和mode计算好的测量规则
* heightMeasureSpec: 是父View通过size和mode计算好的测量规则
*/
/**
* 1 根据测量规则拿到宽
* 2 根据宽高比+宽 得到高
* 3 将高做成测量规则中
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
if (ratio != 0) {
int height = (int) (width/ratio);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
自定义控件:动态获取控件的高
最新推荐文章于 2025-04-12 00:15:00 发布