亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android畫個時鐘玩玩

2020-04-11 11:01:52
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android實現時鐘效果的具體代碼,供大家參考,具體內容如下

先看下最終的效果

 

開始實現

新建一個ClockView集成View

public class ClockView extends View { }

先重寫onMeasure方法,這里要先說一下View的測量模式,一共有三種:

1、EXACTLY

即精確值模式,當我們將控件的layout_width屬性或layout_height屬性指定為具體數值時,比如android:layout_width="100dp",或者指定為math_parent屬性時(占據父View的大小),系統使用的是EXACTLY模式。

2、AT_MOST

即最大值模式,當控件的layout_width屬性或layout_height屬性指定為wrap_content時,控件大小一般隨著控件的子控件或內容的變化而變化,此時控件的尺寸只要不超過父控件允許的最大尺寸即可。

3、UNSPECIFIED

這個屬性比較奇怪――它不指定其大小測量模式,View想多大就多大,通常情況下在繪制自定義View時才會使用。

因為View的onMeasure方法只支持EXACTLY模式,當layout_width和layout_height為wrap_content時,View的大小就顯得很奇怪了,如下圖。

所以我們重寫一下onMeasure方法可以指定View width、height的最小值

 /**  * 當布局為wrap_content時設置默認長寬  * @param widthMeasureSpec  * @param heightMeasureSpec  */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  setMeasuredDimension(measure(widthMeasureSpec), measure(heightMeasureSpec)); } private int measure(int origin){  int result = DEFAULT_MIN_WIDTH;  int specMode = MeasureSpec.getMode(origin);  int specSize = MeasureSpec.getSize(origin);  if(specMode == MeasureSpec.EXACTLY){   result = specSize;  }else{   if(specMode == MeasureSpec.AT_MOST){    result = Math.min(result, specSize);   }  }  return result; }

下面就是最重要的重寫onDraw方法來繪制表盤、刻度、指針……,大致流程如下
1、畫表盤,用drawCircle繪制一個圓作為表盤, 圓心坐標為(getWidth()/2, getHeight()/2),半徑為Math.min(getHeight()/2, getWidth()/2)。

//畫外圓float borderWidth = DEFAULT_BORDER_WIDTH;Paint paintCircle = new Paint();paintCircle.setStyle(Paint.Style.STROKE);paintCircle.setAntiAlias(true);paintCircle.setStrokeWidth(borderWidth);canvas.drawCircle(getWidth() / 2, getHeight() / 2, Math.min(getHeight() / 2, getWidth() / 2) - borderWidth / 2, paintCircle);

2、畫刻度線,在這里我們可以利用一個`canvas.rotate'方法就可以不用計算角度了

//畫刻度線float degreeLength = 0f;Paint paintDegree = new Paint();paintDegree.setAntiAlias(true);for(int i=0;i<60;i++){ if(i % 5 == 0){  paintDegree.setStrokeWidth(6);  degreeLength = DEFAULT_LONG_DEGREE_LENGTH; }else{  paintDegree.setStrokeWidth(3);  degreeLength = DEFAULT_SHORT_DEGREE_LENGTH; } canvas.drawLine(getWidth()/2, Math.abs(getWidth()/2 - getHeight()/2), getWidth()/2, Math.abs(getWidth()/2 - getHeight()/2) + degreeLength, paintDegree); canvas.rotate(360/60, getWidth()/2, getHeight()/2);}

3、畫刻度上的數字

//刻度數字int degressNumberSize = 30;canvas.translate(getWidth() / 2, getHeight() / 2);Paint paintDegreeNumber = new Paint();paintDegreeNumber.setTextAlign(Paint.Align.CENTER);paintDegreeNumber.setTextSize(degressNumberSize);paintDegreeNumber.setFakeBoldText(true);for(int i=0;i<12;i++){ float[] temp = calculatePoint((i+1)*30, r - DEFAULT_LONG_DEGREE_LENGTH - degressNumberSize/2 - 15); canvas.drawText((i+1)+"", temp[2], temp[3] + degressNumberSize/2-6, paintDegreeNumber);}/** * 根據角度和長度計算線段的起點和終點的坐標 * @param angle * @param length * @return */private float[] calculatePoint(float angle, float length){ float[] points = new float[4]; if(angle <= 90f){  points[0] = -(float) Math.sin(angle*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;  points[1] = (float) Math.cos(angle*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;  points[2] = (float) Math.sin(angle*Math.PI/180) * length;  points[3] = -(float) Math.cos(angle*Math.PI/180) * length; }else if(angle <= 180f){  points[0] = -(float) Math.cos((angle-90)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;  points[1] = -(float) Math.sin((angle-90)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;  points[2] = (float) Math.cos((angle-90)*Math.PI/180) * length;  points[3] = (float) Math.sin((angle-90)*Math.PI/180) * length; }else if(angle <= 270f){  points[0] = (float) Math.sin((angle-180)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;  points[1] = -(float) Math.cos((angle-180)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;  points[2] = -(float) Math.sin((angle-180)*Math.PI/180) * length;  points[3] = (float) Math.cos((angle-180)*Math.PI/180) * length; }else if(angle <= 360f){  points[0] = (float) Math.cos((angle-270)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;  points[1] = (float) Math.sin((angle-270)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;  points[2] = -(float) Math.cos((angle-270)*Math.PI/180) * length;  points[3] = -(float) Math.sin((angle-270)*Math.PI/180) * length; } return points;}

4、畫指針

//畫指針Paint paintHour = new Paint();paintHour.setAntiAlias(true);paintHour.setStrokeWidth(15);Paint paintMinute = new Paint();paintMinute.setAntiAlias(true);paintMinute.setStrokeWidth(10);Paint paintSecond = new Paint();paintSecond.setAntiAlias(true);paintSecond.setStrokeWidth(5);Calendar now = Calendar.getInstance();float[] hourPoints = calculatePoint(now.get(Calendar.HOUR_OF_DAY)%12/12f*360, hourPointerLength);canvas.drawLine(hourPoints[0], hourPoints[1], hourPoints[2], hourPoints[3], paintHour);float[] minutePoints = calculatePoint(now.get(Calendar.MINUTE)/60f*360, minutePointerLength);canvas.drawLine(minutePoints[0], minutePoints[1], minutePoints[2], minutePoints[3], paintMinute);float[] secondPoints = calculatePoint(now.get(Calendar.SECOND)/60f*360, secondPointerLength);canvas.drawLine(secondPoints[0], secondPoints[1], secondPoints[2], secondPoints[3], paintSecond);

5、畫圓心

//畫圓心Paint paintCenter = new Paint();paintCenter.setColor(Color.WHITE);canvas.drawCircle(0, 0, 2, paintCenter);最后只要啟動一個無限循環的線程,每隔1秒針重繪一下View就能讓指針動起來了private Thread timeThread = new Thread() { @Override public void run() {  try {   while(true){    updateHandler.sendEmptyMessage(0);    Thread.sleep(1000);   }  } catch (InterruptedException e) {   e.printStackTrace();  } }};private Handler updateHandler = new Handler() { @Override public void handleMessage(Message msg) {  invalidate(); }};

以上就是教大家如何利用Android畫個時鐘的詳細步驟代碼,希望對大家的學習Android軟件編程有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费国产网站| 亚洲欧美国产高清va在线播| 成人国产精品一区| 精品久久久国产| 日韩视频免费在线观看| 国产精品99蜜臀久久不卡二区| 国产精品日韩在线播放| 92看片淫黄大片欧美看国产片| 综合久久五月天| 国产v综合ⅴ日韩v欧美大片| 精品国产成人在线| 欧美激情图片区| 热99精品只有里视频精品| 亚洲欧洲日产国产网站| 97香蕉久久超级碰碰高清版| 这里只有视频精品| 亚洲精品久久久久中文字幕欢迎你| 欧美人在线视频| 2018日韩中文字幕| 久久天天躁狠狠躁夜夜躁2014| 成人久久久久久久| 久久激情五月丁香伊人| 91网站在线免费观看| 亚洲精品一区二区在线| 成人网在线免费观看| 萌白酱国产一区二区| 欧美一区二区大胆人体摄影专业网站| 国产欧美一区二区三区在线看| 亚洲第一级黄色片| 在线国产精品播放| 日韩精品极品视频免费观看| 日本国产欧美一区二区三区| 欧美最猛性xxxx| 国产拍精品一二三| 一区二区在线免费视频| 国产精品狼人色视频一区| www.欧美精品一二三区| 777777777亚洲妇女| 7777免费精品视频| 91精品国产九九九久久久亚洲| 久久精品视频在线播放| 在线观看久久久久久| 欧美三级xxx| 国产91色在线|免| 日韩亚洲国产中文字幕| 国产精品你懂得| 国产极品jizzhd欧美| 国产精品欧美日韩一区二区| 亚洲成人激情在线| 国产噜噜噜噜久久久久久久久| 欧美日本亚洲视频| 成人国产精品久久久久久亚洲| 奇米一区二区三区四区久久| 91精品国产高清| 国产69精品久久久久9999| 97精品视频在线观看| 国产精品第一视频| 第一福利永久视频精品| 国产97人人超碰caoprom| 中文字幕亚洲色图| 国产精品久久一区主播| 草民午夜欧美限制a级福利片| 在线亚洲午夜片av大片| 亚洲国产成人一区| 日韩av毛片网| 成人久久18免费网站图片| 欧美成人精品不卡视频在线观看| 色综合久久悠悠| 欧美成人免费网| 久久av红桃一区二区小说| 2025国产精品视频| 精品久久久久久久久国产字幕| 亚洲国产日韩欧美在线99| 91人人爽人人爽人人精88v| 成人av资源在线播放| 久久资源免费视频| 亚洲成avwww人| 成人深夜直播免费观看| 欧美夫妻性视频| 久久电影一区二区| 青青精品视频播放| 精品国产老师黑色丝袜高跟鞋| 久久久久久综合网天天| 国产精品久久久久久久久免费看| 久久99青青精品免费观看| 韩国美女主播一区| 亚洲日韩中文字幕在线播放| 日韩视频免费观看| 97在线视频免费播放| 欧美中文字幕第一页| 欧美日韩国产专区| 中文字幕视频在线免费欧美日韩综合在线看| 久久精品国产v日韩v亚洲| 午夜精品久久久久久久久久久久| 日韩欧美精品网站| 欧美性猛交xxxx免费看漫画| 国产精选久久久久久| 欧美视频在线观看免费| 国产在线视频2019最新视频| 国产国语videosex另类| 日韩成人高清在线| 久久不射热爱视频精品| 大胆人体色综合| 中日韩午夜理伦电影免费| 日韩高清欧美高清| 国产精品自拍视频| 久久久久国产精品免费| 亚洲第一网站免费视频| 夜夜嗨av一区二区三区四区| 亚洲男人av在线| 亚洲女同精品视频| 日韩av在线不卡| 国产免费观看久久黄| 日韩电影中文字幕| 久久久精品免费| 深夜成人在线观看| 尤物九九久久国产精品的分类| 亚洲美女精品久久| 国产精品视频久| 夜夜狂射影院欧美极品| 国产精品福利在线观看| 91久久精品美女高潮| 国产一区二区日韩精品欧美精品| 欧美自拍视频在线| 日韩在线观看高清| 5252色成人免费视频| 国产亚洲精品综合一区91| 国产成人精品网站| 亚洲人成77777在线观看网| 国产在线a不卡| 国产精品一区二区三区免费视频| 欧美激情第一页xxx| 91在线中文字幕| 在线精品高清中文字幕| 欧美激情手机在线视频| 久久精品99无色码中文字幕| 136fldh精品导航福利| 久久成人国产精品| 97国产真实伦对白精彩视频8| 亚洲国产精彩中文乱码av| 亚洲国产精品成人精品| 成人黄在线观看| 精品亚洲永久免费精品| 成人国产在线视频| 亚洲网在线观看| 亚洲欧洲午夜一线一品| 久久久久中文字幕2018| 国产69久久精品成人| 日韩黄色在线免费观看| 911国产网站尤物在线观看| 97成人在线视频| 欧美精品免费播放| 亚洲精品久久视频| 中文字幕少妇一区二区三区| 青青久久aⅴ北条麻妃| 中文字幕免费精品一区高清| 欧洲美女免费图片一区| 91夜夜未满十八勿入爽爽影院| 91国偷自产一区二区三区的观看方式| 久久久久久亚洲精品| 色综合久久久久久中文网| 欧美亚洲午夜视频在线观看| 精品久久香蕉国产线看观看亚洲| 欧美日韩亚洲天堂|