github傳送門
初始化一些資料
public class countdownview extends view
public countdownview(context context, attributeset attrs)
public countdownview(context context, attributeset attrs, int defstyleattr)
private void init
()
...}複製**
定義控制項的大小
@override
protected void onsizechanged(int w, int h, int oldw, int oldh)
複製**
繪製刻度盤
/**
* 繪製刻度盤
* * @param canvas 畫布
*/private void drawdial(canvas canvas)
// 360 / 12 = 30;
canvas.rotate(30);
} // 繪製分鐘刻度
dialpaint.setstrokewidth(dp2px(1));
for (int i = 0; i < 60; i++)
// 360 / 60 = 6;
canvas.rotate(6); }}
複製**
首先繪製乙個圓,然後把座標原點移動到控制項中心,原點移動到控制項中心後向上為負值,接著繪製小時刻度,一共有12個刻度,time的單位為分鐘,要注意如果刻度被定時進度條覆蓋就不再繪製,繪製分鐘刻度同理,**中已經寫了很全的注釋,不再多說,看下效果:
繪製定時進度條
/**
* 繪製定時進度條
* * @param canvas 畫布
*/private void drawarc(canvas canvas)
} // 繪製結束標誌
dialpaint.setstrokecap(paint.cap.round);
canvas.drawline(0, -dialradius - hourscaleheight, 0, -dialradius + hourscaleheight, dialpaint); }}
複製**
如果定時時間大於0則開始繪製定時進度條,重點說下繪製進度,在這裡並沒有使用繪製圓弧的方法,依然是通過旋轉畫布的方式繪製的,設定乙個15分鐘的進度,看下效果:
繪製時間
/**
* 繪製時間
* * @param canvas 畫布
*/private void drawtime(canvas canvas)
複製**
滑動事件
@override
public boolean ontouchevent(motionevent event) else
if (angleoffset > 270)
currentangle = moveangle;
// 計算時間
calctime(angleoffset);
break;
case motionevent.action_cancel:
case motionevent.action_up:
break;
} }return
true;
}複製**
通過計算滑過的角度增量來設定當前的定時時間,看下如何來計算當前觸控點的角度:
前方高能,請減速慢行!
/**
* 以刻度盤圓心為座標圓點,建立座標系,求出(targetx, targety)座標與x軸的夾角
* * @param targetx x座標
* @param targety y座標
* @return (targetx, targety)座標與x軸的夾角
*/private float calcangle(float targetx, float targety) else
} else else
} } else else
} // 完整圓的弧度為2π,角度為360度,所以180度等於π弧度
// 弧度 = 角度 / 180 * π
// 角度 = 弧度 / π * 180
return (float) (radian / math.pi * 180);
}複製**
首先了解下弧度與角度的計算公式:
然後以第一象限的點為例,計算一下觸控點的角度:
// 以刻度盤圓心為座標圓點
float x = targetx - width / 2;
float y = targety - height / 2;
// 觸控點與x軸的夾角
float tan = math.abs(y / x);
// 觸控點的弧度
double radian = 2 * math.pi - math.atan(tan);
// 觸控點的角度
double angle = radian / math.pi * 180;
複製**
看圖理解:
/**
* 計算時間
* * @param angle 增加的角度
*/private void calctime(float angle) else
if (rotateangle > 360)
time = (int) rotateangle / 6;
invalidate();
}複製**
最後提供設定倒計時,和監聽倒計時狀態的方法:
/**
* 設定倒計時
* * @param minute 分鐘
*/public void setcountdown(int minute)
time = minute;
rotateangle = minute * 6;
invalidate();
}/**
* 設定倒計時監聽
* * @param ontempchangelistener 倒計時監聽介面
*/public void setoncountdownlistener(oncountdownlistener oncountdownlistener)
/** * 倒計時監聽介面
*/public inte***ce oncountdownlistener
複製**
大功告成,再看下效果:
原始碼已經上傳到github上了,歡迎fork,覺得還不錯就start一下吧!
github傳送門
android自定義倒計時控制項示例
這篇文章主要介紹了android秒殺倒計時自定義textview示例,大家參考使用吧 自定義textview控制項timetextview 複製 如下 import android.content.context import android.content.res.typedarray impor...
自定義控制項實踐 倒計時控制項
目前專案中用到了乙個倒計時控制項,覺的還不錯.所以分享出來.有需要的同學可以直接拿去用.廢話不多說,先看看效果 jdfw.gif 實現乙個自定義控制項,先分析控制項的初始狀態和構成.override protected void ondraw canvas canvas 複製 開始倒計時 publi...
Android倒計時控制項
專案有乙個倒計時特賣的需求 具體 如下 import android.content.context import android.util.attributeset import android.widget.textview public class timertextview extends ...