這個案例是通過view來制作一個Android時鐘
//創(chuàng)建一個類繼承view
public class ClockView extends View {
? ?private static final String TAG = "ClockView";
? ?private final Paint mPaint2;
? ?private final Paint mPaint3;
? ?private final Paint mPaint4;
? ?private final Paint mPaint5;
? ?private int mCx;
? ?private int mCy;
? ?private int mRadius;
? ?private final Paint mPaint;
? ?private final Paint mPaint1;
? ?private int CIRCLESIZE=3; //環(huán)到外邊框的距離
? ?private int DIGITSLONG=20;//長刻度距離
? ?private int DIGISTSHART=10;//斷刻度距離
? ?private int mTextsize=20;//文本的大小
? ?private Bitmap mbitmap;
? ?private int mHourDegree;
? ?private int mMinuteDegree;
? ?private int mSecondDegree;
? ?private Paint mBackgroundPaint;
? ?public ClockView(Context context, AttributeSet attrs) {
? ? ? ?super(context, attrs);
? ? ? ?//圓環(huán)的筆
? ? ? ?mPaint = new Paint();
? ? ? ?mPaint.setStrokeWidth(5);
? ? ? ?mPaint.setStyle(Paint.Style.STROKE);
? ? ? ?mPaint.setAntiAlias(true);
? ? ? ?mPaint.setColor(Color.GRAY);
? ? ? ?//刻度的筆
? ? ? ?mPaint1 = new Paint();
? ? ? ?mPaint1.setColor(Color.GRAY);
? ? ? ?mPaint1.setAntiAlias(true);
? ? ? ?mPaint1.setStrokeWidth(3);
? ? ? ?//loge的筆
? ? ? ?mbitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.heima);
? ? ? ?mPaint2 = new Paint();
? ? ? ?//指針的筆
? ? ? ?mPaint3 = new Paint();
? ? ? ?mPaint3.setColor(Color.WHITE);
? ? ? ?mPaint3.setStrokeWidth(5);
? ? ? ?mPaint3.setAntiAlias(true);
? ? ? ?mPaint4 = new Paint();
? ? ? ?mPaint4.setColor(Color.WHITE);
? ? ? ?mPaint4.setStrokeWidth(4);
? ? ? ?mPaint4.setAntiAlias(true);
? ? ? ?mPaint5 = new Paint();
? ? ? ?mPaint5.setColor(Color.WHITE);
? ? ? ?mPaint5.setStrokeWidth(3);
? ? ? ?mPaint5.setAntiAlias(true);
? ?}
? ?@Override
? ?protected void onSizeChanged(int w, int h, int oldw, int oldh) {
? ? ? ?//原點
? ? ? ?mCx = w/2;
? ? ? ?mCy = h/2;
? ? ? ?//環(huán)半徑
? ? ? ?mRadius = w/2-CIRCLESIZE;
? ? ? ?initBackgroundPaint();
? ?}
? ?private void initBackgroundPaint() {
? ? ? ?mBackgroundPaint = new Paint();
? ? ? ?mBackgroundPaint.setColor(Color.LTGRAY);
? ? ? ?int[] colors = {Color.BLACK, Color.LTGRAY, Color.WHITE, Color.LTGRAY};
// ? ?float[] positions = {0.0f, 0.5f, 0.75f, 1};
? ? ? ?Shader shader = new RadialGradient(mCx, mCy, mRadius, colors, null, Shader.TileMode.CLAMP);
? ? ? ?mBackgroundPaint.setShader(shader);
? ?}
? ?@Override
//開始繪制
? ?protected void onDraw(Canvas canvas) {
? ? ? ?// ? ?6. 畫背景
? ? ? ?canvas.drawCircle(mCx, mCy, mRadius, mBackgroundPaint);
? ? ? ?//1.畫環(huán)
? ? ? ?canvas.drawCircle(mCx,mCy,mRadius,mPaint);
? ? ? ?//2.畫刻度
? ? ?/* int startX=mCx;
? ? ? ?int startY=5;
? ? ? ?int stopX=mCx;
? ? ? ?int stopY=20;
? ? ? ?canvas.rotate(30,mCx,mCy);
? ? ? ?canvas.drawLine(startX,startY,stopX,stopY,mPaint1);*/
? ? ? ?drawDigits(canvas);
? ? ? ?//3畫數(shù)字
? ? ? ?drawText(canvas);
? ? ? ?//畫loge
? ? ? ?drawLoge(canvas);
? ? ? ?//畫指針
? ? ? ?drawArrows(canvas);
? ? ? ?//指針動起來 調用onAttachedToWindow ?當view綁定到window的時候調用
? ?}
? ?private void drawArrows(Canvas canvas) {
? ? ?/* mpath=new Path();
? ? ? ?mpath.moveTo(mCx,mCy+DIGITSLONG);
? ? ? ?mpath.lineTo(mCx,mCy-DIGITSLONG);*/
? ? ? ?//canvas.drawPath(mpath,mPaint3);
? ? ? ?//進行指針動畫
? ? ? ?canvas.rotate(mHourDegree,mCx,mCy);
? ? ? ?canvas.drawLine(mCx,mCy+DIGISTSHART,mCx,CIRCLESIZE*3+DIGITSLONG+mTextsize,mPaint3);
? ? ? ?canvas.rotate(-mHourDegree,mCx,mCy);
? ? ? ?canvas.rotate(mMinuteDegree,mCx,mCy);
? ? ? ?canvas.drawLine(mCx,mCy+DIGISTSHART,mCx,CIRCLESIZE+DIGITSLONG+mTextsize,mPaint4);
? ? ? ?canvas.rotate(-mMinuteDegree,mCx,mCy);
? ? ? ?canvas.rotate(mSecondDegree,mCx,mCy);
? ? ? ?canvas.drawLine(mCx,mCy+DIGISTSHART,mCx,DIGISTSHART+mTextsize,mPaint5);
? ? ? ?canvas.rotate(-mSecondDegree,mCx,mCy);
? ?}
? ?private void drawLoge(Canvas canvas) {
? ? ? ?canvas.drawBitmap(mbitmap,mCx-mTextsize/2,CIRCLESIZE+DIGITSLONG+mTextsize,mPaint2);
? ?}
? ?private void drawText(Canvas canvas) {
? ? ? ?for (int i=1;i<=12;i++){
? ? ? ? ? ?canvas.rotate(30,mCx,mCy);
? ? ? ? ? ?//調整位置
? ? ? ? ? ?canvas.rotate(-30*i,mCx,CIRCLESIZE+DIGITSLONG+mTextsize/2);
? ? ? ? ? ?canvas.drawText(i+"",mCx-CIRCLESIZE,CIRCLESIZE*2+DIGITSLONG+mTextsize/2,mPaint1);
? ? ? ? ? ?canvas.rotate(30*i,mCx,CIRCLESIZE+DIGITSLONG+mTextsize/2);
? ? ? ?}
? ?}
? ?private void drawDigits(Canvas canvas) {
? ? ? ?for (int i=0 ;i<60;i++) {
? ? ? ? ? ?int startX = mCx;
? ? ? ? ? ?int startY = CIRCLESIZE;
? ? ? ? ? ?int stopX = mCx;
? ? ? ? ? ?int stopY;
? ? ? ? ? ?if(i%5==0){
? ? ? ? ? ? ? ?stopY = DIGITSLONG;
? ? ? ? ? ?}else{
? ? ? ? ? ? ? ?stopY=DIGISTSHART;
? ? ? ? ? ?}
? ? ? ? ? ?canvas.drawLine(startX, startY, stopX, stopY, mPaint1);
? ? ? ? ? ?canvas.rotate(6, mCx, mCy);
? ? ? ?}
? ?}
? ?@Override
? ?//當view綁定到window的時候調用
? ?protected void onAttachedToWindow() {
? ? ? ?super.onAttachedToWindow();
? ? ? ?//開啟指針動畫
? ? ? ?startTick();
? ?}
? ?private void startTick() {
? ? ? ?//1秒執(zhí)行一次
? ? ? ?postDelayed(runnable,1000);
? ?}
? ?private Runnable runnable=new Runnable() {
? ? ? ?@Override
? ? ? ?public void run() {
? ? ? ? ? ?//計算指針便宜角度
? ? ? ? ? ?calculateDegree();
? ? ? ? ? ?//重新繪制
? ? ? ? ? ?invalidate();
? ? ? ? ? ?//遞歸
? ? ? ? ? ?startTick();
? ? ? ?}
? ?};
? ?private void calculateDegree() {
? ? ? ?//獲取當前時間
? ? ? ?Calendar instance = Calendar.getInstance();
? ? ? ?instance.setTimeInMillis(System.currentTimeMillis());
? ? ? ?int hour = instance.get(Calendar.HOUR);
? ? ? ?int minute = instance.get(Calendar.MINUTE);
? ? ? ?int second = instance.get(Calendar.SECOND);
? ? ? ?//計算角度
? ? ? ?mHourDegree = hour * 30;
? ? ? ?mMinuteDegree = minute * 6;
? ? ? ?mSecondDegree = second * 6;
? ?}
}
//布局中的代碼
? ?android:layout_centerInParent="true"
? ?android:layout_width="200dp"
? ?android:layout_height="200dp"
? ?android:background="#ffffff"/>