Android 手写百分比布局
来源:互联网 发布:全网vip视频电影源码 编辑:程序博客网 时间:2024/05/09 20:41
百分比布局:通过设定百分比参数,自动适应手机屏幕,有时候还是比较实用的!
思路:
1:Android 自定义xmlns,百分比布局有2个自定义参数 所有要自定义 ximls
2:自定义百分比布局 继承 相对布局,重写LayoutParams 内部类(这里增加 2个百分比参数)
3:重写 onMeasure( )方法,在onMeasure 里获取容器的宽高,然后获得所有子控件,判断子空间的 LayoutParams 是否为 百分比布局的 LayoutParams,相同则 读取子控件的 长宽百分比 参数,然后计算出实际的长宽参数!
实现:
1: 自定义xmlns,首先 在 res下创建 attr.xml文件 声明一个styleable
<resources> <declare-styleable name="percentLayout"> <attr name="layout_widthPercent" format = "float"> </attr> <attr name="layout_heightPercent" format = "float"> </attr> </declare-styleable></resources>
在 布局文件中添加自定义属性:
eclipse 这样写
http://schemas.android.com/apk/res/你的自定义View所在的包路径.
stuido 使用统一默认的
xmlns:app="http://schemas.android.com/apk/res-auto"
然后 在需要使用的子控件添加 百分比属性
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="nice" app:layout_widthPercent="0.6" app:layout_heightPercent="0.8" android:background="#00ff00" />
整个自定义 xmlns 就完成了,接下来实现自定义控件
public class PercentLayout extends RelativeLayout{ public PercentLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO Auto-generated constructor stub } public PercentLayout(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public PercentLayout(Context context) { super(context); // TODO Auto-generated constructor stub } /*** * 测量容器的宽高 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 获取容器的宽高 int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); //测量子控件的宽高,然后进行改变 int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); float widthPercent = 0; float heightPercent = 0; //获得子控件的布局参数 ViewGroup.LayoutParams params = child.getLayoutParams(); //判断是否为百分比布局 if(params instanceof LayoutParams){ widthPercent = ((LayoutParams) params).getWidthPercent(); heightPercent = ((LayoutParams) params).getHeightPerccent(); } if(widthPercent!=0){ params.width = (int) (width*widthPercent); params.height = (int) (height*heightPercent); } } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } /*** * 排列摆放子控件 */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); } @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } //布局参数内部类,xml解析会自动关联对应的布局参数 class LayoutParams extends RelativeLayout.LayoutParams{ private float widthPercent; private float heightPerccent; public float getWidthPercent() { return widthPercent; } public void setWidthPercent(float widthPercent) { this.widthPercent = widthPercent; } public float getHeightPerccent() { return heightPerccent; } public void setHeightPerccent(float heightPerccent) { this.heightPerccent = heightPerccent; } public LayoutParams(Context arg0, AttributeSet arg1) { super(arg0, arg1); TypedArray array = arg0.obtainStyledAttributes(arg1, R.styleable.percentLayout); widthPercent = array.getFloat(R.styleable.percentLayout_layout_widthPercent, widthPercent); heightPerccent = array.getFloat(R.styleable.percentLayout_layout_heightPercent, heightPerccent); array.recycle(); } public LayoutParams(int arg0, int arg1) { super(arg0, arg1); } public LayoutParams(ViewGroup.LayoutParams arg0) { super(arg0); } public LayoutParams(MarginLayoutParams arg0) { super(arg0); } }}
这个自定义控件代码,下面是 整个页面布局
<go.lqb.com.nettest.dn_sindy_layout.PercentLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="400dp" android:layout_height="600dp" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="nice" app:layout_widthPercent="0.6" app:layout_heightPercent="0.8" android:background="#00ff00" /></go.lqb.com.nettest.dn_sindy_layout.PercentLayout>
1 0
- Android 手写百分比布局
- 自己手写百分比控件布局
- Android 支持百分比布局
- Android支持百分比布局
- Android百分比布局初探
- Android百分比布局:PercentRelativeLayout
- Android百分比布局:PercentFrameLayout
- Android 百分比布局
- android 百分比layout布局
- Android百分比布局
- android 百分比布局
- Android 百分比布局库
- Android 百分比布局揭秘
- Android 自定义百分比布局
- Android百分比布局
- android中的百分比布局
- Android百分比布局:PercentFrameLayout
- Android百分比布局:PercentRelativeLayout
- js读取本地图片进行预览,上传服务器
- Android Fragment总结
- [南阳OJ-No.33]蛇形填数|在n*n方陈里填入1,2,...,n*n,要求填成蛇形。
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- Unity3D 原生WebCamera实现摄像头显示
- Android 手写百分比布局
- Android之MVP设计模式
- PHP自定义函数&数组
- 蓝桥杯 算法训练 字符串的展开
- 上海市学分银行理论研究
- PHP开发APP接口之封装通讯接口
- Unity Debug拓展
- cordova 常用命令、插件
- 元素类型为 "package" 的内容必须匹配 "(result-types?,interceptors?,default-interceptor-ref?