Android自定義控制項 倒計時

2021-09-11 10:54:55 字數 3615 閱讀 2149

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 ...