日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

android自定義可拖拽的儀表盤

瀏覽:28日期:2022-09-18 13:18:20

本文實例為大家分享了android自定義可拖拽的儀表盤的具體代碼,供大家參考,具體內容如下

因為項目最近需要用到儀表盤,又不想使用之前使用的背景圖的方式。主要是想自己寫一點代碼。覺得繪制要比圖片好。于是有了下面這張圖:

android自定義可拖拽的儀表盤

面從弧度,刻度,文字,指針都是canvas繪制出來的。

/** * Created by xulc on 2018/7/18. */public class DashboardView extends View { private int minWidthDP = 200; private int minHeightDP = 100; private Paint arcPaint,arcInnerPaint,linePaint,textPaint; private int arcColor = Color.parseColor('#0096ff'); //外層弧形顏色 private int arcInnerColor = Color.parseColor('#FFFFFFFF'); //內層弧形顏色 private int lineColor = Color.parseColor('#333333'); //線條顏色 private int pointerColor = Color.parseColor('#439AFF'); //指針顏色 private int arcWidthDP = 1; private RectF arcRectF,arcInnerRectF; private int widthDash = 0;//表盤的寬度 private int mwidth =0; private int mheight = 0; private float shortlineLength = 0 ,longlineLength = 0; //線的長度 private Path path = new Path(); private Path pointerPath = new Path(); //指針繪制路徑 private Region pointerRegion = new Region(); //指針區(qū)域 private RectF rectF = new RectF(); private boolean isChoosePointer = false; private int mdegree = 0; public DashboardView(Context context) {this(context,null); } public DashboardView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initPaint(); } //初始化相關資源 private void initPaint() {arcPaint = new Paint();arcPaint.setColor(arcColor);arcPaint.setAntiAlias(true);arcPaint.setStrokeCap(Paint.Cap.SQUARE);arcPaint.setStrokeWidth(1);arcPaint.setStyle(Paint.Style.FILL);arcInnerPaint = new Paint();arcInnerPaint.setColor(arcInnerColor);arcInnerPaint.setAntiAlias(true);arcInnerPaint.setStrokeCap(Paint.Cap.SQUARE);arcInnerPaint.setStrokeWidth(1);arcInnerPaint.setStyle(Paint.Style.FILL);linePaint = new Paint();linePaint.setColor(lineColor);linePaint.setAntiAlias(true);linePaint.setStrokeCap(Paint.Cap.SQUARE);linePaint.setStrokeWidth(arcWidthDP);linePaint.setStyle(Paint.Style.FILL);textPaint = new Paint();textPaint.setColor(lineColor);textPaint.setAntiAlias(true);linePaint.setStrokeCap(Paint.Cap.SQUARE);linePaint.setStrokeWidth(arcWidthDP);linePaint.setStyle(Paint.Style.STROKE);textPaint.setTextAlign(Paint.Align.LEFT);textPaint.setTextSize(30);arcRectF = new RectF();arcInnerRectF = new RectF(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);if(widthSize < DensityUtil.dip2px(getContext(),minWidthDP)||heightSize < DensityUtil.dip2px(getContext(),minHeightDP)){ widthSize = DensityUtil.dip2px(getContext(),minWidthDP); heightSize = DensityUtil.dip2px(getContext(),minHeightDP);}if(widthSize/2 != heightSize){ heightSize = widthSize/2;}setMeasuredDimension(widthSize,heightSize + 50);arcRectF.left = 0;arcRectF.bottom = heightSize*2;arcRectF.right = widthSize;arcRectF.top = 0; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);widthDash = DensityUtil.dip2px(getContext(),50);arcInnerRectF.left = widthDash;arcInnerRectF.bottom = arcRectF.bottom - widthDash;arcInnerRectF.right = arcRectF.bottom -widthDash;arcInnerRectF.top = widthDash;shortlineLength = widthDash/7;longlineLength = widthDash/5;mwidth = getWidth();mheight = getHeight() - 50;Log.d('xulc','mheight----->'+mheight);Log.d('xulc','arcRectF.bottom----->'+arcRectF.bottom); } @Override protected void onDraw(Canvas canvas) {arcPaint.setColor(arcColor);canvas.drawArc(arcRectF,180,180,true,arcPaint); //繪制外弧形canvas.drawArc(arcInnerRectF,180,180,true,arcInnerPaint); //繪制內部弧形canvas.save();drawScale(canvas); //繪制刻度canvas.restore();drawText(canvas); //繪制文本drawPointer(canvas,mdegree); //繪制指針 } private int mradius = 50; //繪制指針 private void drawPointer(Canvas canvas,float degree){pointerPath.reset();if(isChoosePointer){ arcPaint.setColor(pointerColor);}pointerPath.reset();pointerPath.moveTo((float)( mwidth/2 - mradius*Math.sin(degree/180f*Math.PI)),(float)( mheight + mradius*Math.cos(degree/180f*Math.PI))); //下切點pointerPath.lineTo(mwidth/2 - (float) Math.cos(degree/180f*Math.PI)*(mheight - widthDash - longlineLength -mradius),mheight - (float) Math.sin(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-mradius));pointerPath.lineTo((float)( mwidth/2 + mradius*Math.sin(degree/180f*Math.PI)),(float)( mheight - mradius*Math.cos(degree/180f*Math.PI)));pointerPath.close();pointerPath.computeBounds(rectF,true);pointerRegion.setPath(pointerPath,new Region((int) rectF.left,(int) rectF.top,(int) rectF.right,(int) rectF.bottom));canvas.drawPath(pointerPath,arcPaint); //path轉化為Region區(qū)域,方便判斷用戶點擊的位置path.reset();arcPaint.setColor(arcColor);path.addCircle(mwidth/2,mheight,mradius, Path.Direction.CW);canvas.drawPath(path,arcPaint);textPaint.setTextAlign(Paint.Align.CENTER);canvas.drawText(''+mdegree,mwidth/2,mheight,textPaint); } //設置度數 public void setDegree(int degree){if(0<=degree && degree<=180){ mdegree = degree; invalidate();} } //觸摸事件 @Override public boolean onTouchEvent(MotionEvent event) {float startx ,starty;if(event.getAction()==MotionEvent.ACTION_DOWN){ startx = event.getX(); starty = event.getY(); if(pointerRegion.contains((int) startx,(int) starty)){ //在其中isChoosePointer =true;invalidate();return true; //消費當前事件,否則不會繼續(xù)分發(fā)后續(xù)事件 } return false;}else if(event.getAction()==MotionEvent.ACTION_MOVE){ if(isChoosePointer){float x = event.getX(); float y = event.getY();if(y <= mheight && x!=mwidth/2){ double degree= Math.atan2((mheight-y) ,(mwidth/2 - x)); setDegree((int) (degree/Math.PI*180));}else{ if(y > mheight&& x < mwidth/2){ //說明滑到下面了setDegree(0); }else if(y > mheight&& x > mwidth/2){setDegree(180); }}return true; }else{return false; }}else if(event.getAction()==MotionEvent.ACTION_UP||event.getAction()==MotionEvent.ACTION_CANCEL){ isChoosePointer =false; invalidate(); return true;}return super.onTouchEvent(event); } //繪制文字 private void drawText(Canvas canvas) {textPaint.setTextAlign(Paint.Align.LEFT);for(int i=0;i<=6;i++){ int degree = i*30; float textWidth = textPaint.measureText(''+degree); if(degree ==0){canvas.drawText('' + degree,mwidth/2 - (float) Math.cos(degree/180f*Math.PI)*(mheight - widthDash - longlineLength -10) - textWidth/2,mheight - (float) Math.sin(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-10)+7,textPaint); } //向右邊移動7個像素 向下邊移動7個像素 else if(degree == 30){ canvas.drawText('' + degree,mwidth/2 - (float) Math.cos(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-10) - textWidth/2,mheight - (float) Math.sin(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-10)+7 ,textPaint); }else if(degree ==60){canvas.drawText('' + degree,mwidth/2 - (float) Math.cos(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-10) - textWidth/2,mheight - (float) Math.sin(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-10)+7 ,textPaint); }else if(degree ==90){canvas.drawText('' + degree,mwidth/2 - (float) Math.cos(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-10) - textWidth/2,mheight - (float) Math.sin(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-10)+7 ,textPaint); }else{canvas.drawText('' + degree,mwidth/2 - (float) Math.cos(degree/180f*Math.PI)*(mheight - widthDash - longlineLength - 10) - textWidth,mheight - (float) Math.sin(degree/180f*Math.PI)*(mheight - widthDash - longlineLength-10)+7 ,textPaint); }} } //繪制刻度 private void drawScale(Canvas canvas){for(int i=0;i<=36;i++){ //180角度,30度一個長線 0 30 60 90 120 150 180 5條小線 5度一個小線 if(i%6==0){//長線canvas.drawLine(widthDash,mheight,widthDash + longlineLength ,mheight,linePaint); }else{ //短線canvas.drawLine(widthDash,mheight,widthDash + shortlineLength ,mheight,linePaint); } canvas.rotate(5,mwidth/2,mheight);} }}

整體代碼差不多就這樣,代碼中詳盡的注釋。代碼基本上都在這了,就不上傳git了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品网在线观看| 久久久久午夜电影| 欧美午夜不卡| 国产91一区| 免费精品国产| 欧美亚洲激情| 成人av二区| 日韩亚洲国产欧美| 国产模特精品视频久久久久| 男女激情视频一区| 一区在线观看| 蜜臀国产一区二区三区在线播放| 在线看片日韩| 日本精品一区二区三区在线观看视频| 日韩精品导航| 久久一区精品| 亚洲综合电影| 欧美日韩精品一本二本三本 | 国产精品毛片视频| 精品国产亚洲一区二区三区大结局| 精品国产亚洲日本| 亚洲伦乱视频| 国产视频一区欧美| 亚洲婷婷丁香| 久久成人高清| 国产欧美精品| 91麻豆精品激情在线观看最新| 国产日韩1区| 国产成人精选| 亚洲午夜av| 亚洲一级淫片| 久久av综合| 欧美激情福利| 久久婷婷亚洲| 综合一区二区三区| 欧美精品不卡| 99精品在线免费在线观看| 亚洲欧美日韩国产综合精品二区 | 国产亚洲一区在线| 天海翼亚洲一区二区三区| 国产精品第十页| 婷婷成人在线| 日本视频在线一区| 日韩国产网站| 日韩亚洲精品在线观看| 精品九九久久| 人人精品人人爱| 精品久久精品| 亚洲欧美日韩国产一区| 久久亚洲人体| 99精品综合| 青草国产精品| 九色porny丨国产首页在线| 亚洲一区欧美| 超级白嫩亚洲国产第一| 在线视频亚洲欧美中文| 中文在线а√在线8| 亚洲91在线| 色在线视频观看| 亚州av一区| 亚洲国产福利| 日韩精品第二页| 国产一区欧美| 国产日产一区| 蜜乳av另类精品一区二区| 国产精品啊v在线| 国产亚洲一区在线| 国产成人精选| 青青青国产精品| 亚洲电影在线| 久久中文精品| 日韩精品免费观看视频| 婷婷激情图片久久| 91视频精品| 国产日韩欧美三区| 亚洲一区二区成人| www.51av欧美视频| 国产精品中文字幕亚洲欧美| 性欧美精品高清| 日韩免费久久| 国产欧美日韩一级| 黑丝一区二区三区| 精品视频网站| 亚洲精品伊人| 亚洲免费激情| 日韩精品诱惑一区?区三区| 国产美女亚洲精品7777| 在线看片日韩| 好看的亚洲午夜视频在线| 偷拍精品精品一区二区三区| 久久精品欧洲| 国产精品自拍区| 日本一区中文字幕| 丝袜美腿亚洲一区二区图片| 日韩久久电影| 你懂的亚洲视频| 亚洲bt欧美bt精品777| 性欧美长视频| 99视频一区| 欧美日韩第一| 国产综合精品| 日韩成人综合| 成人精品视频| 久久精品午夜| 麻豆精品一区二区综合av| 日韩国产欧美在线播放| 亚洲一区二区小说| 天堂网在线观看国产精品| 国产aⅴ精品一区二区四区| 99成人在线视频| 欧美三级第一页| 亚洲少妇一区| 亚洲黄页一区| 久久中文视频| 国产 日韩 欧美一区| 久久这里只有精品一区二区| 国产精品激情| 国产精品探花在线观看| 国产区精品区| 欧美天堂一区| 日本中文字幕一区二区| 日韩精品亚洲专区| 日韩av中文字幕一区二区| 日产欧产美韩系列久久99| 亚洲三级网址| 中文字幕亚洲精品乱码| 蜜臀va亚洲va欧美va天堂| 亚洲区第一页| 亚洲69av| 久久国产乱子精品免费女| 国产乱人伦丫前精品视频| 国产麻豆一区二区三区| 牛牛精品成人免费视频| jizzjizz中国精品麻豆| 久久久久99| 一区在线视频观看| 石原莉奈一区二区三区在线观看| 在线亚洲一区| 美女尤物久久精品| 91精品国产自产精品男人的天堂 | 久久一区视频| 97久久精品| 国产精品久久国产愉拍| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 蜜臀久久99精品久久久久宅男 | 欧美国产极品| 91嫩草亚洲精品| 久久久777| 妖精视频成人观看www| 日本亚洲欧美天堂免费| 久久wwww| 99tv成人| 一本一道久久a久久| 国产欧美三级| 日韩美女一区二区三区在线观看| 亚洲精品在线观看91| 免费久久99精品国产自在现线| 亚洲精品伊人| 精品久久91| 欧美a级一区| 四虎在线精品| 精品国产亚洲一区二区在线观看| 久久精品播放| 日韩欧美激情| 国产精品精品| 久久国产精品99国产| 欧美一区久久| 日韩欧美三区| 成人在线超碰| 欧美有码在线| 综合日韩av| 黄色免费成人| 欧美日韩亚洲一区三区| 亚洲国产欧美日本视频| 视频在线观看一区| 国产精品激情电影| 神马日本精品| 日韩欧乱色一区二区三区在线| 国产一区二区三区四区五区| 黄色亚洲精品| 国产黄色精品| 亚洲免费在线| 国产在线观看91一区二区三区 | 日韩精品电影一区亚洲| 国产成人久久精品麻豆二区| 在线综合亚洲| 国产成人精品一区二区免费看京 | 免费成人在线影院| 欧美激情另类| 日韩高清三区| 99精品综合| 国产精品777777在线播放| 亚洲午夜黄色| 精品视频网站| 日本aⅴ亚洲精品中文乱码| 日韩成人三级| 日韩成人av影视| 秋霞影视一区二区三区| 亚洲日本免费电影| 国产精品久久久久av电视剧|