android 卡片堆叠布局,Android堆叠式布局实现(二)稍复杂点的堆叠式布局

本文深入探讨了Android堆叠式布局的实现,通过修改`onMeasure`和`onLayout`方法,调整子View的宽高和位置,实现动态效果。文章详细展示了如何计算父控件高度、调整子View宽度、定位子View位置,并提供了动效优化的思路,以实现更酷炫的堆叠式布局效果。
摘要由CSDN通过智能技术生成

写在前面的几句话

上面一篇介绍了下简单的堆叠式布局,但是实现上相对来说还是比较简单,而且效果也并没有特别好,那么这一篇呢,就对堆叠式布局进行更加深入的讲解,主要是通过对子控件的测量和布局,通过这篇的讲解,大家应该可以实现出各种不同风格的堆叠式的布局

首先看一下最终实现的效果

96295cf662de

图1 稍复杂的堆叠式布局

是不是看起来酷炫了很多,没错,揍是这么炫酷,

那其实简单分析一下是怎么实现的,

从静态到动态,首先将第一个初始的界面实现出来

96295cf662de

Snip20160412_2.png

通过这张图,我们可以看出来其实是5个item堆叠起来的,随着item的position越往后,那么他的宽和高会有一定的变化,最后一个item的透明度和其他4个的透明度不相同。

第一步呢就是修改之前的attachChildViews方法里面的添加子View个数的限制,修改为<5

由于在子View绘制之前需要将子View的相关宽高和位置进行修改,所以在重写onMeasure与onLayout的方法以满足我们的需要

Step1.重写onMeasure方法

首先通过onMeasure方法来看看,对宽高的修改

通过截图我们可以分析一下在onMeasure中究竟需要做一些什么?

父布局的高度需要调整

子View的宽度需要调整

父布局的高度的调整

上代码通过代码分析

private int itemsMarginTop = dp2px(8);

//获取父控件的高度

private int calculateWrapContentHeight(){

int maxChildHeight = 0;

for (int index = 0; index < getChildCount(); index++){

final View childView = getChildAt(index);

measureChildView(childView);

if (childView.getVisibility() != View.GONE){

maxChildHeight = Math.max(childView.getMeasuredHeight(),maxChildHeight);

}

}

int itemsElevationPadding = itemsMarginTop * getViewsCount();

int measuredHeight = maxChildHeight + getPaddingTop() + getPaddingBottom() + itemsElevationPadding;

return measuredHeight;

}

//

private int getViewsCount() {

return (getChildCount() - 1);

}

通过代码来看呢,主要是先遍历子View寻找出item高度最大的一个,虽然我使用的item高度都是一致的,但是也不排除会有高度不一致的需求,然后把这个子View最大的高度加上getPaddingTop()与getPaddingBottom(),最后加上每个item之间间隔的高度就好了,这样父控件的高度就计算出来了。

子View的宽度的调整

上代码通过代码分析

//测量子View的宽高

private void configureChildViewsMeasureSpecs(int widthMeasureSpec){

int childWidthMeasureSpec;

int childHeightMeasureSpec;

final int parentWidth = MeasureSpec.getSize(widthMeasureSpec)

- getPaddingLeft()

- getPaddingRight();

int viewWidth;

int viewHeight;

for (int index = getViewsCount(); index >= 0; index--){

final View childView = getChildAt(index);

measureChildView(childView);

viewWidth = caculateViewWidth(parentWidth, index);

viewHeight = childView.getMeasuredHeight();

childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(viewWidth, MeasureSpec.EXACTLY);

childHeightM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值