布局添加阴影:
1、通过layer-list来实现,但是边界不羽化,可以指定某边有阴影
2、android:elevation=”2dp” 不能更改阴影颜色,且控件背景必须为白色,四边都有阴影
3、view.setOutlineProvider() 不能更改阴影颜色,且控件背景必须为白色,四边都有阴影
4、第三方CrazyShadow 可以指定阴影颜色和某边显示阴影,但是不羽化,效果不怎么好
5、自定义view,对改view进行绘制羽化,效果最好,随心所欲(推荐)
每一种的实现方式:
1、通过layer-list来实现,但是边界不羽化,可以指定某边有阴影
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
>
<!-- 阴影部分 -->
<!-- 个人觉得更形象的表达:top代表下边的阴影高度,left代表右边的阴影宽度。其实也就是相对应的offset,solid中的颜色是阴影的颜色,也可以设置角度等等 -->
<item
android:bottom="10dp"
>
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#aaddaa"
android:startColor="#aaddaa" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
<!-- 背景部分 -->
<!-- 形象的表达:bottom代表背景部分在上边缘超出阴影的高度,right代表背景部分在左边超出阴影的宽度(相对应的offset) -->
<item
android:top="10dp"
>
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#FFFFFF"
android:startColor="#FFFFFF" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
</layer-list>
2、android:elevation=”2dp” 不能更改阴影颜色,且控件背景必须为白色,四边都有阴影
<TextView
android:id="@+id/myview"
android:text="测试效果"
android:layout_width="100dp"
android:layout_height="100dp"
android:elevation="2dp"
android:background="#FFFFFF"
/>
3、view.setOutlineProvider() 不能更改阴影颜色,且控件背景必须为白色,四边都有阴影
// 获取outLine,我们需要使用ViewoutLineProvider
// ViewOutlineProvider viewOutlineProvider=new ViewOutlineProvider() {//背景为白色才能看出效果
// @Override
// public void getOutline(View view, Outline outline) {
// //修改outLine的形状,这里是设置分别设置左上右下,以及Radius
// outline.setRoundRect(0,0,view.getWidth(),view.getHeight(),30);
// }
// };
// //将需要控件重写设置形状
// tv.setOutlineProvider(viewOutlineProvider);
4、第三方CrazyShadow 可以指定阴影颜色和某边显示阴影,但是不羽化,效果不怎么好
// new CrazyShadow.Builder()
// .setContext(this)
// .setDirection(CrazyShadowDirection.TOP)//设定显示的边
// .setShadowRadius(5)
// .setBackground(Color.parseColor("#96a993"))
// .setImpl(CrazyShadow.IMPL_FLOAT)//IMPL_DRAW(向内,)IMPL_WRAP(向外)IMPL_FLOAT(与IMPL_WRAP同)
// .setBaseShadowColor(Color.parseColor("#00000000"))
// .action(tv);
5、自定义view,对改view进行绘制羽化,效果最好,随心所欲(推荐)
“`
view的羽化:
setLayerType(View.LAYER_TYPE_SOFTWARE,null);
Log.e(“tag”,”zhxing”);
Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
canvas.drawColor(Color.WHITE);
BlurMaskFilter blur=new BlurMaskFilter(100,BlurMaskFilter.Blur.NORMAL );
paint.setMaskFilter(blur);
//设置画笔线宽
paint.setStrokeWidth(2);
// canvas.drawLine(0, 0, 200, 0, paint);
canvas.drawCircle(300, 300, 150, paint);
注意坑:
必须要加上setLayerType(View.LAYER_TYPE_SOFTWARE,null);否者不会有模糊效果
或者在androidManifest.xml中添加android:hardwareAccelerated=”false” 不启用硬加速“`