创建具有与宽度相关的高度的自定义RelativeLayout
Posted
技术标签:
【中文标题】创建具有与宽度相关的高度的自定义RelativeLayout【英文标题】:Create custom RelativeLayout with height relevant to width 【发布时间】:2021-12-15 14:40:55 【问题描述】:嗨,我将创建自定义相对布局,它在 xml 属性中获得一个比率,它取决于它的高度与宽度......但它不起作用:
它的比率总是为 1 或为零。感谢您的关注和帮助
这是我的 CustomRelativeLayour.java:
public class CustomRelativeLayout extends RelativeLayout
float ratio =1;
public CustomRelativeLayout(Context context)
super(context);
public CustomRelativeLayout(Context context, AttributeSet attrs)
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomRelativeLayout);
try
this.ratio = a.getFloat(R.styleable.CustomRelativeLayout_ratio_pro,1);
invalidate();
requestLayout();
a.recycle();
catch (Exception e)
Log.i("Log1","getLayout: " + e.toString());
public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr)
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomRelativeLayout);
try
this.ratio = a.getFloat(R.styleable.CustomRelativeLayout_ratio_pro,1);
invalidate();
requestLayout();
a.recycle();
catch (Exception e)
Log.i("Log1","getLayout: " + e.toString());
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
super(context, attrs, defStyleAttr, defStyleRes);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomRelativeLayout);
try
this.ratio = a.getFloat(R.styleable.CustomRelativeLayout_ratio_pro,1);
invalidate();
requestLayout();
a.recycle();
catch (Exception e)
Log.i("Log1","getLayout: " + e.toString());
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
// Set a square layout.
int height = (int) ratio * widthMeasureSpec;
super.onMeasure(widthMeasureSpec, height);
她是我的 attrs.xml :
<resources>
<declare-styleable name="CustomRelativeLayout">
<attr name="ratio_pro" format="float"/>
</declare-styleable>
【问题讨论】:
FWIW,ConstraintLayout
允许您在考虑纵横比的情况下约束儿童。也许你可以改用它。
我知道....但是我想学这个来练习...
【参考方案1】:
问题似乎在于不正确的高度计算。 widthMeasureSpec- 不是以 px 为单位的原始宽度,它被加密以包含一些其他值,所以你不能只是将它乘以另一个值。
final int layoutWidth = MeasureSpec.getSize(widthMeasureSpec);
faint int desiredHeightSpec = MeasureSpec.makeMeasureSpec(ratio * layoutWidth, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, desiredHeight);
阅读更多关于 measureSpec here
【讨论】:
还要确保在获取 ratio 参数后确实需要调用 invalidate() 和 requestLayout() 好的,谢谢我试试以上是关于创建具有与宽度相关的高度的自定义RelativeLayout的主要内容,如果未能解决你的问题,请参考以下文章
iOS >> UITableView 与 2 个不同的自定义 UITableViewCells 具有不同的高度