上一篇是三角形,这回变箭头,很相似。。。
public class ArrowView extends ImageView {
private Paint mPaint;
private float angle;// 旋转角度o
private float mWidth;
private float mHeight;
public static final int LEFT = 270;
public static final int RIGHT = 90;
public static final int UP = 0;
public static final int DOWN = 180;
private float mPadding;
private float mDepth=5;
public ArrowView(Context context) {
super(context);
init(context, null, 0);
}
public ArrowView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public ArrowView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
initPaint();
}
private void initPaint() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.RED);
mPaint.setStrokeJoin(Join.ROUND);
mPaint.setStrokeCap(Cap.ROUND);
mPaint.setStrokeWidth(3);
}
public ArrowView setWidth(float width) {
this.mWidth = width;
return this;
}
public ArrowView setHeight(float height) {
this.mHeight = height;
return this;
}
/**
*
* @Title: setAngle
* @Description: 按角度调整箭头方向 0-360
* @param @param angle
* @return ArrowView this
* @throws
*/
public ArrowView setAngle(float angle) {
this.angle = angle;
invalidate();
return this;
}
/**
*
* @Title: setDirection
* @Description: 调整箭头方向 LEFT,RIGHT,UP,DOWN
* @param @param direction
* @return ArrowView this
* @throws
*/
public ArrowView setDirection(int direction) {
this.angle = direction;
invalidate();
return this;
}
public ArrowView setDepth(float depth){
this.mDepth = depth;
invalidate();
return this;
}
private void getViewAttr() {
mWidth = getWidth();
mHeight = getHeight();
mPadding = getPaddingLeft();
}
private void drawArrow(Canvas canvas) {
getViewAttr();
float diameter = mWidth > mHeight ? mHeight : mWidth;// 直径
RectF rf = new RectF(0, 0, diameter, diameter);
float left = (mWidth - diameter) / 2;
float top = (mHeight - diameter) / 2;
rf.offsetTo(left, top);// 绘制区域移至控件中间,并且填充宽、高中较窄的边
if (mPadding > 0 && mPadding * 2 < diameter) {
rf.inset(mPadding, mPadding);
}
Path path = new Path();
path.moveTo(rf.left + rf.width() / 2, rf.top);
path.lineTo(rf.left + rf.width() / 2
+ calTriangleSileLength(rf.width()) / 2,
rf.top + 3 * rf.width() / 4);
path.lineTo(rf.left + rf.width() / 2, rf.top+mDepth);//比三角形多一个点
path.lineTo(rf.left + rf.width() / 2
- calTriangleSileLength(rf.width()) / 2,
rf.top + 3 * rf.width() / 4);
canvas.save();
canvas.rotate(angle, rf.left + rf.width() / 2, rf.top + rf.height() / 2);
canvas.drawPath(path, mPaint);
canvas.restore();
}
/**
*
* @Title: calTriangleSileLength
* @Description: 计算三角形边长
* @param @param diameter
* @param @return
* @return float
* @throws
*/
private float calTriangleSileLength(float diameter) {
return (float) (2 * Math.sqrt(Math.pow(diameter / 2, 2)
- Math.pow(diameter / 4, 2)));
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawArrow(canvas);
}
}