自定义一个简单的圆形菜单
来源:互联网 发布:华为加班 知乎 编辑:程序博客网 时间:2024/06/06 00:07
我们先看下效果图
按下去的时候会改变状态。
具体的代码。
import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import com.qiang.circlemenu.R;/** * Created by qiang on 2017/9/14 0014. */public class CircleMenuView extends View { private int[] array = {getResources().getColor(R.color.c1), getResources().getColor(R.color.c2), getResources().getColor(R.color.c3), getResources().getColor(R.color.c4)}; private int color = getResources().getColor(R.color.back); private Paint rPaint;//文字 private Paint mPaint;//大圆 private Paint mPaint2;//小圆 private Paint paint3; private Rect rT,rL,rR,rB,rC,circle; private Rect mBound;//处理文字居中用的 private int count = -1;//点击的是那个 public CircleMenuView(Context context) { this(context, null); } public CircleMenuView(Context context, AttributeSet attrs) { this(context, attrs, -1); } public CircleMenuView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setColor(color); mPaint.setAntiAlias(true); mPaint.setStrokeWidth(1); mPaint.setStyle(Paint.Style.STROKE); mPaint2 = new Paint(); mPaint2.setColor(getResources().getColor(R.color.cl1)); mPaint2.setAntiAlias(true); mPaint2.setStrokeWidth(2); mPaint2.setStyle(Paint.Style.FILL); paint3 = new Paint(); rPaint = new Paint(); rPaint.setColor(color); rPaint.setTextSize(18); rT = new Rect(); rB = new Rect(); rL = new Rect(); rR = new Rect(); rC = new Rect(); circle = new Rect(); mBound = new Rect(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(300, 300);//这里我把控件的高度写死了 } @Override protected void onDraw(Canvas canvas) { setFX(canvas); mDrawCirle(canvas); } private void setFX(Canvas canvas) {//4个方向的值 int l, t, r, b; int jd = 45; RectF rectF = new RectF(0, 0, 300, 300);// l t r b for (int i = 0; i < 4; i++) { if (count==i) {//如果按压了,改变颜色 paint3.setColor(Color.RED); } else {//否则用默认的 paint3.setColor(array[i]); } canvas.drawArc(rectF, jd, 90, true, paint3);//4个圆弧的位置 jd += 90; } setTText(canvas, 150, 65, "上"); setTText(canvas, 235, 150, "右"); setTText(canvas, 150, 235, "下"); setTText(canvas, 65, 150, "左"); } private void setTText(Canvas canvas, int startx, int starty, String str) { rPaint.getTextBounds(str, 0, str.length(), mBound); float textWidth = rPaint.measureText(str);//文字自己的宽度 float startX = startx - textWidth / 2;//宽度居中 mwidth的一半 - 自己的宽度 Paint.FontMetricsInt fm = rPaint.getFontMetricsInt(); int startY = starty - fm.descent + (fm.bottom - fm.top) / 2;//高度居中 这个公式是网上找的 高度差不多也在这样的算法 canvas.drawText(str, startX, startY, rPaint); } private void mDrawCirle(Canvas canvas) { canvas.drawCircle(150, 150, 150, mPaint);//大圆 canvas.drawCircle(150, 150, 40, mPaint2);//小圆 mDrawTexts(canvas, rPaint);//ok字 } private void mDrawTexts(Canvas canvas, Paint p) {//居中 p.getTextBounds("ok", 0, 1, mBound); float textWidth = p.measureText("ok");//文字自己的宽度 float startX = 300 / 2 - textWidth / 2;//宽度居中 mwidth的一半 - 自己的宽度 Paint.FontMetricsInt fm = p.getFontMetricsInt(); int startY = 300 / 2 - fm.descent + (fm.bottom - fm.top) / 2;//高度居中 这个公式是网上找的 高度差不多也在这样的算法 canvas.drawText("ok", startX, startY, p); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: float x = event.getX(); float y = event.getY(); if (x>=110&&x<=190&&y>25&&y<105) {//上的按压事件 count=2; invalidate();//重绘 } if (x>195&&x<275&&y>110&&y<190){//右 count=3; invalidate(); } if (x>110&&x<190&&y>195&&y<275){//下 count=0; invalidate(); } if (x>25&&x<105&&y>110&&y<190){//左 count=1; invalidate(); } break; case MotionEvent.ACTION_UP://松开取消 count=-1; invalidate(); break; } return true; }}
阅读全文
0 0
- 自定义一个简单的圆形菜单
- 一个简单的自定义View,仿圆形进度条
- 一个自定义的圆形进度条
- 自定义圆形菜单Demo
- Android自定义圆形菜单
- android自定义控件(一):写一个圆形菜单的Layout
- Android一个漂亮的圆形菜单
- Feature开发一(制作一个简单的自定义菜单)
- 圆形自定义ImageView的简单制作
- 简单的自定义圆形进度条ProgressBar
- 一个漂亮的自定义圆形进度条
- 一个非常好用的自定义圆形控件
- 自定义view 做一个圆形的progress
- 自定义圆形ImageView-简单
- Android 自定义控件实现弹性旋转的圆形菜单
- 一个简单的圆形图片实现
- 一个旋转的圆形的CSS菜单代码
- 一个简单的收缩菜单
- H5解析|“薛之谦的恋爱诊所”这样爆款级的案例是如何炼成的?
- ANSI C标准中几个标准预定义宏
- 错误LNK2005"public: __thiscall已经在 main.obj 中定义
- 得到promise
- 数据挖掘4流程(R VS python)
- 自定义一个简单的圆形菜单
- 从ES6中的extends讲js原型链与继承
- OpenCV离散傅里叶变换(DFT前篇)
- express简介
- webpack 入门指南
- 苹果新机人脸识别有玄机:已婚男士千万别买!啥都藏不住!
- 单反相机镜头选择tips
- MYSQL类型与JAVA类型对应表
- Vue项目使用swiper做轮播图时,异步调用数据时导致图片不能滑动的解决方法