自定义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 }}
参考别人扇形按钮,进行重新绘图行程的,代码中还有部分瑕疵。不够完善
阅读全文
0 0
- 自定义View圆盘遥控器
- 自定义圆盘式view
- 自定义View 遥控器
- 仿遥控器菜单圆盘
- 自定义View实战:空调遥控器
- Android自定义View实战---圆盘温度计
- 自定义View实现空调遥控器切换度数
- 自定义View实现空调遥控器切换度数
- Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮
- Android自定义View圆盘滑动控件(已适配多种分辨率)
- android 自定义view实现类似圆盘抽奖的效果
- 自定义view-仿支付宝芝麻分圆盘
- android自定义圆盘时钟
- 自定义View______绘制圆盘
- 自定义逐格走旋转圆盘
- Android_自定义遥控器按钮
- 圆盘
- 圆盘
- C++中随机函数rand()和srand()的用法
- [LeetCode]203. Remove Linked List Elements
- 80x86的指令系统(一)
- nginx静态资源服务器简单配置
- JSP 标准标签库(JSTL)--简介
- 自定义View圆盘遥控器
- C/C++中static关键字详解
- LeetCode 110. Balanced Binary Tree
- noip数据结构与算法 之 基础小算法 2 二维前缀和维护
- android 7.0单选项dialog
- 编写java程序151条建议读书笔记(11)
- px4学习
- htaccess文件上传拿shell
- 51nod:1118 机器人走方格(排列组合+逆元)