• 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

  • 相关阅读:
    @JsonFormat和@DateTimeFormat
    13位时间戳和时间格式化转换,工具类
    springboot配置hibernate jpa多数据源
    Mysql向数据库插入数据时,判断是否存在,若不存在就插入数据
    服务器启动完成执行定时任务Timer,TimerTask
    java中服务器启动执行定时任务
    Java定时任务
    阿里大鱼短信发送,放到项目中报错Java.lang.NoClassDefFoundError:com/aliyuncs/exceptions/ClientException,已解决
    MD5加密(相同的字符串,每次加密后的密文是相同的)
    常见的集中加密方法BASE64、MD5、SHA、HMAC
  • 原文地址:https://www.cnblogs.com/pengmn/p/15104929.html
Copyright © 2020-2023  润新知