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

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

android自定義可拖拽的儀表盤

瀏覽:25日期: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(); //指針區域 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區域,方便判斷用戶點擊的位置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; //消費當前事件,否則不會繼續分發后續事件 } 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久久,三上悠亚国产精品一区二区三区
国产精品成人3p一区二区三区| 亚洲精品极品| 日韩高清国产一区在线| 在线亚洲一区| 视频福利一区| 久久免费国产| 日本韩国欧美超级黄在线观看| 成人在线视频中文字幕| 精品视频一区二区三区在线观看| 国产视频网站一区二区三区| 日韩精品一级| 日本视频一区二区| 国产日产一区| 麻豆91精品91久久久的内涵| 欧美精品成人| 国产精品99久久精品| 高清在线一区| 久久免费国产| 免费国产自久久久久三四区久久| 日韩一区二区三区免费| 三上悠亚国产精品一区二区三区| 久久久久久久久99精品大| 色综合www| 蜜桃tv一区二区三区| 婷婷激情图片久久| 美女精品在线| 日韩av不卡在线观看| 国产精品一区二区中文字幕| 麻豆一区二区99久久久久| 久久97视频| 成人羞羞视频播放网站| 亚洲综合电影一区二区三区| 亚洲欧美网站在线观看| 国产欧美亚洲一区| 麻豆国产欧美日韩综合精品二区| 成人在线黄色| 99精品综合| 在线一区二区三区视频| 国产亚洲电影| sm捆绑调教国产免费网站在线观看 | 国产精品一区二区99| 欧美黄页在线免费观看| 91tv亚洲精品香蕉国产一区| 欧美va亚洲va日韩∨a综合色| 99国产精品久久久久久久成人热 | 在线看片日韩| 久久国产亚洲| 日韩精品一级中文字幕精品视频免费观看 | 91九色综合| 你懂的国产精品永久在线| 日韩欧美三级| 日韩.com| 蜜臀va亚洲va欧美va天堂| 国产精品最新| 91精品一区二区三区综合在线爱| 在线精品福利| 91一区二区三区四区| 午夜宅男久久久| 麻豆一区二区99久久久久| 一区在线观看| 国产精品高潮呻吟久久久久| 九九精品调教| 日韩va亚洲va欧美va久久| 日本在线啊啊| 久久亚洲美女| 国产成年精品| 日韩精品三区四区| 五月激情久久| 国产日韩一区二区三区在线播放| 日韩在线不卡| 日韩av不卡在线观看| 欧美91精品| 精品日产乱码久久久久久仙踪林| 亚洲综合精品| 色综合五月天| 日韩不卡一区二区三区| 伊人久久av| 欧美三区不卡| 亚洲日本在线观看视频| 国产精品国产一区| 亚洲不卡视频| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲欧美网站在线观看| 黑森林国产精品av| 欧美日韩亚洲一区| 国产视频亚洲| 日韩精品一区二区三区免费观影| 国产精品任我爽爆在线播放| 久久一区二区中文字幕| 国产精品一区二区精品| 只有精品亚洲| 亚洲二区三区不卡| 国产乱码午夜在线视频| 国产精品视频一区二区三区四蜜臂 | 色综合视频一区二区三区日韩 | 黄色精品网站| 日本韩国欧美超级黄在线观看| 久久精品国产久精国产爱| 91成人在线精品视频| 久久av在线| 午夜久久久久| 久久国产精品成人免费观看的软件| 精品久久电影| 欧美激情日韩| 久久国产精品色av免费看| 蜜桃久久久久久| 久久久久.com| 国产精品麻豆久久| 久久久久观看| 亚洲性视频在线| 欧美在线综合| 亚洲不卡av不卡一区二区| 国产精品美女午夜爽爽| 欧美综合国产| 亚洲深夜视频| аⅴ资源天堂资源库在线| 欧美亚洲综合视频| 人人精品人人爱| 免费av一区| 天堂网av成人| 久久久国产精品网站| 欧美亚洲自偷自偷| 久久av在线| 精品日韩毛片| 三上悠亚国产精品一区二区三区| 91综合久久爱com| 久久最新视频| 欧美视频二区| 国产伦精品一区二区三区视频| 免费人成精品欧美精品| 国产主播一区| 成人羞羞视频播放网站| 老色鬼精品视频在线观看播放| 国产亚洲精品v| 国产精品av一区二区| 私拍精品福利视频在线一区| 首页国产精品| 精品视频亚洲| 精品久久中文| 亚洲精品美女91| 亚洲精品乱码久久久久久蜜桃麻豆| 尤物网精品视频| 蜜桃成人av| 99热免费精品| 欧美中文日韩| 国产精品女主播一区二区三区| 免费观看日韩电影| 蜜臀久久久99精品久久久久久| 欧美专区在线| 亚洲乱码久久| 亚洲狼人精品一区二区三区| 亚洲精品1区2区| 综合五月婷婷| 中文字幕av亚洲精品一部二部 | 精品国产乱码久久久久久樱花| 日韩高清欧美激情| 日韩va欧美va亚洲va久久| 日本成人精品| 91国内精品| 国产精品一区免费在线| 精品伊人久久| 在线中文字幕播放| 国产精品久久久久久久久妇女| 久久久久久色| 欧美a在线观看| 免费日韩一区二区三区| 久久男人av| 欧美日韩尤物久久| 中文字幕高清在线播放| 日本精品不卡| 狠狠爱成人网| 日韩精品欧美精品| 国产精品极品在线观看| 国产一区二区三区久久久久久久久| 加勒比视频一区| 国产成人精品亚洲线观看| 韩国三级一区| 亚洲午夜av| 日韩av资源网| 黄色网一区二区| 99久久99视频只有精品| 激情欧美亚洲| 三级久久三级久久久| 麻豆传媒一区二区三区| 国产不卡人人| 国产手机视频一区二区| 少妇精品在线| 久久99青青| 欧美gv在线| 日韩福利视频导航| 成人一区而且| 黄色亚洲免费| 欧美三区不卡| 久久精品123| 91九色综合| 日韩久久电影| 一区二区三区网站| 91p九色成人| 三级小说欧洲区亚洲区| 亚洲一区日韩在线|