Files
yusheng-android/moduletablayout/src/main/java/com/example/moduletablayout/widget/ShadowViewDrawable.java
2025-05-15 11:08:23 +08:00

129 lines
3.6 KiB
Java

package com.example.moduletablayout.widget;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
/**
* <code>
* if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
* view.setLayerType(View.LAYER_TYPE_SOFTWARE, drawable.getPaint());
* }
* </code>
* <p/>
* Author: wangjie
* Email: tiantian.china.2@gmail.com
* Date: 5/2/15.
*/
public class ShadowViewDrawable extends Drawable {
private Paint paint;
private RectF bounds = new RectF();
private int width;
private int height;
private ShadowProperty shadowProperty;
private int shadowOffset;
private RectF drawRect;
private float rx;
private float ry;
public ShadowViewDrawable(ShadowProperty shadowProperty, int color, float rx, float ry) {
this.shadowProperty = shadowProperty;
shadowOffset = this.shadowProperty.getShadowOffset();
this.rx = rx;
this.ry = ry;
paint = new Paint();
paint.setAntiAlias(true);
/**
* 解决旋转时的锯齿问题
*/
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
/**
* 设置阴影
*/
paint.setShadowLayer(shadowProperty.getShadowRadius(), shadowProperty.getShadowDx(), shadowProperty.getShadowDy(), shadowProperty.getShadowColor());
drawRect = new RectF();
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
if (bounds.right - bounds.left > 0 && bounds.bottom - bounds.top > 0) {
this.bounds.left = bounds.left;
this.bounds.right = bounds.right;
this.bounds.top = bounds.top;
this.bounds.bottom = bounds.bottom;
width = (int) (this.bounds.right - this.bounds.left);
height = (int) (this.bounds.bottom - this.bounds.top);
// drawRect = new RectF(shadowOffset, shadowOffset, width - shadowOffset, height - shadowOffset);
// drawRect = new RectF(0, 0, width, height - shadowOffset);
int shadowSide = shadowProperty.getShadowSide();
int left = (shadowSide & ShadowProperty.LEFT) == ShadowProperty.LEFT ? shadowOffset : 0;
int top = (shadowSide & ShadowProperty.TOP) == ShadowProperty.TOP ? shadowOffset : 0;
int right = width - ((shadowSide & ShadowProperty.RIGHT) == ShadowProperty.RIGHT ? shadowOffset : 0);
int bottom = height - ((shadowSide & ShadowProperty.BOTTOM) == ShadowProperty.BOTTOM ? shadowOffset : 0);
drawRect = new RectF(left, top, right, bottom);
invalidateSelf();
}
}
private PorterDuffXfermode srcOut = new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT);
@Override
public void draw(Canvas canvas) {
paint.setXfermode(null);
canvas.drawRoundRect(
drawRect,
rx, ry,
paint
);
paint.setXfermode(srcOut);
// paint.setColor(Color.TRANSPARENT);
canvas.drawRoundRect(drawRect, rx, ry, paint);
}
public ShadowViewDrawable setColor(int color) {
paint.setColor(color);
return this;
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter cf) {
}
@Override
public int getOpacity() {
return PixelFormat.UNKNOWN;
}
}