android带边框的RelativeLayout
概述
这个是小众需求,主要用于某些需要手动控制边框线是否显示的场景,例如底层通过数据参数的形式,配置边框显示的形式。多用于基于c语言实现功能android端展示的场景。
代码实现
public class BorderRelativeLayout extends RelativeLayout {
private Paint mPain;
private int mPaintColor;
private float mBorderStrokeWidth = 1.0f;
private int mBorderBottomLeftBreakSize;
private int mBorderBottomRightBreakSize;
private boolean isNeedTopBorder = false;
private boolean isNeedLeftBorder = false;
private boolean isNeedRightBorder = true;
private boolean isNeedBottomBorder = true;
private DisplayMetrics displayMetrics;
public BorderRelativeLayout(Context context) {
this(context, null);
}
public BorderRelativeLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BorderRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
displayMetrics = context.getResources().getDisplayMetrics();
init();
}
private void init() {
mPain = new Paint();
mPain.setColor(Color.parseColor("#000000"));
mPain.setAntiAlias(true);
mPain.setStrokeWidth(mBorderStrokeWidth);
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (isNeedTopBorder) {
canvas.drawLine(0, 0, this.getWidth(), 0, mPain);
}
if (isNeedBottomBorder) {
canvas.drawLine(mBorderBottomLeftBreakSize, this.getHeight(), this.getWidth() - mBorderBottomRightBreakSize, this.getHeight(), mPain);
}
if (isNeedLeftBorder) {
canvas.drawLine(0, 0, 0, this.getHeight(), mPain);
}
if (isNeedRightBorder) {
canvas.drawLine(this.getWidth(), 0, this.getWidth(), this.getHeight(), mPain);
}
}
public void setBorderColor(int color) {
if (mPain.getColor() == color) {
return;
} else {
mPain.setColor(color);
invalidate();
}
}
public void setBorderStrokeWidth(float size) {
if (mPain.getStrokeWidth() == size) {
return;
} else {
mPain.setStrokeWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, size, displayMetrics));
invalidate();
}
}
public void setNeedTopBorder(boolean needtopborder) {
isNeedTopBorder = needtopborder;
invalidate();
}
public void setNeedBottomBorder(boolean needbottomborder) {
isNeedBottomBorder = needbottomborder;
invalidate();
}
public void setNeedLeftBorder(boolean needLeftBorder) {
isNeedLeftBorder = needLeftBorder;
invalidate();
}
public void setNeedRightBorder(boolean needRightBorder) {
isNeedRightBorder = needRightBorder;
invalidate();
}
public void setBorderState(boolean needtopborder, boolean needbottomborder, boolean needLeftBorder, boolean needRightBorder) {
isNeedTopBorder = needtopborder;
isNeedBottomBorder = needbottomborder;
isNeedLeftBorder = needLeftBorder;
isNeedRightBorder = needRightBorder;
invalidate();
}
}
|