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>