任意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 {
    //初始化畫筆
    private Paint mPaint;
    //標記邊沿透明
    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;
    //當前view的寬度
    private int mWidth;
    //當前view的高度
    private int mHeight;


    //自定義view構造方法,在xml中使用時調用
    public EdgeTransparentView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    //自定義view,帶有自定義styleattr時調用
    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);
        //默認所有邊都具有邊沿透明功能
        position = typedArray.getInt(R.styleable.EdgeTransparentView_edge_position, 0);
        //默認寬度20
        drawSize = typedArray.getDimension(R.styleable.EdgeTransparentView_edge_width, SystemUtils.dp2px(getContext(), 20));
        typedArray.recycle();
    }


    //尺寸改變時候回調
    @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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章