最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義模擬時鐘控件

 更新時間:2022年01月13日 08:24:31   作者:鳳洋  
這篇文章主要為大家詳細介紹了Android自定義模擬時鐘控件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>

本文實例為大家分享了Android自定義模擬時鐘控件的具體代碼,供大家參考,具體內(nèi)容如下

自定義view—透明模擬時鐘顯示

項目中要用到模擬時鐘的顯示,查了一些資料根據(jù)自己的需要進行了自定義view

思路:重寫view,1.根據(jù)控件的寬高進行獲取模擬時鐘的半徑大小。2.重寫onDraw方法,將畫布進行不同角度的旋轉(zhuǎn)進行繪制表盤 圓心 刻度 指針

這里就直接上代碼了

自定義的TimeClockView:

package com.eq.viewdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;

import java.util.Calendar;

/**
?* Created by pc on 2017/3/29.
?*/
public class TimeClockView extends View {
? ? private int width;
? ? private int height;
? ? private Paint mPaintLine;
? ? private Paint mPaintCircle;
? ? private Paint mPaintHour;
? ? private Paint mPaintMinute;
? ? private Paint mPaintSec;
? ? private TextPaint mPaintText;
? ? private Calendar mCalendar;
? ? public static final int START_ONDRAW = 0X23;

? ? //每隔一秒,在handler中調(diào)用一次重新繪制方法
? ? private Handler handler = new Handler() {
? ? ? ? @Override
? ? ? ? public void handleMessage(Message msg) {

? ? ? ? ? ? switch (msg.what) {
? ? ? ? ? ? ? ? case START_ONDRAW:
? ? ? ? ? ? ? ? ? ? mCalendar = Calendar.getInstance();
? ? ? ? ? ? ? ? ? ? invalidate();//告訴UI主線程重新繪制
? ? ? ? ? ? ? ? ? ? handler.sendEmptyMessageDelayed(START_ONDRAW, 1000);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? };

? ? public TimeClockView(Context context) {
? ? ? ? super(context);
? ? }

? ? public TimeClockView(Context context, AttributeSet attrs) {
? ? ? ? super(context, attrs);

? ? ? ? mCalendar = Calendar.getInstance();

? ? ? ? mPaintLine = new Paint();
? ? ? ? mPaintLine.setColor(Color.GREEN);
? ? ? ? mPaintLine.setStrokeWidth(2);
? ? ? ? mPaintLine.setAntiAlias(true);//設置是否抗鋸齒
? ? ? ? mPaintLine.setStyle(Paint.Style.STROKE);//設置繪制風格

? ? ? ? mPaintCircle = new Paint();
? ? ? ? mPaintCircle.setColor(Color.RED);//設置顏色
? ? ? ? mPaintCircle.setStrokeWidth(2);//設置線寬
? ? ? ? mPaintCircle.setAntiAlias(true);//設置是否抗鋸齒
? ? ? ? mPaintCircle.setStyle(Paint.Style.FILL);//設置繪制風格

? ? ? ? mPaintText = new TextPaint();
? ? ? ? mPaintText.setColor(Color.BLUE);
? ? ? ? mPaintText.setStrokeWidth(5);
? ? ? ? mPaintText.setTextAlign(Paint.Align.CENTER);
? ? ? ? mPaintText.setTextSize(30);

? ? ? ? mPaintHour = new Paint();
? ? ? ? mPaintHour.setStrokeWidth(6);
? ? ? ? mPaintHour.setColor(Color.BLUE);
? ? ? ? mPaintHour.setAntiAlias(true);

? ? ? ? mPaintMinute = new Paint();
? ? ? ? mPaintMinute.setStrokeWidth(4);
? ? ? ? mPaintMinute.setColor(Color.BLUE);
? ? ? ? mPaintMinute.setAntiAlias(true);

? ? ? ? mPaintSec = new Paint();
? ? ? ? mPaintSec.setStrokeWidth(2);
? ? ? ? mPaintSec.setColor(Color.BLUE);
? ? ? ? mPaintSec.setAntiAlias(true);

? ? ? ? handler.sendEmptyMessage(START_ONDRAW);//向handler發(fā)送一個消息,讓它開啟重繪
? ? }

? ? @Override
? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
? ? ? ? super.onMeasure(widthMeasureSpec, heightMeasureSpec);
? ? ? ? width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
? ? ? ? height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
? ? ? ? setMeasuredDimension(width, height);
? ? }

? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? super.onDraw(canvas);

? ? ? ? int circleRadius ; //模擬時鐘的圓半徑大小
? ? ? ? if (width > height) {
? ? ? ? ? ? circleRadius = height / 2 -10;
? ? ? ? } else {
? ? ? ? ? ? circleRadius = width / 2 -10;
? ? ? ? }
? ? ? ? //畫出圓中心
? ? ? ? canvas.drawCircle(width / 2, height / 2, 5, mPaintCircle);
? ? ? ? //依次旋轉(zhuǎn)畫布,畫出每個刻度和對應數(shù)字
? ? ? ? for (int i = 1; i <= 60; i++) {
? ? ? ? ? ? canvas.save();//保存當前畫布
? ? ? ? ? ? if (i % 5 == 0) {
? ? ? ? ? ? ? ? //將畫布進行以圓心以固定的角度旋轉(zhuǎn)進行旋轉(zhuǎn)
? ? ? ? ? ? ? ? canvas.rotate(360 / 60 * i, width / 2, height / 2);
? ? ? ? ? ? ? ? //設置字體大小,這里是以圓半徑的十分之一大小
? ? ? ? ? ? ? ? mPaintText.setTextSize(circleRadius / 10);
? ? ? ? ? ? ? ? //如果繪制對應的數(shù)字時只進行一次旋轉(zhuǎn)是不能達到目標的,需要再次以書寫文字的地方在進行反向旋轉(zhuǎn)這樣寫出來的就是正向的
? ? ? ? ? ? ? ? canvas.rotate(-360 / 60 * i, width / 2, height / 2 - circleRadius+5);
? ? ? ? ? ? ? ? canvas.drawText("" + i / 5, width / 2, height / 2 - circleRadius+circleRadius / 20 , mPaintText);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? canvas.rotate(360 / 60 * i, width / 2, height / 2);
? ? ? ? ? ? ? ? //左起:起始位置x坐標,起始位置y坐標,終止位置x坐標,終止位置y坐標,畫筆(一個Paint對象)
? ? ? ? ? ? ? ? canvas.drawCircle(width/2,height/2-circleRadius,2,mPaintCircle);
? ? ? ? ? ? }
? ? ? ? ? ? canvas.restore();
? ? ? ? }

? ? ? ? int minute = mCalendar.get(Calendar.MINUTE);//得到當前分鐘數(shù)
? ? ? ? int hour = mCalendar.get(Calendar.HOUR);//得到當前小時數(shù)
? ? ? ? int sec = mCalendar.get(Calendar.SECOND);//得到當前秒數(shù)
? ? ? ? String time;
? ? ? ? if (sec < 10 && hour < 10 && minute < 10) { //都小于10
? ? ? ? ? ? time = "0" + hour + ":0" + minute + ":0" + sec; //02:02:02
? ? ? ? } else if (sec < 10 && hour < 10 && minute > 9) {//分鐘大于9
? ? ? ? ? ? time = "0" + hour + ":" + minute + ":0" + sec; //02:12:02
? ? ? ? } else if (sec > 9 && hour < 10 && minute < 10) {//秒大于9
? ? ? ? ? ? time = "0" + hour + ":0" + minute + ":" + sec; //02:02:12
? ? ? ? } else if (sec < 10 && hour > 9 && minute < 10) {//時大于9
? ? ? ? ? ? time = hour + ":0" + minute + ":0" + sec; //12:02:02
? ? ? ? } else if (sec < 10 && hour > 9 && minute > 9) {//時分于9
? ? ? ? ? ? time = hour + ":" + minute + ":0" + sec; //12:12:02
? ? ? ? } else if (sec > 9 && hour > 9 && minute < 10) {//時秒大于9
? ? ? ? ? ? time = hour + ":0" + minute + ":" + sec; //12:02:12
? ? ? ? } else if (sec > 9 && hour < 10 && minute > 9) {//分秒大于9
? ? ? ? ? ? time = "0" + hour + ":" + minute + ":" + sec; //02:12:12
? ? ? ? } else {
? ? ? ? ? ? time = hour + ":" + minute + ":" + sec; //12:12:12
? ? ? ? }
? ? ? ? //繪制中心下方的時間顯示
? ? ? ? mPaintText.setTextSize(circleRadius / 10 * 2);
? ? ? ? canvas.save();
? ? ? ? canvas.drawText(time, width / 2, height / 2 + circleRadius / 10 * 4, mPaintText);

? ? ? ? //繪制時分秒相應的指針
? ? ? ? float minuteDegree = minute / 60f * 360;//得到分針旋轉(zhuǎn)的角度
? ? ? ? canvas.save();
? ? ? ? canvas.rotate(minuteDegree, width / 2, height / 2);
? ? ? ? canvas.drawLine(width / 2, height / 2 - circleRadius + circleRadius / 3, width / 2, height / 2 + circleRadius / 6, mPaintMinute);
? ? ? ? canvas.restore();

? ? ? ? float hourDegree = (hour * 60 + minute) / 12f / 60 * 360;//得到時鐘旋轉(zhuǎn)的角度
? ? ? ? canvas.save();
? ? ? ? canvas.rotate(hourDegree, width / 2, height / 2);
? ? ? ? canvas.drawLine(width / 2, height / 2 - circleRadius + circleRadius / 2, width / 2, height / 2 + circleRadius / 9, mPaintHour);
? ? ? ? canvas.restore();

? ? ? ? float secDegree = sec / 60f * 360;//得到秒針旋轉(zhuǎn)的角度
? ? ? ? canvas.save();
? ? ? ? canvas.rotate(secDegree, width / 2, height / 2);
? ? ? ? canvas.drawLine(width / 2, height / 2 - circleRadius + 2, width / 2, height / 2 + circleRadius / 4, mPaintSec);
? ? ? ? canvas.restore();

? ? }
}

在布局中進行調(diào)用

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
? ? xmlns:tools="http://schemas.android.com/tools"
? ? android:layout_width="match_parent"
? ? android:layout_height="match_parent"
? ? tools:context="com.eq.viewdemo.MainActivity">


? ?<com.eq.viewdemo.TimeClockView
? ? ? ?android:layout_width="match_parent"
? ? ? ?android:layout_height="match_parent"
? ? ? ?android:background="#f99"/>

</RelativeLayout>

到此自定義的模擬時鐘就完成了,希望對有需要的朋友起到幫助。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 淺析Android加載字體包及封裝的方法

    淺析Android加載字體包及封裝的方法

    這篇文章主要介紹了Android加載字體包及封裝的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 老生常談android中的事件傳遞和處理機制

    老生常談android中的事件傳遞和處理機制

    下面小編就為大家?guī)硪黄仙U刟ndroid中的事件傳遞和處理機制。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android 夜間模式的實現(xiàn)代碼示例

    Android 夜間模式的實現(xiàn)代碼示例

    本篇文章主要介紹了Android 夜間模式的實現(xiàn)代碼示例,實現(xiàn)能夠根據(jù)不同的設定,呈現(xiàn)不同風格的界面給用戶,有興趣的可以了解一下。
    2017-03-03
  • Android獲取assets文件夾中的數(shù)據(jù)并寫入SD卡示例

    Android獲取assets文件夾中的數(shù)據(jù)并寫入SD卡示例

    這篇文章主要介紹了Android獲取assets文件夾中的數(shù)據(jù)并寫入SD卡示例,對初學Android開發(fā)的朋友來說是一個很實用的功能,需要的朋友可以參考下
    2014-07-07
  • Android三級緩存原理講解

    Android三級緩存原理講解

    今天小編就為大家分享一篇關于Android三級緩存原理講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Android DialogUtils彈出窗工具類詳解

    Android DialogUtils彈出窗工具類詳解

    這篇文章主要為大家詳細介紹了Android DialogUtils彈出窗工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • android實現(xiàn)多點觸摸應用

    android實現(xiàn)多點觸摸應用

    這篇文章主要為大家詳細介紹了android實現(xiàn)多點觸摸應用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android中點擊按鈕啟動另一個Activity及Activity之間傳值問題

    Android中點擊按鈕啟動另一個Activity及Activity之間傳值問題

    這篇文章主要介紹了Android中點擊按鈕啟動另一個Activity及Activity之間傳值問題,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • RadioGroup實現(xiàn)單選框的多行排列

    RadioGroup實現(xiàn)單選框的多行排列

    這篇文章主要為大家詳細介紹了RadioGroup實現(xiàn)單選框的多行排列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Eclipse+ADT+Android SDK搭建安卓開發(fā)環(huán)境的實現(xiàn)步驟

    Eclipse+ADT+Android SDK搭建安卓開發(fā)環(huán)境的實現(xiàn)步驟

    這篇文章主要介紹了Eclipse+ADT+Android SDK搭建安卓開發(fā)環(huán)境的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論

长治市| 金川县| 若尔盖县| 凤凰县| 布尔津县| 桂平市| 林州市| 太湖县| 那坡县| 玉山县| 河间市| 睢宁县| 博客| 怀柔区| 萍乡市| 同仁县| 丰台区| 辽宁省| 尚志市| 集贤县| 孝感市| 中西区| 苍溪县| 登封市| 交城县| 乳山市| 寿阳县| 霍邱县| 东方市| 绍兴县| 红河县| 和静县| 长子县| 盐城市| 拉萨市| 故城县| 株洲县| 类乌齐县| 读书| 车险| 福海县|