`
yangzc106
  • 浏览: 156696 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义绝对布局的实现

 
阅读更多

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);
		}

	}
}

 

分享到:
评论

相关推荐

    Android 绝对布局实例

    - 自定义布局(Custom Layout):当标准布局无法满足需求时,可以创建自定义布局类,实现特定的布局逻辑。 4. **示例代码**: ```xml xmlns:android="http://schemas.android.com/apk/res/android" android:...

    VGScene(firemonkey前身)自定义布局帮助说明

    VGScene提供了几种不同的布局选项,如网格布局、绝对布局、相对布局和堆叠布局,每种都有其特定的用途和优势。 1. **网格布局**(Grid Layout):这种布局将组件放置在一个可调整大小的网格中,每个组件占据一个或...

    简单的自定义瀑布流布局

    3. **绝对定位**:一种常见的实现方法是使用绝对定位,通过JavaScript或CSS Flexbox、Grid来计算每个元素的位置。在JavaScript实现中,通常需要监听窗口的滚动事件,以便在用户滚动时更新元素的位置。 4. **...

    微信小程序自定义下拉框实现根据输入过滤下拉项.zip

    在微信小程序中,自定义下拉框并实现根据输入实时过滤下拉选项是一项常见的功能,尤其在用户需要从大量数据中快速选择时。这个功能提高了用户体验,使得交互更加直观和高效。下面我们将深入探讨如何在微信小程序中...

    Android学习笔记15:绝对布局管理器AbsoluteLayout

    在本篇“Android学习笔记15:绝对布局管理器AbsoluteLayout”中,我们将深入探讨一种允许开发者精确控制视图位置的布局方式——AbsoluteLayout。尽管在现代Android开发中已经不推荐使用,但在某些特定场景下,它仍然...

    android 自动换行的自定义viewgroup

    在Android开发中,自定义ViewGroup是实现复杂布局和交互的关键技术之一。标题"android 自动换行的自定义viewgroup"所指的,就是创建一个能够根据子视图的数量和大小自动调整布局,实现自动换行效果的自定义 ...

    40种网页布局源代码

    8. Grid布局属性:`display: grid`创建Grid容器,`grid-template-columns/rows`定义列/行的数量,`grid-gap`设置网格间距,`grid-template-areas`用于创建自定义的网格模板,`grid-auto-flow`控制自动放置的模式。...

    WPF中的可以实现缩放拖拽功能的布局控件

    在标题提到的“WPF中的可以实现缩放拖拽功能的布局控件”中,我们聚焦于一种特殊的自定义控件,它允许用户通过滚轮缩放和左键拖动来操作界面元素,提供了类似画布(Canvas)的自由度。描述中提到,这个控件是基于...

    自定义表单设计器演示版源码(C#).rar.rar

    5. 表单布局:自定义表单设计器可能包含复杂的布局算法,如网格布局、流式布局或绝对布局,以满足用户对不同形式的表单布局需求。 6. 代码生成:在用户完成表单设计后,自定义表单设计器应能够生成对应的C#代码,...

    WPF自定义图片裁剪

    在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)中实现自定义图片裁剪功能,这在用户注册过程中,尤其是需要用户上传指定大小比例的头像时非常有用。我们将从基本概念出发,逐步讲解如何创建...

    Android 开源代码 自定义UI 不看后悔

    自定义UI往往需要灵活组合这些布局,实现复杂的界面结构。开发者可以通过研究此项目中的布局文件,学习如何巧妙地布局元素。 4. **自定义View**:在Android中,自定义View是实现独特UI效果的重要手段。项目可能包含...

    WinForm页面布局 控件

    在这个主题中,我们将深入探讨WinForm中的布局控制和自定义控件的相关知识点。 1. **表格布局(TableLayoutPanel)** 表格布局允许开发者以网格形式排列控件。每个控件可以放在特定的行和列中,支持动态调整大小,...

    自定义popupWindow

    综上所述,自定义PopupWindow涉及到布局设计、事件处理、动画效果、尺寸调整等多个方面。熟练掌握这些知识点,能够帮助开发者构建出丰富多样的弹出窗口,提升应用的用户体验。在实际项目中,根据需求灵活运用,就能...

    天猫自定义区全屏代码

    通过上述分析可知,“天猫自定义区全屏代码”的实现不仅涉及到基本的CSS布局知识,还需要结合具体业务需求灵活调整。希望本文能帮助大家更好地理解和运用这一技术点,在电商领域创造出更多优质的作品!

    WPF布局综合运用实例

    通过这些实例,学习者不仅能理解每种布局的特性,还能掌握如何根据应用需求选择合适的布局,以及如何组合使用多种布局以实现更复杂的设计。此外,实例通常会包含XAML代码和对应的运行结果截图,有助于直观地理解布局...

    三种方式自定义SeekBar样式

    为了实现这些自定义,你可能需要创建多个资源文件,如`seekbar_progress.xml`、`seekbar_thumb.xml`等,分别定义不同部分的样式。这些文件通常放在`res/drawable`目录下,然后在布局文件或代码中引用它们。 在...

    WPF布局全接触,多种布局分析

    Canvas是最基础的布局控件,它允许直接指定子元素的绝对位置,不自动调整元素的大小或位置。Canvas默认不裁剪超出其边界的内容,但可以通过设置`ClipToBounds`属性来改变这一行为。 3. **StackPanel** StackPanel...

    android的布局文件介绍

    本篇文章将详细讲解Android的几种布局方式,包括线性布局、相对布局、表格布局、网格视图、标签布局、列表视图以及已废弃的绝对布局。 1. **线性布局(Linear Layout)** 线性布局是最基础的布局方式,它可以按照...

    js自定义弹出框

    自定义弹出框的实现方式多种多样,以下是一些关键知识点: 1. **HTML结构**:首先,你需要在HTML中创建一个隐藏的弹出框元素,包括弹出框的容器、标题、内容区域、按钮等元素。这些元素默认是display:none,当需要...

    实现对话框窗体内控件的缩放和位置的布局(比较实用)

    5. **布局算法**:对于更复杂的布局,可以自定义布局算法,例如网格布局、流式布局或对齐布局。这些算法可以在`OnSize`中实现,根据对话框的宽度和高度动态调整控件的位置和大小。 6. **使用MFC库**:如果使用...

Global site tag (gtag.js) - Google Analytics