android自定義陰影效果


package fantuan.app.shell;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;

/**
 * 使用圓角時围橡,應(yīng)設(shè)置圓角相同的background
 */

public class ShadowRelativeLayout extends RelativeLayout {
    private static final int DEFAULT_BLUR = 30;
    private static final int DEFAULT_ALPHA = 90;
    /**
     * 陰影的顏色, 需要帶透明
     */
    private int shadowColor = Color.argb(DEFAULT_ALPHA, 0, 0, 0);
    /**
     * 陰影的大小范圍 shadowBlur越大越模糊轿偎,越小越清晰
     */
    private float shadowBlur = DEFAULT_BLUR;

    /**
     * 陰影的圓角,只支持四角相同
     */
    private float shadowRadius = 0;

    /**
     * 陰影的偏移
     */
    private float shadowDx = 0;
    private float shadowDy = 0;

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

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

    private boolean xmlBackground = true;

    public ShadowRelativeLayout(Context context, AttributeSet attrs,
                                int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        xmlBackground = false;
        setBackground(originBackground);
        dealAttrs(context, attrs);
        setPaint();
    }

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

    @Override
    public void draw(Canvas canvas) {
        canvas.drawRoundRect(getRectF(), shadowRadius, shadowRadius, mPaint);
        super.draw(canvas);
    }

    private Drawable originBackground;

    public Drawable getInsetBackground() {
        return super.getBackground();
    }

    @Override
    public Drawable getBackground() {
        return originBackground;
    }

    @Override
    public void setBackground(Drawable background) {
        originBackground = background;
        if (xmlBackground) { //padding還沒好
            return;
        }
        if (background != null && !(background instanceof InsetDrawable)) {
            InsetDrawable drawable =
                    new InsetDrawable(background, getPaddingLeft(), getPaddingTop(),
                            getPaddingRight(), getPaddingBottom());
            background = drawable;
        }
        super.setBackground(background);
    }

    private RectF getRectF() {
        return new RectF(getPaddingLeft() + shadowDx, getPaddingTop() + shadowDy,
                getWidth() - getPaddingRight() + shadowDx,
                getHeight() - getPaddingBottom() + shadowDy);
    }

    private void dealAttrs(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ShadowRelativeLayout);
        if (typedArray != null) {
            shadowColor = typedArray.getColor(R.styleable.ShadowRelativeLayout_shadow_color, shadowColor);
            shadowRadius =
                    typedArray.getDimension(R.styleable.ShadowRelativeLayout_shadow_radius, shadowRadius);
            shadowBlur =
                    typedArray.getDimension(R.styleable.ShadowRelativeLayout_shadow_blur, shadowBlur);
            shadowDx = typedArray.getDimension(R.styleable.ShadowRelativeLayout_shadow_dx, shadowDx);
            shadowDy = typedArray.getDimension(R.styleable.ShadowRelativeLayout_shadow_dy, shadowDy);
            typedArray.recycle();
        }
    }

    private void setPaint() {
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);  // 關(guān)閉硬件加速,陰影才會繪制
        // todo 從AttributeSet獲取設(shè)置的值
        mPaint.setAntiAlias(true);
        mPaint.setColor(shadowColor);
        mPaint.setMaskFilter(new BlurMaskFilter(shadowBlur, BlurMaskFilter.Blur.NORMAL));
    }

    public int getShadowColor() {
        return shadowColor;
    }

    public void setShadowColor(int shadowColor) {
        this.shadowColor = shadowColor;
    }

    public float getShadowBlur() {
        return shadowBlur;
    }

    public void setShadowBlur(float shadowBlur) {
        this.shadowBlur = shadowBlur;
    }

    public float getShadowRadius() {
        return shadowRadius;
    }

    public void setShadowRadius(float shadowRadius) {
        this.shadowRadius = shadowRadius;
    }

    public float getShadowDx() {
        return shadowDx;
    }

    public void setShadowDx(float shadowDx) {
        this.shadowDx = shadowDx;
    }

    public float getShadowDy() {
        return shadowDy;
    }

    public void setShadowDy(float shadowDy) {
        this.shadowDy = shadowDy;
    }
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ShadowRelativeLayout">
        <attr format="color" name="shadow_color"/>
        <attr format="dimension" name="shadow_radius"/>
        <attr format="dimension" name="shadow_blur"/>
        <attr format="dimension" name="shadow_dx"/>
        <attr format="dimension" name="shadow_dy"/>
    </declare-styleable>

</resources>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盐股,一起剝皮案震驚了整個濱河市李命,隨后出現(xiàn)的幾起案子撩鹿,更是在濱河造成了極大的恐慌搅方,老刑警劉巖谬哀,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刺覆,死亡現(xiàn)場離奇詭異,居然都是意外死亡玻粪,警方通過查閱死者的電腦和手機(jī)隅津,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲室,“玉大人伦仍,你說我怎么就攤上這事『苎螅” “怎么了充蓝?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我谓苟,道長官脓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任涝焙,我火速辦了婚禮卑笨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仑撞。我一直安慰自己赤兴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布隧哮。 她就那樣靜靜地躺著桶良,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沮翔。 梳的紋絲不亂的頭發(fā)上陨帆,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音采蚀,去河邊找鬼疲牵。 笑死,一個胖子當(dāng)著我的面吹牛搏存,可吹牛的內(nèi)容都是我干的瑰步。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼璧眠,長吁一口氣:“原來是場噩夢啊……” “哼缩焦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起责静,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤袁滥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灾螃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體题翻,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年腰鬼,在試婚紗的時候發(fā)現(xiàn)自己被綠了嵌赠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡熄赡,死狀恐怖姜挺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彼硫,我是刑警寧澤炊豪,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布凌箕,位于F島的核電站,受9級特大地震影響词渤,放射性物質(zhì)發(fā)生泄漏牵舱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一缺虐、第九天 我趴在偏房一處隱蔽的房頂上張望芜壁。 院中可真熱鬧,春花似錦志笼、人聲如沸沿盅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至韧掩,卻和暖如春紊浩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疗锐。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工坊谁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滑臊。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓口芍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雇卷。 傳聞我的和親對象是個殘疾皇子鬓椭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容