android 绝对布局已经过期了为了保证稳定性自定义了一个绝对布局
package cn.kuwo.base.skin.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
public class MyAbsoluteLayout extends ViewGroup {
private int mPaddingLeft;
private int mPaddingRight;
private int mPaddingTop;
private int mPaddingBottom;
public MyAbsoluteLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyAbsoluteLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mPaddingLeft = attrs
.getAttributeIntValue(android.R.attr.paddingLeft, 0);
mPaddingRight = attrs.getAttributeIntValue(android.R.attr.paddingRight,
0);
mPaddingTop = attrs.getAttributeIntValue(android.R.attr.paddingTop, 0);
mPaddingBottom = attrs.getAttributeIntValue(
android.R.attr.paddingBottom, 0);
}
public MyAbsoluteLayout(Context context) {
super(context);
}
@Override
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
return new MyAbsoluteLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT, 0, 0);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int count = getChildCount();
int maxHeight = 0;
int maxWidth = 0;
measureChildren(widthMeasureSpec, heightMeasureSpec);
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
if (child.getVisibility() != GONE) {
int childRight;
int childBottom;
MyAbsoluteLayout.LayoutParams lp = (MyAbsoluteLayout.LayoutParams) child
.getLayoutParams();
childRight = lp.x + child.getMeasuredWidth();
childBottom = lp.y + child.getMeasuredHeight();
maxWidth = Math.max(maxWidth, childRight);
maxHeight = Math.max(maxHeight, childBottom);
}
}
maxWidth += mPaddingLeft + mPaddingRight;
maxHeight += mPaddingTop + mPaddingBottom;
maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
resolveSize(maxHeight, heightMeasureSpec));
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
if (child.getVisibility() != GONE) {
MyAbsoluteLayout.LayoutParams lp = (MyAbsoluteLayout.LayoutParams) child
.getLayoutParams();
int childLeft = mPaddingLeft + lp.x;
int childTop = mPaddingTop + lp.y;
child.layout(childLeft, childTop, childLeft
+ child.getMeasuredWidth(), childTop
+ child.getMeasuredHeight());
}
}
}
@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p instanceof MyAbsoluteLayout.LayoutParams;
}
@Override
protected ViewGroup.LayoutParams generateLayoutParams(
ViewGroup.LayoutParams p) {
return new MyAbsoluteLayout.LayoutParams(p);
}
public static class LayoutParams extends ViewGroup.LayoutParams {
public int x;
public int y;
public int width;
public int height;
public LayoutParams(int x, int y, int width, int height) {
super(width, height);
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public LayoutParams(Context context, AttributeSet attrset) {
super(context, attrset);
}
public LayoutParams(int width, int height) {
super(width, height);
}
public LayoutParams(ViewGroup.LayoutParams params) {
super(params);
}
}
}
分享到:
相关推荐
- 自定义布局(Custom Layout):当标准布局无法满足需求时,可以创建自定义布局类,实现特定的布局逻辑。 4. **示例代码**: ```xml xmlns:android="http://schemas.android.com/apk/res/android" android:...
VGScene提供了几种不同的布局选项,如网格布局、绝对布局、相对布局和堆叠布局,每种都有其特定的用途和优势。 1. **网格布局**(Grid Layout):这种布局将组件放置在一个可调整大小的网格中,每个组件占据一个或...
3. **绝对定位**:一种常见的实现方法是使用绝对定位,通过JavaScript或CSS Flexbox、Grid来计算每个元素的位置。在JavaScript实现中,通常需要监听窗口的滚动事件,以便在用户滚动时更新元素的位置。 4. **...
在本篇“Android学习笔记15:绝对布局管理器AbsoluteLayout”中,我们将深入探讨一种允许开发者精确控制视图位置的布局方式——AbsoluteLayout。尽管在现代Android开发中已经不推荐使用,但在某些特定场景下,它仍然...
在微信小程序中,自定义下拉框并实现根据输入实时过滤下拉选项是一项常见的功能,尤其在用户需要从大量数据中快速选择时。这个功能提高了用户体验,使得交互更加直观和高效。下面我们将深入探讨如何在微信小程序中...
在Android开发中,自定义ViewGroup是实现复杂布局和交互的关键技术之一。标题"android 自动换行的自定义viewgroup"所指的,就是创建一个能够根据子视图的数量和大小自动调整布局,实现自动换行效果的自定义 ...
8. Grid布局属性:`display: grid`创建Grid容器,`grid-template-columns/rows`定义列/行的数量,`grid-gap`设置网格间距,`grid-template-areas`用于创建自定义的网格模板,`grid-auto-flow`控制自动放置的模式。...
在标题提到的“WPF中的可以实现缩放拖拽功能的布局控件”中,我们聚焦于一种特殊的自定义控件,它允许用户通过滚轮缩放和左键拖动来操作界面元素,提供了类似画布(Canvas)的自由度。描述中提到,这个控件是基于...
5. 表单布局:自定义表单设计器可能包含复杂的布局算法,如网格布局、流式布局或绝对布局,以满足用户对不同形式的表单布局需求。 6. 代码生成:在用户完成表单设计后,自定义表单设计器应能够生成对应的C#代码,...
在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)中实现自定义图片裁剪功能,这在用户注册过程中,尤其是需要用户上传指定大小比例的头像时非常有用。我们将从基本概念出发,逐步讲解如何创建...
自定义UI往往需要灵活组合这些布局,实现复杂的界面结构。开发者可以通过研究此项目中的布局文件,学习如何巧妙地布局元素。 4. **自定义View**:在Android中,自定义View是实现独特UI效果的重要手段。项目可能包含...
在这个主题中,我们将深入探讨WinForm中的布局控制和自定义控件的相关知识点。 1. **表格布局(TableLayoutPanel)** 表格布局允许开发者以网格形式排列控件。每个控件可以放在特定的行和列中,支持动态调整大小,...
综上所述,自定义PopupWindow涉及到布局设计、事件处理、动画效果、尺寸调整等多个方面。熟练掌握这些知识点,能够帮助开发者构建出丰富多样的弹出窗口,提升应用的用户体验。在实际项目中,根据需求灵活运用,就能...
通过这些实例,学习者不仅能理解每种布局的特性,还能掌握如何根据应用需求选择合适的布局,以及如何组合使用多种布局以实现更复杂的设计。此外,实例通常会包含XAML代码和对应的运行结果截图,有助于直观地理解布局...
为了实现这些自定义,你可能需要创建多个资源文件,如`seekbar_progress.xml`、`seekbar_thumb.xml`等,分别定义不同部分的样式。这些文件通常放在`res/drawable`目录下,然后在布局文件或代码中引用它们。 在...
Canvas是最基础的布局控件,它允许直接指定子元素的绝对位置,不自动调整元素的大小或位置。Canvas默认不裁剪超出其边界的内容,但可以通过设置`ClipToBounds`属性来改变这一行为。 3. **StackPanel** StackPanel...
本篇文章将详细讲解Android的几种布局方式,包括线性布局、相对布局、表格布局、网格视图、标签布局、列表视图以及已废弃的绝对布局。 1. **线性布局(Linear Layout)** 线性布局是最基础的布局方式,它可以按照...
自定义弹出框的实现方式多种多样,以下是一些关键知识点: 1. **HTML结构**:首先,你需要在HTML中创建一个隐藏的弹出框元素,包括弹出框的容器、标题、内容区域、按钮等元素。这些元素默认是display:none,当需要...
通过上述分析可知,“天猫自定义区全屏代码”的实现不仅涉及到基本的CSS布局知识,还需要结合具体业务需求灵活调整。希望本文能帮助大家更好地理解和运用这一技术点,在电商领域创造出更多优质的作品!
5. **布局算法**:对于更复杂的布局,可以自定义布局算法,例如网格布局、流式布局或对齐布局。这些算法可以在`OnSize`中实现,根据对话框的宽度和高度动态调整控件的位置和大小。 6. **使用MFC库**:如果使用...