创建具有与宽度相关的高度的自定义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 具有不同的高度

所有图像都具有相同大小的自定义 ListView

具有相等项目间距的自定义 UICollectionViewLayout

如何设置自定义相机的宽度和高度?

动态加载内容上的自定义 video-js 宽度和高度

具有多行 UILabel 的自定义 Tableview 单元格需要动态高度