简单的自定义ViewGroup
自定义ViewGroup需要重写onMeasure, onLayout等方法。下面是一个实例,4个View分别显示在四个角。
public class MyGroup extends ViewGroup{
private View viewA, viewB, viewC, viewD;
public MyGroup(Context context) {
this(context, null);
}
public MyGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
// 计算出所有的childView的宽和高
measureChildren(widthMeasureSpec, heightMeasureSpec);
int totalW1 = 0, totalH1 = 0;
int totalW2 = 0, totalH2 = 0;
for(int i=0; i<getChildCount(); ++i){
View child = getChildAt(i);
MarginLayoutParams params = (MarginLayoutParams)child.getLayoutParams();
int cw = child.getMeasuredWidth(), ch = child.getMeasuredHeight();
int lm = params.leftMargin, rm = params.rightMargin;
int tm = params.topMargin, bm = params.bottomMargin;
if(i == 0){
totalW1 += lm + cw + rm;
totalH1 += tm + ch + bm;
}
else if(i == 1){
totalW1 += lm + cw + rm;
totalH2 += tm + ch + bm;
}
else if(i == 2){
totalW2 += lm + cw + rm;
totalH1 += tm + ch + bm;
}
else if(i == 3){
totalW2 += lm + cw + rm;
totalH2 += tm + ch + bm;
}
}
int width = Math.max(totalW1, totalW2);
int height = Math.max(totalH1, totalH2);
int targetWidth = sizeWidth;
int targetHeight = sizeHeight;
if(widthMode == MeasureSpec.AT_MOST){
targetWidth = width;
}
if(heightMode == MeasureSpec.AT_MOST){
targetHeight = height;
}
setMeasuredDimension(targetWidth, targetHeight);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
for(int i=0; i<getChildCount(); ++i){
View child = getChildAt(i);
MarginLayoutParams params = (MarginLayoutParams)child.getLayoutParams();
int cw = child.getMeasuredWidth();
int ch = child.getMeasuredHeight();
int lm = params.leftMargin;
int tm = params.topMargin;
int rm = params.rightMargin;
int bm = params.bottomMargin;
if(i == 0){
child.layout(lm, tm, lm+cw, tm+ch);
}
else if(i == 1){
child.layout(getWidth()-rm-cw, tm, getWidth()-rm, tm+ch);
}
else if(i == 2){
child.layout(lm, getHeight()-bm-ch, lm+cw, getHeight()-bm);
}
else if(i == 3){
child.layout(getWidth()-rm-cw, getHeight()-bm-ch, getWidth()-rm, getHeight()-bm);
}
}
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
// return super.generateLayoutParams(attrs);
return new MarginLayoutParams(getContext(), attrs);
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
}
}
简单的自定义ViewGroup的更多相关文章
- 简单的例子了解自定义ViewGroup(一)
在Android中,控件可以分为ViewGroup控件与View控件.自定义View控件,我之前的文章已经说过.这次我们主要说一下自定义ViewGroup控件.ViewGroup是作为父控件可以包含多 ...
- Android ViewDragHelper完全解析 自定义ViewGroup神器
Android ViewDragHelper完全解析 自定义ViewGroup神器 转载请标明出处: http://blog.csdn.net/lmj623565791/article/detai ...
- Android动画效果之自定义ViewGroup添加布局动画
前言: 前面几篇文章介绍了补间动画.逐帧动画.属性动画,大部分都是针对View来实现的动画,那么该如何为了一个ViewGroup添加动画呢?今天结合自定义ViewGroup来学习一下布局动画.本文将通 ...
- Android自定义控件之自定义ViewGroup实现标签云
前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...
- Android自定义ViewGroup
视图分类就两类,View和ViewGroup.ViewGroup是View的子类,ViewGroup可以包含所有的View(包括ViewGroup),View只能自我描绘,不能包含其他View. 然而 ...
- [Android Pro] Android开发实践:自定义ViewGroup的onLayout()分析
reference to : http://www.linuxidc.com/Linux/2014-12/110165.htm 前一篇文章主要讲了自定义View为什么要重载onMeasure()方法( ...
- android 手把手教您自定义ViewGroup(一)
1.概述 在写代码之前,我必须得问几个问题: 1.ViewGroup的职责是啥? ViewGroup相当于一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属 ...
- Android 自定义ViewGroup
前面几节,我们重点讨论了自定义View的三板斧,这节我们来讨论自定义ViewGroup,为什么要自定义ViewGroup,其实就是为了更好的管理View. 自定义ViewGroup无非那么几步: Ⅰ. ...
- android自定义viewgroup实现等分格子布局
先上效果图: 实现这样的效果: 一般的思路就是,直接写布局文件,用LinearLayout 嵌套多层子LinearLayout,然后根据权重layout_weight可以达到上面的效果 还有就是利用g ...
随机推荐
- Spotlight on Mysql详细介绍
Spotlight on Mysql详细介绍 by:授客 QQ:1033553122 1. 版本 2. 使用介绍 1) 主页 会话面板 MySQL面板 INNODB面板 存储面板 主机面板 ...
- Android为TV端助力 遥控器的映射
第一编写kl文件时先在盒子上输入getevent -v查看设备信息,设备信息里有vendor.product.version, 假如分别是xxxx,yyyy,zzzz,那么你的文件名就要命名为Vend ...
- leetcode-14最长公共前缀
leetcode-14最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower& ...
- ubuntu 安装PG10 更新packet 创建超级账号
ubuntu 安装PG10 更新packet 创建超级账号 安装pg10 我的环境是16.04 server版本 MAC和windows 建议使用安装包 直接官网下载 echo 'deb http:/ ...
- .NET Core 2.0
下载 Visual Studio 2017 version 15.3 下载 .NET Core 2.0 下载 Visual Studio for Mac 微软今天发布了.NET Core 2.0 版本 ...
- Android Room框架学习笔记
一.使用 1.build.gradle引入 compile "android.arch.persistence.room:runtime:1.0.0" annotationProc ...
- NumPy 中的集合运算
怎样快速找出两个数组中相同的元素? numpy.isin(element,test_elements,assume_unique = False,invert = False ) 计算test_ele ...
- AI学习---TensorFlow框架介绍[图+会话+张量+变量OP+API]
TensorFlow的数据流图 TensorFlow的结构分析: 图 + 会话 TensorFlow = 构图阶段(数据与操作的执行步骤被描绘出一个图) + 执行图阶段(使用回话执行构建好的图中操作) ...
- 实现Github和Coding仓库等Git服务托管更新
如何使Github.Coding.Gitee 码云 同时发布更新,多个不同Git服务器之间同时管理部署发布提交 缘由 因为在Github上托管的静态页面访问加载速度较为缓慢,故想在Coding上再建一 ...
- 聚类——KFCM
聚类——认识KFCM算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.KFCM概述 KFCM:基于核的改进的模糊c均值聚类算法.它是通过核函数将 ...