android 自定义FrameLayout,提供设置最大宽度与最大高度的接口并且提供相关xml属性
时间: 2024-05-04 15:17:30 浏览: 195
android 各种Layout用到的一些重要的属性
可以自定义一个继承自FrameLayout的类,在类中添加设置最大宽度与最大高度的方法,同时在类中添加相关的XML属性。代码示例如下:
```java
public class CustomFrameLayout extends FrameLayout {
private int mMaxWidth;
private int mMaxHeight;
public CustomFrameLayout(Context context) {
super(context);
}
public CustomFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initAttrs(context, attrs);
}
public CustomFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttrs(context, attrs);
}
private void initAttrs(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomFrameLayout);
mMaxWidth = a.getDimensionPixelSize(R.styleable.CustomFrameLayout_maxWidth, 0);
mMaxHeight = a.getDimensionPixelSize(R.styleable.CustomFrameLayout_maxHeight, 0);
a.recycle();
}
/**
* 设置最大宽度
*
* @param maxWidth 最大宽度
*/
public void setMaxWidth(int maxWidth) {
mMaxWidth = maxWidth;
requestLayout();
}
/**
* 设置最大高度
*
* @param maxHeight 最大高度
*/
public void setMaxHeight(int maxHeight) {
mMaxHeight = maxHeight;
requestLayout();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
// 如果设置了最大宽度,则取最大宽度与父容器宽度的最小值
if (mMaxWidth > 0 && widthMode != MeasureSpec.UNSPECIFIED) {
widthSize = Math.min(widthSize, mMaxWidth);
}
// 如果设置了最大高度,则取最大高度与父容器高度的最小值
if (mMaxHeight > 0 && heightMode != MeasureSpec.UNSPECIFIED) {
heightSize = Math.min(heightSize, mMaxHeight);
}
setMeasuredDimension(widthSize, heightSize);
}
}
```
在res/values/attrs.xml文件中添加自定义属性:
```xml
<declare-styleable name="CustomFrameLayout">
<attr name="maxWidth" format="dimension" />
<attr name="maxHeight" format="dimension" />
</declare-styleable>
```
然后在布局文件中使用自定义FrameLayout并设置相关属性即可:
```xml
<com.example.CustomFrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:maxWidth="500dp"
app:maxHeight="500dp">
<!-- 添加子View -->
</com.example.CustomFrameLayout>
```
阅读全文