Android阴影简单实现

作者: 大批 | 来源:发表于2017-06-07 20:50 被阅读2249次

:)

**V~**

阴影绘制需要的知识点

  • 硬件加速
  • Paint对象的setShadowLayer方法

android硬件加速

  • Application级别开启硬件加速
<application android:hardwareAccelerated="true"/>
  • Activity级别开启硬件加速
<activity android:hardwareAccelerated="true">
  • Window级别开启硬件加速
getWindow().setFlags( 
   WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
);
  • View级别开启硬件加速
    myView.setLayerType(View.LAYER_TYPE_*, null);

setShadowLayer


思路来自一个开源库

https://github.com/yingLanNull/ShadowImageView


解析上面那个开源库

  • 这个库的主要代码就一个自定义的控件ShadowImageView(继承RelativeLayout)
public class ShadowImageView extends RelativeLayout
  • 实现思路就是先给这个控件绘制一个带阴影的背景,然后在给这个控件添加一个ImageView的子控件
  • 构造方法的实现
public ShadowImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setPadding(80, 40, 80, 120); //设置一个padding用来绘制阴影背景
        setGravity(Gravity.CENTER);
        setLayerType(LAYER_TYPE_SOFTWARE, null); //开启硬件加速
        
        //添加一个imageView的子控件
        RoundImageView roundImageView = new RoundImageView(context);
        roundImageView.setScaleType(ImageView.ScaleType.FIT_XY);
        if (imageresource == -1) {
            roundImageView.setImageResource(android.R.color.transparent);
        } else {
            roundImageView.setImageResource(imageresource);
        }

        addView(roundImageView);
    }
  • 背景的绘制方法dispatchDraw(简化)
@Override
protected void dispatchDraw(Canvas canvas) {
            //初始化一个绘制背景的画笔
            Paint shadowPaint = new Paint();
            shadowPaint.setColor(Color.WHITE);
            shadowPaint.setStyle(Paint.Style.FILL);
            shadowPaint.setAntiAlias(true);
           //计算阴影的偏移量 和 给画笔设置阴影
            int radius = view.getHeight() / 12 > 40 ? 40 : view.getHeight() / 12;
            int shadowColor = view.getHeight() / 16 > 28 ? 28 : view.getHeight() / 16;
            shadowPaint.setShadowLayer(radius, 0, shadowColor, getDarkerColor(rgb));

             //确定阴影的的整个大小
            RectF rectF = new RectF(view.getX() + (view.getWidth() / 20), view.getY(), view.getX() + view.getWidth() - (view.getWidth() / 20), view.getY() + view.getHeight() - ((view.getHeight() / 40)));
            canvas.drawRoundRect(rectF, shadowRound, shadowRound, shadowPaint);
            canvas.save();
            super.dispatchDraw(canvas);
}
  • 阴影颜色的获取(上面使用的是getDarkerColor方法,这里面有一个小技巧就是HSV模型)
    public int getDarkerColor(int color) {
        float[] hsv = new float[3];
        Color.colorToHSV(color, hsv);
        hsv[1] = hsv[1] + 0.1f;
        hsv[2] = hsv[2] - 0.1f;
        int darkerColor = Color.HSVToColor(hsv);
        return darkerColor;
    }

简单说一下HSV

  • 平时我们说颜色一般都是RGB,R分量表示红色,G绿色,、B蓝色
  • 而HSV也是用来表示颜色的,只是H表示色调(0 ~ 360),S表示饱和度(0 ~ 1),V表示明度(0 ~ 1)

Nothing is certain in this life. The only thing i know for sure is that. I love you and my life. That is the only thing i know. have a good day

相关文章

  • Android阴影简单实现

    :) 阴影绘制需要的知识点 硬件加速 Paint对象的setShadowLayer方法 android硬件加速 A...

  • Android打造带阴影的气泡

    前言 在做Android项目的时候,我们的射鸡师常常会使用阴影,Android实现阴影目前主流有以下几种方式:1)...

  • Android 实现阴影效果

    第一层是阴影图层 居上 和左3dp,第二层是 背景图层 居下和右3dp这样右和下面阴影边就露出来了 当然我们也可以...

  • TextView实现跑马灯

    最简实现文字跑马灯显示: 补: android:shadowDx //设置阴影横向坐标开始位置 android:s...

  • 为控件添加阴影效果-最简单的实现方法

    为控件添加阴影效果-最简单的实现方法 我们知道Android5.0 引入了Z轴的概念,于是就有着这种风格,也就是目...

  • Android之动手写个带阴影的TextView

    Android中自带阴影的实现往往达不到设计想要的效果,本文将实现一个支持圆角,可自定义阴影各属性的TextVie...

  • React Native阴影框效果实现

    RN自带阴影 RN提供了阴影样式属性,但其仅支持ios平台,在Android中需要使用elevation属性实现,...

  • Android 实现阴影效果总结

    图片添加阴影是为了突出图片的效果,有的设计师为了突出某部分的内容会给该部分添加阴影背景,常见的是给图片添加外阴影,...

  • Android Material Design 阴影实现

    让 View 产生阴影有以下 4 种方式: 控制 elevation 使用 OutlineProvider 使用 ...

  • Android阴影背景的实现

    一、需求来源: 设计师要求还原设计的阴影,下面是sketch原型参数: 二、Android本身控件自带阴影效果无法...

网友评论

  • 045f1e3add02:如何改变阴影的方向呢
  • Jevely:楼主为什么我阴影颜色总是黑色呢?我传的是res里面color自定义的颜色
    Jevely:@大批 已经解决了,自己的问题
    大批:代码贴出来看看呢~~
  • 小彤花园: setLayerType(LAYER_TYPE_SOFTWARE, null); 是关闭硬件加速吧
    大批:恩恩~~ 哈哈~~

本文标题:Android阴影简单实现

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