美文网首页
给view添加阴影效果

给view添加阴影效果

作者: echoSuny | 来源:发表于2020-07-01 19:00 被阅读0次

    如果要给按钮增加阴影效果,可以在drawable文件夹下通过layer-list标签来实现。但是这种方法对图片和文字却没有效果。但是Android系统提供了setShadowLayer()函数可以实现为图片和文字添加阴影。

    setShadowLayer()
        public void setShadowLayer(float radius, float dx, float dy, @ColorInt int shadowColor) {
            setShadowLayer(radius, dx, dy, Color.pack(shadowColor));
        }
    
    • radius 模糊半径。数值越大越模糊,越小越清晰。如果为0,则阴影消失不见
    • dx 阴影横向偏移距离,正值向右偏,负值向左偏
    • dy 阴影纵向偏移距离,正值向下偏,负值向上偏
    • color 阴影的颜色,但是对图片无效
    class ShadowView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
    ) : View(context, attrs, defStyleAttr) {
    
        val paint: Paint
        val bitmap: Bitmap
        var radius:Float
        var dx:Float
        var dy:Float
        init {
            radius = 10f
            dx=10f
            dy=10f
            setLayerType(LAYER_TYPE_SOFTWARE, null)
            paint = Paint()
            paint.textSize = sp(22).toFloat()
            paint.color = Color.RED
            bitmap = BitmapFactory.decodeResource(resources, R.drawable.dog)
        }
    
        fun changeRadius(float: Float){
            this.radius = radius
            invalidate()
        }
    
        fun changeDx(dx: Float){
            this.dx = dx
            invalidate()
        }
    
        fun changeDy(dy: Float){
            this.dy = dy
            invalidate()
        }
        override fun onDraw(canvas: Canvas) {
            super.onDraw(canvas)
            paint.setShadowLayer(radius, dx, dy, Color.BLACK)
    
            canvas.drawText("ABC", 100f, 100f, paint)
    
            canvas.drawCircle(100f, 200f, 50f, paint)
    
            canvas.drawBitmap(bitmap, 100f, 350f, paint)
        }
    }
    

    如果要清除阴影的话则可以调用clearShadowLayer(),然后使view重绘即可。

    setMaskFilter()

    与阴影效果相似的还有一个发光效果。发光时边缘是什么颜色,发的光就是什么颜色。

        public MaskFilter setMaskFilter(MaskFilter maskfilter) {
        }
    

    MaskFilter是一个类,不过里面什么逻辑都没有,需要用它的子类:

    • BlurMaskFilter 实现发光效果。需要传两个参数,一个是半径,一个是枚举。枚举的取值有以下4种:
    paint.maskFilter = BlurMaskFilter(28f,BlurMaskFilter.Blur.SOLID)
    
    SOLID
    paint.maskFilter = BlurMaskFilter(28f,BlurMaskFilter.Blur.NORMAL)
    
    NORMAL
    paint.maskFilter = BlurMaskFilter(28f,BlurMaskFilter.Blur.INNER)
    
    INNER
    paint.maskFilter = BlurMaskFilter(28f,BlurMaskFilter.Blur.OUTER)
    
    OUTER
    • EmbossMaskFilter 能够实现浮雕效果
    paint.maskFilter = EmbossMaskFilter(floatArrayOf(4f,7f,22f),.9f,8f,12f)
    
    给图片添加纯色阴影

    其实阴影效果的产生就是获得一个跟原型一样的副本,然后对这个副本加上发光效果然后再偏移一段距离,就形成了所谓的阴影效果。

    class ShadowView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
    ) : View(context, attrs, defStyleAttr) {
    
        val paint: Paint
        val bitmap: Bitmap
        val alphaBitmap: Bitmap
    
        init {
            setLayerType(LAYER_TYPE_SOFTWARE, null)
            paint = Paint()
            paint.textSize = sp(22).toFloat()
            paint.color = Color.RED
            bitmap = BitmapFactory.decodeResource(resources, R.drawable.dog)
            // 新建一张空白位图,并与原bitmap有一样的透明度
            // 这张空白图的颜色则由画笔颜色决定
            alphaBitmap = bitmap.extractAlpha()
        }
    
        override fun onDraw(canvas: Canvas) {
            super.onDraw(canvas)
    
            paint.setColor(Color.GRAY)
            paint.maskFilter = BlurMaskFilter(28f,BlurMaskFilter.Blur.SOLID)
            canvas.drawBitmap(alphaBitmap,100f,100f,paint)
    
            canvas.translate(-5f,-5f)
            paint.maskFilter = null
            canvas.drawBitmap(bitmap, 100f, 100f, paint)
        }
    }
    

    相关文章

      网友评论

          本文标题:给view添加阴影效果

          本文链接:https://www.haomeiwen.com/subject/ncaxqktx.html