欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義View 實現(xiàn)鬧鐘喚起播放鬧鐘鈴聲功能

 更新時間:2016年12月07日 09:48:06   作者:堅持做自己喜歡的  
這篇文章主要介紹了Android自定義View 實現(xiàn)鬧鐘喚起播放鬧鐘鈴聲的效果,本文通過實例代碼給大家詳解,需要的朋友可以參考下

先上圖看一下鬧鐘喚期頁面的效果

實現(xiàn)的功能:

1:轉(zhuǎn)動的圖片根據(jù)天氣情況更換

2:轉(zhuǎn)動時間可以設(shè)置,轉(zhuǎn)動結(jié)束,鬧鈴聲音就結(jié)束

3:光圈顏色漸變效果

直接上代碼啦:

package com.yuekong.sirius.extension.customview; 
import android.animation.Animator; 
import android.animation.ValueAnimator; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.graphics.RectF; 
import android.graphics.SweepGradient; 
import android.media.Ringtone; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.util.AttributeSet; 
import android.util.TypedValue; 
import android.view.View; 
import android.view.animation.LinearInterpolator; 
import com.yuekong.sirius.extension.R; 
import com.yuekong.sirius.extension.util.ExtendUtil; 
import java.text.SimpleDateFormat; 
/** 
* Created by Zhongqi.Shao on 2016/12/5. 
*/ 
public class ClockWakeView extends View { 
//最外一層圓的顏色 
private int mOutCircleColor; 
//最外一層圓的半徑 
private int mOutCircleRadis; 
//內(nèi)圓的顏色 
private int mInnerCircleColor; 
//內(nèi)圓的半徑 
private int mInnerCircleRadis; 
private int mWidth; 
private int mHeight; 
//默認寬度 
private final int DEFAULT_WIDTH = dp2px(240); 
//默認高度 
private final int DEFAULT_HEIGHT = dp2px(240); 
//最外圓的默認半徑 
private int DEFAULT_OUT_RADIS = dp2px(120); 
//內(nèi)圓的默認半徑 
private int DeFAULT_INNER_RADIS = dp2px(105); 
//標題距離頂部的默認距離 
private int DEFAULT_TITLE_PADDING_TOP = dp2px(40); 
//最外層圓形的Paint 
private Paint mOutCirclePaint; 
//內(nèi)圓的Paint 
private Paint mInnerCirclePaint; 
//標題Paint 
private Paint mTitlePaint; 
//漸變弧 
private Paint mGradientArcPaint; 
private SweepGradient mSweepGradient; 
//日期時間Paint 
private Paint mTimePaint; 
private Paint mDatePaint; 
//時間分隔的圖片 
private Bitmap mDividerPic; 
//天氣圖片 
private Bitmap mWeatherPic; 
//標題 
private String mTitle; 
//當(dāng)前時間 
private long mCurrentDate = 1481010829605L; 
private SimpleDateFormat mFormat; 
private Ringtone mRingTone; 
//圖片在倒計時幾分鐘內(nèi)走完一個周期 根據(jù)音樂時間來計算 
private long mCountDownTime; 
//倒計時轉(zhuǎn)過的角度 
private float mCurrentAngle; 
//倒計時結(jié)束回調(diào) 
private CountdownFinishListener mCountdownListener; 
private Context mContext; 
public ClockWakeView(Context context) { 
this(context, null); 
mContext = context; 
} 
public ClockWakeView(Context context, AttributeSet attrs) { 
this(context, attrs, 0); 
mContext = context; 
} 
public ClockWakeView(Context context, AttributeSet attrs, int defStyleAttr) { 
super(context, attrs, defStyleAttr); 
mContext = context; 
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SiriusClockWakeView); 
mOutCircleColor = ta.getColor(R.styleable.SiriusClockWakeView_outColor, context.getResources().getColor(R.color.out_circle_color)); 
mOutCircleRadis = (int) ta.getDimension(R.styleable.SiriusClockWakeView_outCircleRadis, DEFAULT_OUT_RADIS); 
mInnerCircleColor = context.getResources().getColor(R.color.inner_circle_color); 
mInnerCircleRadis = DeFAULT_INNER_RADIS; 
mTitle = context.getResources().getString(R.string.clock); 
ta.recycle(); 
initPaint(); 
} 
private void initPaint() { 
mFormat = new SimpleDateFormat("MM月dd日_HH_mm_EEEE"); 
//獲取分隔圖片 
mDividerPic = BitmapFactory.decodeResource(getResources(), R.drawable.time_divider); 
mWeatherPic = BitmapFactory.decodeResource(getResources(), R.drawable.icon_weather); 
//外圓的paint 
mOutCirclePaint = new Paint(); 
mOutCirclePaint.setAntiAlias(true); 
mOutCirclePaint.setStyle(Paint.Style.STROKE); 
mOutCirclePaint.setStrokeWidth(dp2px(5)); 
mOutCirclePaint.setColor(mOutCircleColor); 
//內(nèi)圓的Paint 
mInnerCirclePaint = new Paint(); 
mInnerCirclePaint.setAntiAlias(true); 
mInnerCirclePaint.setStyle(Paint.Style.STROKE); 
mInnerCirclePaint.setStrokeWidth(dp2px(5)); 
mInnerCirclePaint.setColor(mInnerCircleColor); 
//標題的Paint 
mTitlePaint = new Paint(); 
mTitlePaint.setAntiAlias(true); 
mTitlePaint.setStyle(Paint.Style.FILL); 
mTitlePaint.setColor(mContext.getResources().getColor(R.color.nav_highlighted)); 
mTitlePaint.setTextSize(sp2px(14)); 
//時間的Paint 
mTimePaint = new Paint(); 
mTimePaint.setAntiAlias(true); 
mTimePaint.setColor(Color.WHITE); 
mTimePaint.setStyle(Paint.Style.FILL); 
mTimePaint.setTextSize(sp2px(70)); 
//日期的Paint 
mDatePaint = new Paint(); 
mDatePaint.setAntiAlias(true); 
mDatePaint.setColor(Color.WHITE); 
mDatePaint.setStyle(Paint.Style.FILL); 
mDatePaint.setTextSize(sp2px(14)); 
//漸變弧的Paint 
mGradientArcPaint = new Paint(); 
mGradientArcPaint.setAntiAlias(true); 
mGradientArcPaint.setStyle(Paint.Style.STROKE); 
mGradientArcPaint.setStrokeWidth(dp2px(5)); 
mGradientArcPaint.setStrokeCap(Paint.Cap.BUTT); 
mGradientArcPaint.setStrokeJoin(Paint.Join.MITER); 
//設(shè)置漸變的顏色 
int[] colors = {0x00AEA1FF, 0x40AEA1FF, 0xFFAEA1FF, 0xFFAEA1FF}; 
//漸變色 
mSweepGradient = new SweepGradient(0, 0, colors, null); 
mGradientArcPaint.setShader(mSweepGradient); 
} 
@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
mWidth = startMeasure(widthMeasureSpec); 
mHeight = startMeasure(heightMeasureSpec); 
setMeasuredDimension(mWidth, mHeight); 
} 
@Override 
protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 
//移動畫布到中間 
canvas.translate(mWidth / 2, mHeight / 2); 
//繪制最外層的圓形 
drawOutCircle(canvas); 
//繪制內(nèi)圓 
drawInnerCircle(canvas); 
//繪制中間的分隔圖片 
drawDividerPic(canvas); 
//繪制標題 
drawTitle(canvas); 
//繪制時間 
drawDateTime(canvas); 
//繪制旋轉(zhuǎn)圖片 
drawLightArc(canvas); 
} 
private void drawOutCircle(Canvas canvas) { 
canvas.save(); 
canvas.drawCircle(0, 0, mOutCircleRadis, mOutCirclePaint); 
canvas.restore(); 
} 
private void drawInnerCircle(Canvas canvas) { 
canvas.save(); 
canvas.drawCircle(0, 0, mInnerCircleRadis, mInnerCirclePaint); 
canvas.restore(); 
} 
private void drawDividerPic(Canvas canvas) { 
canvas.save(); 
canvas.drawBitmap(mDividerPic, null, new Rect(-dp2px(3), -dp2px(14), dp2px(3), dp2px(14)), null); 
canvas.restore(); 
} 
private void drawTitle(Canvas canvas) { 
canvas.save(); 
if (mTitle == null || mTitle.length() <= 0) { 
return; 
} 
float textWidth = mTitlePaint.measureText(mTitle); 
float baseLine = DeFAULT_INNER_RADIS - DEFAULT_TITLE_PADDING_TOP; 
canvas.drawText(mTitle, -textWidth / 2, -baseLine, mTitlePaint); 
canvas.restore(); 
} 
private void drawLightArc(Canvas canvas) { 
canvas.save(); 
canvas.rotate(mCurrentAngle); 
RectF rect = new RectF(-mInnerCircleRadis, -mInnerCircleRadis, mInnerCircleRadis, mInnerCircleRadis); 
canvas.drawArc(rect, -270, 180, false, mGradientArcPaint); 
canvas.drawBitmap(mWeatherPic, null, new Rect(-dp2px(12), -mInnerCircleRadis - dp2px(12), dp2px(12), dp2px(12) - mInnerCircleRadis), null); 
canvas.restore(); 
} 
private void drawDateTime(Canvas canvas) { 
canvas.save(); 
String timeStr = ExtendUtil.getAllFormatStr(mFormat, mCurrentDate); 
String[] array = timeStr.split("_"); 
String date = array[0]; 
String hour = array[1]; 
String minute = array[2]; 
String wake = array[3]; 
float width = mTimePaint.measureText(hour); 
RectF targetRect = new RectF(-(width + dp2px(40)), -sp2px(70) / 2, -dp2px(40), sp2px(70) / 2); 
Paint.FontMetricsInt fontMetrics = mTimePaint.getFontMetricsInt(); 
int baseline = (int) (targetRect.top + (targetRect.bottom - targetRect.top - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top); 
canvas.drawText(hour, -width - dp2px(15), baseline, mTimePaint); 
float minuteWidth = mTimePaint.measureText(minute); 
RectF minuteRect = new RectF(dp2px(15), -sp2px(70) / 2, dp2px(15) + minuteWidth, sp2px(70) / 2); 
Paint.FontMetricsInt minuteMetrics = mTimePaint.getFontMetricsInt(); 
int minuteLine = (int) (minuteRect.top + (minuteRect.bottom - minuteRect.top - minuteMetrics.bottom + minuteMetrics.top) / 2 - minuteMetrics.top); 
canvas.drawText(minute, dp2px(15), minuteLine, mTimePaint); 
String dateStr = date + " " + wake; 
float dateWidth = mDatePaint.measureText(dateStr); 
RectF dateRect = new RectF(-dateWidth / 2, sp2px(30), dateWidth / 2, sp2px(30) + sp2px(14)); 
Paint.FontMetricsInt dateMetrics = mTimePaint.getFontMetricsInt(); 
int dateLine = (int) (dateRect.top + (dateRect.bottom - dateRect.top - dateMetrics.bottom + dateMetrics.top) / 2 - dateMetrics.top); 
canvas.drawText(dateStr, -dateWidth / 2, dateLine, mDatePaint); 
canvas.restore(); 
} 
private int startMeasure(int whSpec) { 
int result = 0; 
int size = MeasureSpec.getSize(whSpec); 
int mode = MeasureSpec.getMode(whSpec); 
if (mode == MeasureSpec.EXACTLY) { 
result = size; 
} else { 
result = DEFAULT_WIDTH; 
} 
return result; 
} 
//開始倒計時計算鬧鐘結(jié)束 
public void startCountDown() { 
ValueAnimator animator = ValueAnimator.ofFloat(0, 1.0f); 
animator.setDuration(mCountDownTime); 
//勻速 
animator.setInterpolator(new LinearInterpolator()); 
//不循環(huán) 
animator.setRepeatCount(0); 
//監(jiān)聽動畫過程中值得實時變化 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
@Override 
public void onAnimationUpdate(ValueAnimator valueAnimator) { 
mCurrentAngle = (float) valueAnimator.getAnimatedValue() * 360; 
invalidate(); 
} 
}); 
animator.addListener(new Animator.AnimatorListener() { 
@Override 
public void onAnimationStart(Animator animator) { 
} 
@Override 
public void onAnimationEnd(Animator animator) { 
if (mRingTone != null && mRingTone.isPlaying()) { 
mRingTone.stop(); 
} 
if (mCountdownListener != null) { 
mCountdownListener.countdownFinished(); 
} 
} 
@Override 
public void onAnimationCancel(Animator animator) { 
} 
@Override 
public void onAnimationRepeat(Animator animator) { 
} 
}); 
animator.start(); 
//播放鬧鐘鈴聲 
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
mRingTone = RingtoneManager.getRingtone(mContext, notification); 
if (mRingTone != null && !mRingTone.isPlaying()) { 
mRingTone.play(); 
} 
} 
//提供設(shè)置倒計時的方法 
public void setCountDownTime(long time, CountdownFinishListener listener) { 
mCountDownTime = time; 
mCountdownListener = listener; 
} 
//設(shè)置當(dāng)前日期時間 
public void setCurrentTime(long currentTime) { 
mCurrentDate = currentTime; 
invalidate(); 
} 
private int dp2px(int dp) { 
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); 
} 
private int sp2px(int sp) { 
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics()); 
} 
public interface CountdownFinishListener { 
//倒計時結(jié)束操作 
void countdownFinished(); 
} 
}

以上所述是小編給大家介紹的Android自定義View 實現(xiàn)鬧鐘喚起播放鬧鐘鈴聲功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 詳解Android中Activity的啟動模式及應(yīng)用場景

    詳解Android中Activity的啟動模式及應(yīng)用場景

    今天給大家介紹下安卓開發(fā)中不得不涉及的Activity啟動模式及應(yīng)用場景,Activity一共有四種啟動模式,分別是Standard模式、SingleTop模式、SingleTask模式以及SingleInstance模式,,需要的朋友可以參考下
    2023-09-09
  • Android ViewModel的作用深入講解

    Android ViewModel的作用深入講解

    這篇文章主要介紹了Android ViewModel的作用,ViewModel類旨在以注重生命周期的方式存儲和管理界面相關(guān)數(shù)據(jù),ViewModel類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)留存,需要詳細了解可以參考下文
    2023-05-05
  • Android中TextView和ImageView實現(xiàn)傾斜效果

    Android中TextView和ImageView實現(xiàn)傾斜效果

    這篇文章主要為大家詳細介紹了Android中TextView和ImageView實現(xiàn)傾斜效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android開發(fā)中滑動分頁功能實例詳解

    Android開發(fā)中滑動分頁功能實例詳解

    這篇文章主要介紹了Android開發(fā)中滑動分頁功能,結(jié)合實例形式詳細分析了Android滑動分頁功能的具體步驟與相關(guān)實現(xiàn)技巧,代碼中備有詳盡的注釋便于理解,需要的朋友可以參考下
    2017-10-10
  • Android開發(fā)高級組件之自動完成文本框(AutoCompleteTextView)用法示例【附源碼下載】

    Android開發(fā)高級組件之自動完成文本框(AutoCompleteTextView)用法示例【附源碼下載】

    這篇文章主要介紹了Android開發(fā)高級組件之自動完成文本框(AutoCompleteTextView)用法,簡單描述了自動完成文本框的功能并結(jié)合實例形式分析了Android實現(xiàn)自動完成文本框功能的具體步驟與相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2018-01-01
  • 大型項目里Flutter測試應(yīng)用實例集成測試深度使用詳解

    大型項目里Flutter測試應(yīng)用實例集成測試深度使用詳解

    這篇文章主要為大家介紹了大型項目里Flutter測試應(yīng)用實例集成測試深度使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android?WindowManger實現(xiàn)桌面懸浮窗功能

    Android?WindowManger實現(xiàn)桌面懸浮窗功能

    這篇文章主要介紹了Android?WindowManger實現(xiàn)桌面懸浮窗功能,他們基本都是在Activity之上顯示的,如果想實現(xiàn)在桌面顯示的懸浮窗效果,需要用到WindowManager來實現(xiàn)了,需要的朋友可以參考下
    2023-04-04
  • Android來電監(jiān)聽和去電監(jiān)聽實現(xiàn)代碼

    Android來電監(jiān)聽和去電監(jiān)聽實現(xiàn)代碼

    本文是關(guān)于來點監(jiān)聽和去電監(jiān)聽展開問題,通過實例代碼講解,對android來電監(jiān)聽和去電監(jiān)聽的相關(guān)知識感興趣的朋友一起看看吧
    2017-06-06
  • Android EditText實現(xiàn)輸入表情

    Android EditText實現(xiàn)輸入表情

    editText是TextView的子類,TextView能用的工具EditText都能用,接下來通過實例代碼給大家分享Android EditText實現(xiàn)輸入表情功能,感興趣的朋友一起看看吧
    2017-08-08
  • Android開發(fā)自定義雙向SeekBar拖動條控件

    Android開發(fā)自定義雙向SeekBar拖動條控件

    這篇文章主要為大家介紹了Android開發(fā)自定義雙向SeekBar拖動條控件使用實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論