- 支持定制化阴影,支持调戏UI小姐姐!!
- 支持随意更改阴影颜色值
- 支持x,y轴阴影偏移
- 可随意更改阴影扩散区域
- 支持阴影圆角属性
- 支持单边或多边不显示阴影
2.0更新功能(最近发现有人直接拿去当自己项目,发布博客和github。我想说尊重下辛苦蜜蜂的劳动成果。转载请说明出处)
- 支持ShadowLayout背景填充颜色,圆角属性随阴影圆角改变
- 支持动态修改ShadowLayout各种属性,及内部代码优化
效果展示(截图分辨率模糊,真机运行效果赶超CardView)
基础功能展示 | 各属性展示 | 随意更改颜色 |
---|---|---|
添加依赖
- 项目build.gradle添加如下
allprojects { repositories { maven { url 'https://jitpack.io' } } }
- app build.gradle添加如下
dependencies { implementation 'com.github.lihangleo2:ShadowLayout:2.0.1' }
使用
<com.lihang.ShadowLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:hl_cornerRadius="18dp"
app:hl_dx="0dp"
app:hl_dy="0dp"
app:hl_leftShow="false"
app:hl_shadowColor="#2a000000"
app:hl_shadowBackColor="#fff"
app:hl_shadowLimit="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="36dp"
android:gravity="center"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="完全圆形圆角"
android:textColor="#000" />
</com.lihang.ShadowLayout>
自定义属性
圆角属性
- app:hl_cornerRadius="18dp" 阴影圆角属性(同时如果设置了背景填充色也是背景圆角)
阴影扩散程度
- app:hl_shadowLimit="5dp" 阴影的扩散区域
阴影布局背景颜色值
- app:hl_shadowBackColor="#fff" 阴影布局背景填充色,圆角属性即是阴影圆角
阴影的颜色
- app:hl_shadowColor="#2a000000" 阴影的颜色可以随便改变,透明度的改变可以改变阴影的清晰程度
x轴的偏移量
- app:hl_dx="0dp" 也可以理解为左右偏移量
y轴的偏移量
- app:hl_dy="0dp" 也可以理解为上下的偏移量
阴影的4边可见不可见(与偏移量无关)
- app:hl_leftShow="false" 左边的阴影不可见,其他3边保持不变
最近有反应说在recyclerView里用会造成内存溢出,亲测如下
这是运行在recyclerView里的。我用100条,随意上下滑动。咱们看看内存
可以看到在刚创建条目的时候增加了内存,之后内存几乎无抖动。
原因是:
- 阴影创建的bitmap不是网络图片不是大图。楼主测过最大的大小仅仅在550KB左右
- bitmap无引用,会被垃圾回收机制回收,虽然不及时,这本身是垃圾回收机制的问题
- recyclerView本身有item复用机制,当然如果重写成固定高度的listView,当然会增加内存的,因为每一条item都是新建的
内存最具说服力例子
在2.0里大家可以看到我增加了动态设置阴影,其实只要滑动一个按钮,都是重新创建bitmap阴影,可想而知,一滑下去,肯定创建的的成千张bitmap。那么结果如何呢?监听内存情况如下:
当然这里我是不断滑动,第一为了演示需要。创建了成千张图片,确实造成了内存抖动,但是可以看到由于无引用,和垃圾回收机制,其内存也得到了回收。
- 个人建议可以不需要处理这块。没有隐患。这里会造成内存抖动,完全是展示需要。当然需要重写listView或recyclerView的高度时,也只使用于item数不多的页面。如果是n多item,即使不使用shadowLayout,我相信也会有oom问题
如果真的还有觉得bitmap不靠谱的话,你试试创建一个bitmap什么都不带的。去打印下他的大小..如果一定要处理的话如下:
- 方法1:在ShadowLayout里加上系统方法
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
//主动回收bitmap且置空。当然由于垃圾回收机制,也不是立即回收
}
- 方法2:在创建阴影bitmap的时候自定义LurCache,在创建的时候把阴影高宽作为条件去取,如果缓存有就拿来复用,如果没有就重新创建放进缓存