android 自定义箭头控件

来源:互联网 发布:filco机械键盘 mac 编辑:程序博客网 时间:2024/06/05 20:57

 

上一篇是三角形,这回变箭头,很相似。。。

public class ArrowView extends ImageView {private Paint mPaint;private float angle;// 旋转角度oprivate 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)));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawArrow(canvas);}}


 

 

 

 

 

 

原创粉丝点击