我已经做了一些广泛的代码示例搜索,但找不到任何东西.
特别是,我希望为我在ImageView中使用的png drawable添加阴影.这个png drawable是一个带有透明角的圆角矩形.
有人可以提供一个代码示例,说明如何在代码或XML中为视图添加一个不错的投影?
根据原始问题,最终结果是圆形矩形png,ImageView具有自然的下垂阴影.
我有阴影工作,但当它绘制时,它会使整个图像变黑.

添加阴影时,如何防止原始图像(绝对不是黑色)变黑?
BlurMaskFilter blurFilter = new BlurMaskFilter(2, BlurMaskFilter.Blur.OUTER);
Paint shadowPaint = new Paint();
shadowPaint.setMaskFilter(blurFilter);
int[] offsetXY = new int[2];
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pier_t);
Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY);
Canvas c = new Canvas(shadowImage);
c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null);
imageView.setImageBitmap(shadowImage);
Run Code Online (Sandbox Code Playgroud)
更新:
我实现了Josh关于复制到正确色彩空间的建议,现在它的效果非常好!对于未来的搜索者,此代码会在图像视图上生成阴影.您可以使用x和y,以及OUTER常量来获得所需的效果.
BlurMaskFilter blurFilter = new BlurMaskFilter(2, BlurMaskFilter.Blur.OUTER);
Paint shadowPaint = new Paint();
shadowPaint.setMaskFilter(blurFilter);
int[] offsetXY = new int[2];
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pier_t);
Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY);
Bitmap shadowImage32 = …Run Code Online (Sandbox Code Playgroud) 我从形状中制作了一个按钮背景,看起来非常适合我的目的.唯一需要的是为它投下一点阴影.这是代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<solid android:color="#343434" />
<stroke android:width="1dp" android:color="#171717" />
<corners android:radius="3dp" />
<padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
</shape>
</item>
<item>
<shape>
<gradient android:angle="270" android:endColor="#E2E2E2" android:startColor="#BABABA" />
<stroke android:width="1dp" android:color="#BABABA" />
<corners android:radius="4dp" />
<padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
</shape>
</item>
</selector>
Run Code Online (Sandbox Code Playgroud)
这就是我想要实现的目标

我该如何掉落阴影?我的猜测是我需要制作另一个形状但是带有黑色/灰色背景并设置某种形式的左边缘填充以使其看起来像阴影.但我不知道该怎么做......而且文档对我没有多大帮助.
稍后编辑:我想在xml文件中添加阴影而不是代码.谢谢.
我需要在我的按钮上添加模糊的阴影:
我尝试使用layer-list xml drawable创建背景,但它看起来不像模糊.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Drop Shadow Stack -->
<item>
<shape>
<corners android:radius="45dp" />
<padding
android:bottom="2dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<stroke
android:width="6dp"
android:color="#007879E8" />
</shape>
</item>
////// 10 more items
<item>
<shape>
<corners android:radius="45dp" />
<padding
android:bottom="2dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<stroke
android:width="6dp"
android:color="#177879E8" />
</shape>
</item>
<!-- Background -->
<item>
<shape>
<corners android:radius="45dp" />
<stroke
android:width="2dp"
android:color="@color/main_purple_text_color" />
</shape>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
此外,我试图使用背景元素隐藏按钮与blured png但它使用了很多资源,我不能创建选择器来改变悬停或点击背景.
我需要为按钮设置单个背景文件,并使用选择器在悬停/单击时更改模糊和渐变.有任何想法如何用Android SDK实现这样的效果?
更新1
谢谢大家的答案,但我不是在问如何创建渐变.我已经这样做了.我需要创建模糊的阴影.
这里有点类似的问题,但答案是只删除高程和阴影......不是我想要的:Android CardView with unique border when transparent
我想要的是 Pixel Launcher 搜索栏中显示的内容...即具有半透明背景和阴影的形状,但阴影与白色形状不重叠(最终会使其看起来灰色) . 我基本上想要一个阴影,但中间有一个洞,我的形状是......
这是我尝试过的,但您可以从附图中看到,灰色阴影是从半透明的白色背景中穿过的。
活动_main.xml
<FrameLayout
android:layout_width="120dp"
android:layout_height="120dp"
android:background="@drawable/rectangle"
android:elevation="8dp" />
Run Code Online (Sandbox Code Playgroud)
矩形文件
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="4dp" />
<solid android:color="#aaffffff" />
</shape>
Run Code Online (Sandbox Code Playgroud)
你可以看到,即使我的形状是白色背景上的半透明白色,它也会因为下面的阴影而变成灰色,这不是我想要的。
我也尝试过使用 View#setOutlineProvider 但没有成功。
我也试过玩https://github.com/harjot-oberai/MaterialShadows
如果可以避免的话,我不想用 9patch 图像来做。
android ×5
shadow ×3
blur ×2
dropshadow ×2
button ×1
drawbitmap ×1
gradient ×1
imageview ×1
paint ×1
shape ×1
transparent ×1
xml ×1