全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android自定义ViewGroup横向布局(1)

最近学习自定义viewgroup,我的目标是做一个可以很想滚动的listview,使用adapter填充数据,并且使用adapter.notifyDataSetChanged()更新数据。

不过一口吃不成一个胖子(我吃成这样可是好几年的积累下来的~~~~),我们一步一步来,这篇笔记首先写一个横向的布局。

代码:

package com.example.libingyuan.horizontallistview.ScrollViewGroup;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * 自定义ViewGroup
 * 很简单的横向布局,把所有的子View都横着排列起来,不可滚动
 */
public class ScrollViewGroup extends ViewGroup{
  public ScrollViewGroup(Context context) {
    this(context,null);
  }

  public ScrollViewGroup(Context context, AttributeSet attrs) {
    this(context, attrs,0);
  }

  public ScrollViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //重新设置宽高
    this.setMeasuredDimension(measureWidth(widthMeasureSpec,heightMeasureSpec),measureHeight(widthMeasureSpec,heightMeasureSpec));
  }
   /**
   * 测量宽度
   */
  private int measureWidth(int widthMeasureSpec, int heightMeasureSpec) {
    // 宽度
    int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
    //宽度的类型
    int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
    //父控件的宽(wrap_content)
    int width = 0;
    //子View的个数
    int childCount = getChildCount();

    //重新测量子view的宽度,以及最大高度
    for (int i = 0; i < childCount; i++) {
      //获取子View
      View child = getChildAt(i);
      //测量子View,无论什么模式,这句必须有否则界面不显示子View(一片空白)
      measureChild(child, widthMeasureSpec, heightMeasureSpec);
      //得到子View的边距
      MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
      //得到宽度
      int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
      //宽度累加
      width += childWidth;
    }
    //返回宽度
    return modeWidth == MeasureSpec.EXACTLY ? sizeWidth : width;
  }

  /**
   * 测量高度
   */
  private int measureHeight(int widthMeasureSpec, int heightMeasureSpec) {
    //高度
    int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
    //高度的模式
    int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
    //父控件的高(wrap_content)
    int height = 0;
    //子View的个数
    int childCount = getChildCount();

    //重新测量子view的宽度,以及最大高度
    for (int i = 0; i < childCount; i++) {
      //得到子View
      View child = getChildAt(i);
      //测量
      measureChild(child, widthMeasureSpec, heightMeasureSpec);
      //得到边距
      MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
      //得到高度
      int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
      //累加高度
      height += childHeight;
    }
    //求平均高度
    height = height / childCount;
    //返回高度
    return modeHeight == MeasureSpec.EXACTLY ? sizeHeight : height;
  }

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    int childLeft=0;//子View左边的距离
    int childWidth;//子View的宽度
    int height=getHeight();
    int childCount=getChildCount();
    for (int i = 0; i < childCount; i++) {
      View child=getChildAt(i);
      MarginLayoutParams lp= (MarginLayoutParams) child.getLayoutParams();
      childWidth=child.getMeasuredWidth()+lp.leftMargin+lp.rightMargin;
      //最主要的一句话
      child.layout(childLeft,0,childLeft+childWidth,height);
      childLeft+=childWidth;
    }
  }

  @Override
  public LayoutParams generateLayoutParams(AttributeSet attrs) {
    return new MarginLayoutParams(getContext(),attrs);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # ViewGroup  # 横向布局  # Android动画效果之自定义ViewGroup添加布局动画(五)  # Android自定义ViewGroup之实现FlowLayout流式布局  # Android编程重写ViewGroup实现卡片布局的方法  # Android App开发中自定义View和ViewGroup的实例教程  # Android自定义ViewGroup的实现方法  # Android自定义ViewGroup打造各种风格的SlidingMenu  # 从源码解析Android中View的容器ViewGroup  # Android自定义ViewGroup实现标签浮动效果  # Android应用开发中自定义ViewGroup的究极攻略  # Android自定义ViewGroup实现带箭头的圆角矩形菜单  # 自定义  # 几年  # 很简单  # 做一个  # 很想  # 最主要  # 这篇  # 句话  # 这句  # 大家多多  # 横着  # extends  # null  # context  # View  # public  # attrs  # onMeasure  # void 


相关文章: 表情包在线制作网站免费,表情包怎么弄?  创业网站制作流程,创业网站可靠吗?  如何快速登录WAP自助建站平台?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何通过VPS搭建网站快速盈利?  如何生成腾讯云建站专用兑换码?  移民网站制作流程,怎么看加拿大移民官网?  官网网站制作腾讯审核要多久,联想路由器newifi官网  建站之星如何实现网站加密操作?  焦点电影公司作品,电影焦点结局是什么?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  网站制作公司,橙子建站是合法的吗?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  如何基于PHP生成高效IDC网络公司建站源码?  建站之星展会模版如何一键下载生成?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  黑客如何通过漏洞一步步攻陷网站服务器?  如何在IIS中配置站点IP、端口及主机头?  兔展官网 在线制作,怎样制作微信请帖?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  如何在阿里云购买域名并搭建网站?  香港服务器租用费用高吗?如何避免常见误区?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  济南企业网站制作公司,济南社保单位网上缴费步骤?  手机网站制作与建设方案,手机网站如何建设?  电商网站制作公司有哪些,1688网是什么意思?  黑客如何利用漏洞与弱口令入侵网站服务器?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  Python lxml的etree和ElementTree有什么区别  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  专业公司网站制作公司,用什么语言做企业网站比较好?  C#如何使用XPathNavigator高效查询XML  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  宝塔新建站点报错如何解决?  完全自定义免费建站平台:主题模板在线生成一站式服务  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  网站制作报价单模板图片,小松挖机官方网站报价?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何设置并定期更换建站之星安全管理员密码?  网页设计与网站制作内容,怎样注册网站?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  图册素材网站设计制作软件,图册的导出方式有几种?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何在云主机上快速搭建多站点网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  建站之星安装后如何自定义网站颜色与字体? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。