全网整合营销服务商

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

免费咨询热线: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 


相关文章: 小建面朝正北,A点实际方位是否存在偏差?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何选择可靠的免备案建站服务器?  如何在宝塔面板创建新站点?  如何在Windows 2008云服务器安全搭建网站?  如何在阿里云部署织梦网站?  北京网站制作的公司有哪些,北京白云观官方网站?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何用已有域名快速搭建网站?  教学网站制作软件,学习*后期制作的网站有哪些?  网页设计与网站制作内容,怎样注册网站?  如何在橙子建站中快速调整背景颜色?  ,购物网站怎么盈利呢?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  制作网站怎么制作,*游戏网站怎么搭建?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  ,网页ppt怎么弄成自己的ppt?  建站之星2.7模板快速切换与批量管理功能操作指南  模具网站制作流程,如何找模具客户?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何快速生成凡客建站的专业级图册?  如何快速搭建高效WAP手机网站吸引移动用户?  如何在Golang中使用replace替换模块_指定本地或远程路径  网站制作新手教程,新手建设一个网站需要注意些什么?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  高防服务器租用首荐平台,企业级优惠套餐快速部署  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何彻底卸载建站之星软件?  如何选择高性价比服务器搭建个人网站?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何快速查询网址的建站时间与历史轨迹?  高防服务器租用如何选择配置与防御等级?  如何用西部建站助手快速创建专业网站?  魔方云NAT建站如何实现端口转发?  如何通过商城免费建站系统源码自定义网站主题?  建站之星如何实现五合一智能建站与营销推广?  网站制作话术技巧,网站推广做的好怎么话术?  C++如何编写函数模板?(泛型编程入门)  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何在万网ECS上快速搭建专属网站?  实例解析Array和String方法  如何选择PHP开源工具快速搭建网站?  安徽网站建设与外贸建站服务专业定制方案  TestNG的testng.xml配置文件怎么写  建站之星CMS五站合一模板配置与SEO优化指南  装修招标网站设计制作流程,装修招标流程?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何快速生成可下载的建站源码工具?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面? 

您的项目需求

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