任意View邊緣虛化

package com.tencent.wcenter.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;

import com.tencent.wcenter.R;
import com.tencent.wcenter.utils.SystemUtils;

/**
 * 任意View邊沿透明
 */
public class EdgeTransparentView extends FrameLayout {
    //初始化畫(huà)筆
    private Paint mPaint;
    //標(biāo)記邊沿透明
    private int position;
    //邊沿透明的寬度
    private float drawSize;
    //頂邊透明
    private int topMask = 0x01;
    //底邊透明
    private int bottomMask = topMask << 1;
    //左邊透明
    private int leftMask = topMask << 2;
    //右邊透明
    private int rightMask = topMask << 3;
    //當(dāng)前view的寬度
    private int mWidth;
    //當(dāng)前view的高度
    private int mHeight;


    //自定義view構(gòu)造方法,在xml中使用時(shí)調(diào)用
    public EdgeTransparentView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    //自定義view,帶有自定義styleattr時(shí)調(diào)用
    public EdgeTransparentView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }
    //初始化屬性和變量
    private void init(Context context, AttributeSet attrs) {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

        //解析自定義屬性
        final TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.EdgeTransparentView);
        //默認(rèn)所有邊都具有邊沿透明功能
        position = typedArray.getInt(R.styleable.EdgeTransparentView_edge_position, 0);
        //默認(rèn)寬度20
        drawSize = typedArray.getDimension(R.styleable.EdgeTransparentView_edge_width, SystemUtils.dp2px(getContext(), 20));
        typedArray.recycle();
    }


    //尺寸改變時(shí)候回調(diào)
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        initShader();
        mWidth = getWidth();
        mHeight = getHeight();
    }

    //漸變顏色
    private int[] mGradientColors = {0xff15202E , 0x0015202E};
    //漸變位置
    private float[] mGradientPosition = new float[]{0, 1};

    private void initShader() {
        mPaint.setShader(new LinearGradient(0, 0, 0, drawSize, mGradientColors, mGradientPosition, Shader.TileMode.CLAMP));
    }

    //繪制childview
    @Override
    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
        int layerSave = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
        boolean drawChild = super.drawChild(canvas, child, drawingTime);
        if (position == 0 || (position & topMask) != 0) {
            canvas.drawRect(0, 0, mWidth, drawSize, mPaint);
        }

        if (position == 0 || (position & bottomMask) != 0) {
            int save = canvas.save();
            canvas.rotate(180, mWidth / 2, mHeight / 2);
            canvas.drawRect(0, 0, mWidth, drawSize, mPaint);
            canvas.restoreToCount(save);
        }

        int offset = (mHeight - mWidth) / 2;
        if (position == 0 || (position & leftMask) != 0) {
            int saveCount = canvas.save();
            canvas.rotate(90, mWidth / 2, mHeight / 2);
            canvas.translate(0, offset);
            canvas.drawRect(0 - offset, 0, mWidth + offset, drawSize, mPaint);
            canvas.restoreToCount(saveCount);
        }

        if (position == 0 || (position & rightMask) != 0) {
            int saveCount = canvas.save();
            canvas.rotate(270, mWidth / 2, mHeight / 2);
            canvas.translate(0, offset);
            canvas.drawRect(0 - offset, 0, mWidth + offset, drawSize, mPaint);
            canvas.restoreToCount(saveCount);
        }

        canvas.restoreToCount(layerSave);
        return drawChild;
    }

}

使用方法


    <LinearLayout
        android:id="@+id/ll_banner_vp_root"
        android:layout_width="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        android:layout_height="@dimen/dp_400">
虛化BannerViewPager 
        <com.tencent.wcenter.view.EdgeTransparentView
            android:layout_width="wrap_content"
            android:layout_gravity="center_horizontal"
            app:edge_position="left|right"
            app:edge_width="@dimen/dp_80"
            android:layout_marginRight="1dp"
            android:layout_height="@dimen/dp_320">
        <com.youth.banner.view.BannerViewPager
            android:id="@id/bannerViewPager"
            android:layout_gravity="center_horizontal"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_320"
            android:clipChildren="false" />
        </com.tencent.wcenter.view.EdgeTransparentView>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容