android shape实现阴影或模糊边效果

 

https://cloud.tencent.com/developer/article/1854434

https://blog.csdn.net/zhyazaq/article/details/86513528?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.base

https://www.jianshu.com/p/9b5d111aa306

https://blog.csdn.net/fengyoujie/article/details/6531224


https://blog.csdn.net/chenhuakang/article/details/91984083

  

 

 

android shape实现阴影或模糊边效果

原文地址:https://www.cnblogs.com/linghu-java/p/10837421.html

 

android实现阴影的方式有很多,

1.   Android 在 API21(5.0)添加了 elevation,可以很方便的在 View 上实现阴影。但是这个只在 >= API21 的手机上可以看到阴影效果,低于这个版本的就没有阴影效果。

2.  CardView 也可以实现阴影效果,项目中一般都是使用这种方式实现卡片式的效果并带有阴影。使用 CardView 确实很不错,但是它在使用的时候也是需要有注意的地方:

 (1) CardView 实现阴影效果的布局,在 >= API 21 的版本上和 < 21 的版本上,如果不在代码上做好控制,他们的显示差异还是很大的。(2) CardView 在 >= API21 的版本上实现阴影效果也是通过 elevation 来实现的,最终的渲染是调用 native 方法进行的。在使用过程中发现在不同位置的 View 阴影的方向是不一样的。不知道你们发现没,它模拟的场景就是 光源的位置在屏幕中心的正上方,然后 View 的位置由光源的位置决定。阴影方向不一致。

3. 通过 .9 图来制作阴影,这里通过一个很好的工具来制作哈:http://inloop.github.io/shadow4android/,这种方式制作小的背景阴影很模糊,效果上比不过 shape。

4. 用 SCardView 来实现阴影,使用方式和 CardView一样,但是它是使用一套代码,显示不会有差异,而且可以通过设置光源的位置来控制阴影的方向以及阴影的颜色。

compile 'io.github.meetsl:SCardView:1.0'

5. 通过shape来实现,具体是通过layer-list 多层叠放的方式实现的。

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  3.  
        <!-- 边 -->
  4.  
        <item>
  5.  
            <shape android:shape="rectangle">
  6.  
                <padding
  7.  
                    android:bottom="2dp"
  8.  
                    android:left="2dp"
  9.  
                    android:right="2dp"
  10.  
                    android:top="2dp" />
  11.  
                <solid android:color="#00CCCCCC" />
  12.  
                <corners android:radius="8dp" />
  13.  
            </shape>
  14.  
        </item>
  15.  
        <item>
  16.  
            <shape android:shape="rectangle">
  17.  
                <padding
  18.  
                    android:bottom="2dp"
  19.  
                    android:left="2dp"
  20.  
                    android:right="2dp"
  21.  
                    android:top="2dp" />
  22.  
                <solid android:color="#10CCCCCC" />
  23.  
                <corners android:radius="8dp" />
  24.  
            </shape>
  25.  
        </item>
  26.  
        <item>
  27.  
            <shape android:shape="rectangle">
  28.  
                <padding
  29.  
                    android:bottom="2dp"
  30.  
                    android:left="2dp"
  31.  
                    android:right="2dp"
  32.  
                    android:top="2dp" />
  33.  
                <solid android:color="#20CCCCCC" />
  34.  
                <corners android:radius="8dp" />
  35.  
            </shape>
  36.  
        </item>
  37.  
        <item>
  38.  
            <shape android:shape="rectangle">
  39.  
                <padding
  40.  
                    android:bottom="2dp"
  41.  
                    android:left="2dp"
  42.  
                    android:right="2dp"
  43.  
                    android:top="2dp" />
  44.  
                <solid android:color="#30CCCCCC" />
  45.  
                <corners android:radius="8dp" />
  46.  
            </shape>
  47.  
        </item>
  48.  
        <item>
  49.  
            <shape android:shape="rectangle">
  50.  
                <padding
  51.  
                    android:bottom="2dp"
  52.  
                    android:left="2dp"
  53.  
                    android:right="2dp"
  54.  
                    android:top="2dp" />
  55.  
                <solid android:color="#50CCCCCC" />
  56.  
                <corners android:radius="8dp" />
  57.  
            </shape>
  58.  
        </item>
  59.  
     
  60.  
        <!-- 中心背景 -->
  61.  
        <item>
  62.  
            <shape android:shape="rectangle"
  63.  
                android:useLevel="false">
  64.  
                <!-- 实心 -->
  65.  
                <solid android:color="#ffffff" />
  66.  
                <corners android:radius="10dp" />
  67.  
                <padding android:left="10dp"
  68.  
                    android:right="10dp"
  69.  
                    android:top="10dp"
  70.  
                    android:bottom="10dp"/>
  71.  
            </shape>
  72.  
        </item>
  73.  
    </layer-list>
   
 

使用

1 android:background="@drawable/layer_white_bg"
各种方式的差异   
方式 是否有显示差异 是否可以控制阴影方向 是否可以设置阴影颜色 阴影是否占位 是否模糊 绘制效率 其他
elevation 无 不可控制 不可设置 不占位 不 高,通过 native 绘制 只在 API 21 生效
CardView 有 不可控制 不可设置 不占位 不 Api 21 上效率高,通过native 绘制  
shape 无 可控 可设置 占位 不 一般  
.9 图 无 可控,生效一次,更改需重新生成  可设置,更改需重新生成 占位 模糊 慢(加载图片显示)  
SCardView 无 可控 可设置 不占位 不 一般

https://blog.csdn.net/chenhuakang/article/details/91984083

 

###################################################################################################################################################

 

Android 图片实现阴影效果的若干种方法

 

第一种 使用 layer-list

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<!--底层的左边距离上层左边3dp, 底层的顶部,距离上层的顶部6dp,如果不做这个控制,底层和上层的左侧和上侧会重合在一起-->
<item android:left="3dp"
      android:top="6dp">
    <shape>
        <solid android:color="#b4b5b6"/>
    </shape>
</item>

<!--上层的右边距离底层的右边3dp, 上层的底部距离底层的底部6dp-->
<item android:bottom="6dp"
      android:right="3dp">
    <shape>
        <solid android:color="#fff"/>
    </shape>
</item>

</layer-list>

第二种 使用 shadow属性

shadowDX、shadowDy、shadowRadius,分别指的是阴影的横、纵坐标偏移,以及阴影的半径,

如果是TextView可以直接在布局中设置:

<TextView 
	    android:id="@+id/test_shadow"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:textSize="60sp"
	    android:textColor="#cc000000"
	    android:text="Test Shadow"
	    android:layout_gravity="center"
	    android:shadowColor="#aa22ff22"
	    android:shadowRadius="10"
	    android:shadowDx="0"
	    android:shadowDy="0"
	    />

第三种 使用android:elevation属性

<TextView
android:id="@+id/btn_test_performance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="5dp"
android:text="@string/hello"
android:background="@drawable/shape_round_white"
android:padding="20dp"
android:layout_marginTop="10dp"
android:layout_gravity="center"/>

这种方式有个局限性, 那就是api25以上才能显示出来

第四种 使用第三方控件

/**
 * ShadowLayout.java
 * <p>
 * Created by lijiankun on 17/8/11.
 */

public class ShadowLayout extends RelativeLayout {

    public static final int ALL = 0x1111;

    public static final int LEFT = 0x0001;

    public static final int TOP = 0x0010;

    public static final int RIGHT = 0x0100;

    public static final int BOTTOM = 0x1000;

    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

    private RectF mRectF = new RectF();

    /**
     * 阴影的颜色
     */
    private int mShadowColor = Color.TRANSPARENT;

    /**
     * 阴影的大小范围
     */
    private float mShadowRadius = 0;

    /**
     * 阴影 x 轴的偏移量
     */
    private float mShadowDx = 0;

    /**
     * 阴影 y 轴的偏移量
     */
    private float mShadowDy = 0;

    /**
     * 阴影显示的边界
     */
    private int mShadowSide = ALL;

    public ShadowLayout(Context context) {
        this(context, null);
    }

    public ShadowLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ShadowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs);
    }

    /**
     * 获取绘制阴影的位置,并为 ShadowLayout 设置 Padding 以为显示阴影留出空间
     */
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        float effect = mShadowRadius + dip2px(5);
        float rectLeft = 0;
        float rectTop = 0;
        float rectRight = this.getWidth();
        float rectBottom = this.getHeight();
        int paddingLeft = 0;
        int paddingTop = 0;
        int paddingRight = 0;
        int paddingBottom = 0;

        if (((mShadowSide & LEFT) == LEFT)) {
            rectLeft = effect;
            paddingLeft = (int) effect;
        }
        if (((mShadowSide & TOP) == TOP)) {
            rectTop = effect;
            paddingTop = (int) effect;
        }
        if (((mShadowSide & RIGHT) == RIGHT)) {
            rectRight = this.getWidth() - effect;
            paddingRight = (int) effect;
        }
        if (((mShadowSide & BOTTOM) == BOTTOM)) {
            rectBottom = this.getHeight() - effect;
            paddingBottom = (int) effect;
        }
        if (mShadowDy != 0.0f) {
            rectBottom = rectBottom - mShadowDy;
            paddingBottom = paddingBottom + (int) mShadowDy;
        }
        if (mShadowDx != 0.0f) {
            rectRight = rectRight - mShadowDx;
            paddingRight = paddingRight + (int) mShadowDx;
        }
        mRectF.left = rectLeft;
        mRectF.top = rectTop;
        mRectF.right = rectRight;
        mRectF.bottom = rectBottom;
        this.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
    }

    /**
     * 真正绘制阴影的方法
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(mRectF, mPaint);
    }

    /**
     * 读取设置的阴影的属性
     *
     * @param attrs 从其中获取设置的值
     */
    private void init(AttributeSet attrs) {
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);  // 关闭硬件加速
        this.setWillNotDraw(false);                    // 调用此方法后,才会执行 onDraw(Canvas) 方法

        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.ShadowLayout);
        if (typedArray != null) {
            mShadowColor = typedArray.getColor(R.styleable.ShadowLayout_shadowColor,
                    ContextCompat.getColor(getContext(), android.R.color.black));
            mShadowRadius = typedArray.getDimension(R.styleable.ShadowLayout_shadowRadius, dip2px(0));
            mShadowDx = typedArray.getDimension(R.styleable.ShadowLayout_shadowDx, dip2px(0));
            mShadowDy = typedArray.getDimension(R.styleable.ShadowLayout_shadowDy, dip2px(0));
            mShadowSide = typedArray.getInt(R.styleable.ShadowLayout_shadowSide, ALL);
            typedArray.recycle();
        }
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.TRANSPARENT);
        mPaint.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColor);
    }

    /**
     * dip2px dp 值转 px 值
     *
     * @param dpValue dp 值
     * @return px 值
     */
    private float dip2px(float dpValue) {
        DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
        float scale = dm.density;
        return (dpValue * scale + 0.5F);
    }
}

属性文件:

<declare-styleable name="ShadowLayout">
    <attr name="shadowColor" format="color"/>
    <attr name="shadowRadius" format="dimension"/>
    <attr name="shadowDx" format="dimension"/>
    <attr name="shadowDy" format="dimension"/>
    <attr name="shadowSide" format="integer"/>
</declare-styleable>

第五种 使用9patch图片(强烈推荐)

该种方式定制性强, 兼容性好, 需要注意的是避免将9patch宽高设置过大 小图可以拉大 大图不方便缩小

链接地址:http://inloop.github.io/shadow4android/

 

 

本文分享自微信公众号 - 乱码三千(infree6),作者:有瓣知识

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

https://cloud.tencent.com/developer/article/1854434

########################################################################################################################################

 

 

android 阴影的实现方式

刘景昌
42019.05.13 16:03:27字数 1,031阅读 35,139

在开发过程中一般情况下,UI设计师喜欢添加一些阴影来使控件看起来比较有立体和层次感,来表明自己高大上的设计。
在这里分享下android里面关于阴影的实现方式:
1.使用.9文件
优点:个人认为最好的实现方式 实现方便 节省内存和渲染时间,使用方便
缺点:每个阴影都用.9文件会增加报的体积大小而且不如自己写的好维护 总不能每次换点阴影都去找UI
2.使用 layer-list
实现原理:layer-list本身是一些drawable的集合 我们把许多的drawable叠加起来形成层次差实现阴影
使用layer-list实现 阴影边框效果:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--第一层阴影-->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#0F000000" />
            <corners android:radius="10dp" />
        </shape>
    </item>
    <!--第二层前景-->
    <item
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
            <corners android:radius="10dp" />
        </shape>
    </item>
</layer-list>

实现效果:

 

 
image.png

我们可以看到最终的实现效果并不是很理想,但是如果UI要求的效果不是很严格的话还是勉强能用的

优点:书写比较方便 可以使用渐变来替换阴影 如果颜色统一的方便管理
缺点:增加背景图层 可以实现阴影效果 但是没有模糊
3.使用 elevation,translationZ
android 5.0以后增加的设置阴影的api 并配合OutlineProvider 修改阴影的轮廓
android 8.0以后增加两个api可以修改阴影的颜色 8.0一下无效
android:outlineAmbientShadowColor :照射光的颜色 一般没什么作用
android:outlineSpotShadowColor:阴影颜色
实现效果:

 

 
image.png

 

注意点:使用阴影颜色的时候要使用8位的色值 一定要带透明度哦 否则是没有效果的
优点: 使用自带的api不用添加多余的drawable文件 并且支持 translationZ 动画方便实现点击的动画效果
缺点:只有api28以上才可以使用
4.使用自定义View 和自定义ViewGrop
为什么会是两种呢?不是只用ViewGrop就行了吗?
我认为对于功能比较单一 或定制化比较高的话,还是多写一个自定义View比较合适 毕竟可以减少一层的布局结构 而自定义ViewGrop 更加偏向于通用化。
在自定义View中实现阴影主要有两种方式
(1)使用BlurMaskFilter:模糊遮罩滤镜 改变图像的透明度值来实现的
核心代码: mBlurMaskFilter = new BlurMaskFilter(mMaskRadius, BlurMaskFilter.Blur.NORMAL);
mMaskPaint.setMaskFilter(mBlurMaskFilter);
参数:mMaskRadius:扩散的半径
BlurMaskFilter.Blur.NORMAL:整个图像都被模糊掉
BlurMaskFilter.Blur.SOLID:图像边界外产生一层与图像颜色一致阴影效果
BlurMaskFilter.Blur.OUTER:图像边界外产生一层阴影,并且将图像变成透明效果
BlurMaskFilter.Blur.INNER:在图像内部边沿产生模糊效果
他可以让背景和阴影都出现渐变色的效果效果比较好看
实现效果

 

 
image.png


注意:使用paint.setMaskFilter()需要将硬件加速关闭 一般在自定义View的构造方法调用就行了 setLayerType(View.LAYER_TYPE_SOFTWARE,null)
优点:可以较好的实现一个扩散阴影的效果,可以支持阴影使用渐变色,也可以是图片颜色的延伸
缺点: 需要关闭硬件加速,暂时不支持阴影偏移
最终实现的View

<com.example.shadowlibrary.MaskTextView
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginStart="20dp"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="20dp"
            app:shadowText="自定义View实现阴影" />

自定义属性的介绍:
shadowTextColor :文字颜色
shadowBgStartColor:背景渐变开始颜色
shadowBgEndColor:背景渐变结束颜色
shadowSelectStartColor:点击后背景渐变开始颜色
shadowSelectEndColor:点击后背景渐变结束颜色
shadowTextRadius:背景圆角
shadowTextSize:背景字体大小
(2)使用 setShadowLayer
核心代码:mMaskPaint.setShadowLayer(radius,dx,dy,color));
参数:radius 阴影的扩散半径
dx 阴影X方向偏移
dy 阴影Y方向偏移
color 阴影颜色
可以是背景产生阴影的而效果
实现效果:

 
image.png


注意:使用paint.setShadowLayer()需要将硬件加速关闭
优点:可以实现一般情况下所有的阴影效果 支持阴影偏移
缺点: 需要关闭硬件加速
自定义ViewGrop的引用代码:

 

    <com.example.shadowlibrary.MaskViewGroup
            android:layout_width="match_parent"
            android:layout_height="150dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginStart="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="10dp"
            android:layout_marginBottom="20dp"
            app:containerCornerRadius="27dp"
            app:containerDeltaLength="10dp"
            app:containerShadowColor="@color/colorE9E9E9"
            app:containerShadowRadius="6dp"
            app:deltaX="0dp"
            app:deltaY="-3dp"
            app:enable="true">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/shape_27_white"
                android:gravity="center" />
        </com.example.shadowlibrary.MaskViewGroup>

自定义属性介绍:
containerShadowColor:阴影颜色
containerShadowRadius:阴影半径
containerCornerRadius:阴影圆角
containerDeltaLength:阴影到边框距离
deltaX:阴影X方向偏移
deltaY:阴影Y
enable:是否显示阴影

过程中碰到的一点小坑:
为了防止onTouchEvent与onClick冲突
注意:重写performClick方法并在onTouchEvent调用
@Override
public boolean performClick() {
return super.performClick();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return true;
case MotionEvent.ACTION_UP:
performClick();
return true;
case MotionEvent.ACTION_CANCEL:
return true;
}
return super.onTouchEvent(event);
}

自定义View 的GitHub 地址:https://github.com/525642022/shadwoView

 
 
42人点赞
 
日记本

 

 https://www.jianshu.com/p/9b5d111aa306
 
 
##########################################################################################################
 

android 画阴影

fengyoujie 2011-06-08 10:52:00 12877 收藏
文章标签: android null xml c
版权
android中开发中,有时候为了某种效果需要给ImageView 或者LinearLayout画阴影。

为ImageView画阴影的主要的思想利用已知图片,然后构造一个阴影的bitmap。最后设置阴影的bitmap作为ImageView的背景。

这里参考了一个帖子:http://stackoverflow.com/questions/3567312/android-drop-shadow-on-view

利用这个思想。构造代码如下:

public void drawImageDropShadow(){
BlurMaskFilter blurFilter = new BlurMaskFilter(3, BlurMaskFilter.Blur.OUTER);
Paint shadowPaint = new Paint();
shadowPaint.setMaskFilter(blurFilter);
int[] offsetXY =new int[2];
Bitmap originalBitmap = BitmapFactory.decodeResource(this.getResources(),R.drawable.favoritelist);
Bitmap shadowBitmap = originalBitmap.extractAlpha(shadowPaint,offsetXY);

Bitmap shadowImage32 = shadowBitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas c = new Canvas(shadowImage32);
c.drawBitmap(originalBitmap, 0,0, null);
ImageView imageView1 = (ImageView)findViewById(R.id.shadowImageView);
imageView1.setImageBitmap(shadowImage32);
}
下面是设置LinearLayout的背景。用xml文件画Rectangle来作为LinearLayout的背景。思想和前面的一样。不同的是通过.xml创建一个Drawable,然后
制定 宽和高, 将Drawable转化bitmap 画阴影bitmap,然后将阴影bitmap转化为drawable,最后将drawable设置为LinearLayout的背景。
代码如下:
说明需要一个方法:将drawable转化为bitmap
一般通用的方法为:
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap
.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
//canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
我创建的drawable是一个xml文件,而不是图片,所以,drawable.getIntrinsicHeight()得不到值。所以要手动传递参数设宽度和高度。代码如下:

 

private Bitmap drawableToBitmap(Drawable drawable,int width,int height) {

Bitmap bitmap = Bitmap.createBitmap(
width,
height,
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return bitmap;
}

最后设置阴影的代码:
public void drawLayoutDropShadow(){
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.testShadowLinearLayout);

BlurMaskFilter blurFilter = new BlurMaskFilter(3, BlurMaskFilter.Blur.OUTER);
Paint shadowPaint = new Paint();
shadowPaint.setMaskFilter(blurFilter);
Drawable drawable = this.getResources().getDrawable(R.drawable.backgroundservicescolor);

int[] offsetXY =new int[2];
Bitmap originalBitmap = drawableToBitmap(drawable,200,100);
Bitmap shadowBitmap = originalBitmap.extractAlpha(shadowPaint,offsetXY);
Bitmap shadowImage32 = shadowBitmap.copy(Bitmap.Config.ARGB_8888, true);

Canvas c = new Canvas(shadowImage32);
c.drawBitmap(originalBitmap, 0,0, null);

Drawable d =new BitmapDrawable(shadowImage32);
linearLayout.setBackgroundDrawable(d);
}

 

最后的效果如下:


————————————————
版权声明:本文为CSDN博主「fengyoujie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fengyoujie/article/details/6531224

https://blog.csdn.net/fengyoujie/article/details/6531224

 

#############################################################################################################################

 

shape 阴影实现方式,总有一款适合你

南风向北~ 2019-01-16 19:43:01 2462 收藏 5
分类专栏: 安卓 开发经验 文章标签: shape 阴影 安卓 自定义view
版权

安卓
同时被 2 个专栏收录
4 篇文章0 订阅
订阅专栏

开发经验
5 篇文章0 订阅
订阅专栏
经常有遇到设计给按钮添加一些阴影,针对这一种情况有以下几种方式:
1. 求美工妹妹切一张背景图。- -!
2. 被拒之后- -!自己网上找一些资源,制作一张背景图,这里推荐一个制作9path的网站:9path神器
3. 使用安卓自带的默认的背景


android:background="@drawable/abc_popup_background_mtrl_mult"
1
4. 安卓5.0之后使用 也能起到阴影的效果,但是不能自定义颜色,而且偏移的方向都是单向的,无法做到整个按钮覆盖,但是这个效果基本满足。
<TextView
android:layout_marginTop="34dp"
android:layout_gravity="center"
android:layout_width="300dp"
android:layout_height="43dp"
android:gravity="center"
android:elevation="5dp"
android:translationZ="5dp"
android:outlineProvider="background"
android:background="@drawable/shape_white"
android:shadowDx="5"
android:shadowDy="5"
android:shadowRadius="10"
android:shadowColor="#00ffffff"
android:text="android:shadow 属性"
android:textSize="14dp" />


5. 如果不想使用图片造成apk体积增大的话,用shape也是比较好的选择,而且能自定义颜色


- 在drawable新建一个layer_list.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<padding
android:bottom="2px"
android:left="2px"
android:right="2px"
android:top="2px" />
<solid android:color="#0DCCCCCC" />
<corners android:radius="15dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<padding
android:bottom="2px"
android:left="2px"
android:right="2px"
android:top="2px" />
<solid android:color="#10CCCCCC" />
<corners android:radius="15dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<padding
android:bottom="2px"
android:left="2px"
android:right="2px"
android:top="2px" />
<solid android:color="#15CCCCCC" />
<corners android:radius="15dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<padding
android:bottom="2px"
android:left="2px"
android:right="2px"
android:top="2px" />
<solid android:color="#20CCCCCC" />
<corners android:radius="15dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<padding
android:bottom="2px"
android:left="2px"
android:right="2px"
android:top="2px" />
<solid android:color="#30CCCCCC" />
<corners android:radius="15dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle" >
<solid android:color="#14898989" />
<corners android:radius="15dp" />
<padding android:bottom="2px"
android:left="2px"
android:right="2px"
android:top="2px" />
</shape>
</item>
<item>
<shape android:shape="rectangle" >
<corners android:radius="15dp" />
<solid android:color="#FFFFFF" />
<padding
android:bottom="3px"
android:left="3px"
android:right="3px"
android:top="3px" />
</shape>
</item>
</layer-list>

- 使用
android:background="@drawable/layer_white_bg"
1
6. 自定义view绘制shadow,利用安卓API
paint.setShadowLayer(float radius, float dx, float dy, int shadowColor);
radius: 阴影半径,主要可以控制阴影的模糊效果以及阴影扩散出去的大小。
dx:阴影在X轴方向上的偏移量
dy: 阴影在Y轴方向上的偏移量
shadowColor: 阴影颜色。

优秀自定义练习代码推荐:
https://github.com/cjlemon/Shadow
https://github.com/dmytrodanylyk/shadow-layout
————————————————
版权声明:本文为CSDN博主「南风向北~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhyazaq/article/details/86513528

 

https://blog.csdn.net/zhyazaq/article/details/86513528?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.base

 

 

posted @ 2021-08-05 19:19  a318013800  阅读(3681)  评论(0)    收藏  举报