自定义View圆盘遥控器

来源:互联网 发布:linux 查看文件多少行 编辑:程序博客网 时间:2024/04/28 06:35
import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import com.ysten.videoplus.client.R;import com.ysten.videoplus.client.message.MessageEvent;import org.greenrobot.eventbus.EventBus;public class CircleView extends View {    private int circleWidth = 214;//圆环直径    private int circleColor = getResources().getColor(R.color.color_1F1F1F);    private int innerCircleColor = getResources().getColor(R.color.color_1F1F1F);    private int backgroundColor = getResources().getColor(R.color.color_151515);    private Paint paint = new Paint();    int center = 0;    int innerRadius = 0;    private float innerCircleRadius = 0;    //    private float smallCircle = 10;    public Dir dir = Dir.UNDEFINE;    public CircleView(Context context, AttributeSet attributeSet) {        super(context, attributeSet);    }    public CircleView(Context context) {        super(context);    }    public CircleView(Context context, AttributeSet attributeSet, int defStyle) {        super(context, attributeSet, defStyle);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int measuredHeight = measureHeight(heightMeasureSpec);        int measuredWidth = measureWidth(widthMeasureSpec);        setMeasuredDimension(measuredWidth, measuredHeight);        center = getWidth() / 2;//半径        innerRadius = (center - circleWidth + 80);//圆环        innerCircleRadius = center * 17 / 48;//内心圆半径        this.setOnTouchListener(onTouchListener);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        initBackGround(canvas);        drawDirTriangle(canvas, dir);    }    //绘制方向箭头    private void drawDirTriangle(Canvas canvas, Dir dir) {        paint.setColor(innerCircleColor);        paint.setStrokeWidth(1);        paint.setStyle(Paint.Style.FILL);        switch (dir) {            case UP:                drawOnclikColor(canvas, Dir.UP);                break;            case DOWN:                drawOnclikColor(canvas, Dir.DOWN);                break;            case LEFT:                drawOnclikColor(canvas, Dir.LEFT);                break;            case RIGHT:                drawOnclikColor(canvas, Dir.RIGHT);                break;            case CENTER:                drawOnclikColor(canvas, Dir.CENTER);                break;            default:                break;        }        Paint paints = new Paint();        paints.setTextSize(50);//设置字体大小        paints.setColor(getResources().getColor(R.color.white));        canvas.drawText("确认", center - 50, center + 25, paints);        paint.setColor(getResources().getColor(R.color.white));        //上        canvas.drawCircle(center, center - 300, 5, paint);        //下        canvas.drawCircle(center, center + 300, 5, paint);        //左        canvas.drawCircle(80, center, 5, paint);        //右        canvas.drawCircle(2 * center - 80, center, 5, paint);    }    private void drawOnclikColor(Canvas canvas, Dir dir) {        paint.setColor(getResources().getColor(R.color.color_1A1A1A));        paint.setStyle(Paint.Style.STROKE);        paint.setStrokeWidth(215);        switch (dir) {            case UP:                canvas.drawArc(new RectF(center - innerRadius, center - innerRadius, center +                        innerRadius, center + innerRadius), 225, 90, false, paint);                EventBus.getDefault().post(new MessageEvent(MessageEvent.MSG_YKQ_UP));                break;            case DOWN:                canvas.drawArc(new RectF(center - innerRadius, center - innerRadius, center +                        innerRadius, center                        + innerRadius), 45, 90, false, paint);                EventBus.getDefault().post(new MessageEvent(MessageEvent.MSG_YKQ_DOWN));                break;            case LEFT:                canvas.drawArc(new RectF(center - innerRadius, center - innerRadius, center +                        innerRadius, center                        + innerRadius), 135, 90, false, paint);                EventBus.getDefault().post(new MessageEvent(MessageEvent.MSG_YKQ_LEFT));                break;            case RIGHT:                canvas.drawArc(new RectF(center - innerRadius, center - innerRadius, center +                        innerRadius, center                        + innerRadius), -45, 90, false, paint);                EventBus.getDefault().post(new MessageEvent(MessageEvent.MSG_YKQ_RIGHT));                break;            case CENTER:                canvas.drawCircle(center, center, center / 12, paint);                EventBus.getDefault().post(new MessageEvent(MessageEvent.MSG_YKQ_CENTER));                invalidate();                break;            default:                break;        }        paint.setStyle(Paint.Style.FILL);    }    private void initBackGround(Canvas canvas) {        clearCanvas(canvas);        drawBackCircle(canvas);        drawInnerCircle(canvas);    }    private void drawInnerCircle(Canvas canvas) {        paint.setColor(getResources().getColor(R.color.color_1F1F1F));        paint.setStyle(Paint.Style.FILL);        paint.setStrokeWidth(1);        canvas.drawCircle(center, center, innerCircleRadius, paint);    }    private void drawBackCircle(Canvas canvas) {        paint.setColor(circleColor);        paint.setStrokeWidth(circleWidth);        paint.setAntiAlias(true);        paint.setStyle(Paint.Style.STROKE);        canvas.drawCircle(center, center, innerRadius, paint);//绘制圆圈    }    private void clearCanvas(Canvas canvas) {        canvas.drawColor(backgroundColor);    }    //测量高度    private int measureHeight(int measureSpec) {        int specMode = MeasureSpec.getMode(measureSpec);        int specSize = MeasureSpec.getSize(measureSpec);        int result = 0;        if (specMode == MeasureSpec.AT_MOST) {            result = specSize;        } else if (specMode == MeasureSpec.EXACTLY) {            result = specSize;        }        return result;    }    //测量宽度    private int measureWidth(int measureSpec) {        int specMode = MeasureSpec.getMode(measureSpec);        int specSize = MeasureSpec.getSize(measureSpec);        int result = 0;        if (specMode == MeasureSpec.AT_MOST) {            result = getWidth();        } else if (specMode == MeasureSpec.EXACTLY) {            result = specSize;        }        return result;    }    OnTouchListener onTouchListener = new OnTouchListener() {        @Override        public boolean onTouch(View v, MotionEvent event) {            Dir tmp = Dir.UNDEFINE;            switch (event.getAction()) {                case MotionEvent.ACTION_DOWN:                    if ((tmp = checkDir(event.getX(), event.getY())) != Dir.UNDEFINE) {                        dir = tmp;                        invalidate();                    }                    break;                case MotionEvent.ACTION_UP:                    dir = Dir.UNDEFINE;                    invalidate();                    break;            }            return true;        }        private Dir checkDir(float x, float y) {            Dir dir = Dir.UNDEFINE;            if (Math.sqrt(Math.pow(y - center, 2) + Math.pow(x - center, 2)) < innerCircleRadius) {                //中心圆圈内                dir = Dir.CENTER;            } else if (y < x && y + x < 2 * center) {                //向上                dir = Dir.UP;            } else if (y < x && y + x > 2 * center) {                //向右                dir = Dir.RIGHT;            } else if (y > x && y + x < 2 * center) {                //向左                dir = Dir.LEFT;            } else if (y > x && y + x > 2 * center) {                //向下                dir = Dir.DOWN;            } else {                dir = Dir.UNDEFINE;            }            return dir;        }    };    public enum Dir {        UP, DOWN, LEFT, RIGHT, CENTER, UNDEFINE    }}
参考别人扇形按钮,进行重新绘图行程的,代码中还有部分瑕疵。不够完善
 
原创粉丝点击