接触过很多等待加载的View,今天就给大家介绍自写控件实现时钟加载View,不多说废话,开始。
一、实现思路:
1:画时钟盘,获取View大小适配圆心和半径。
2:画刻度,通过旋转画布15度来分别画出刻度线。
3:画时针,旋转画布角度来实现,并通过线程死循环来改变旋转角 度,更新画布,从而动态旋转。
4:对外开放接口控制线程结束。
二、程序运行如下图:
三、主要代码(ClockLoaderView 类):
package com.tielizi.clockloaderview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* Created by Administrator on 2015/10/15.
*/
public class ClockLoaderView extends View {
private Paint paint;
private float width,height;
private float radius;//时钟半径
private float centerX,centerY;//时钟圆心坐标
private float paintBaseWidth;//画笔基本粗细
private int angleLong,angleShort = 0;//长短指针
private boolean isKill;//控制线程结束
private int speed;//指针旋转速度
public ClockLoaderView(Context context) {
super(context);
init();
}
public ClockLoaderView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ClockLoaderView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
// public ClockLoaderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
// super(context, attrs, defStyleAttr, defStyleRes);
// }
@Override
protected void onDraw(Canvas canvas) {
drawCircle(canvas);
drawPointer(canvas);
super.onDraw(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//根据View大小适配参数
width = getWidth();
height = getHeight();
radius = width/4;
centerX = width/2;
centerY = height/2;
paintBaseWidth = width/200;
angleLong = 0;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
private void init(){
isKill = false;
speed = 1;
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
new Thread(new Runnable() {//线程控制canvas旋转角度
@Override
public void run() {
while (!isKill){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
angleLong+=speed;
if(angleLong%360==0){
angleLong = 0;
angleShort += 15;
}
Log.i("px",""+angleLong);
postInvalidate();
}
}
}).start();
}
private void drawCircle(Canvas canvas){//画时钟圈
paint.setColor(Color.BLACK);
paint.setStrokeWidth(paintBaseWidth * 2);
canvas.drawCircle(centerX, centerY, radius, paint);
paint.setStyle(Paint.Style.FILL);
for(int i = 0; i < 24 ; i++){
if(i == 0 || i == 6 || i == 12 || i == 18 || i == 24){
paint.setStrokeWidth(paintBaseWidth*2);
canvas.drawLine(centerX,centerY-radius,centerX,centerY-radius+width/20,paint);
}else{
paint.setStrokeWidth(paintBaseWidth);
canvas.drawLine(centerX, centerY - radius, centerX, centerY - radius + width/30,paint);
}
canvas.rotate(15,centerX,centerY);//旋转画布
}
}
private void drawPointer(Canvas canvas){//画时针
paint.setStrokeWidth(paintBaseWidth * 5);
paint.setColor(Color.BLACK);
canvas.drawPoint(centerX, centerY, paint);
paint.setColor(Color.BLUE);
paint.setStrokeWidth(paintBaseWidth * 3);
canvas.rotate(angleShort, centerX, centerY);
canvas.drawLine(centerX, centerY, centerX, centerY - radius / 3, paint);
canvas.rotate(angleLong, centerX, centerY);
paint.setStrokeWidth(paintBaseWidth * 2);
paint.setColor(Color.GREEN);
canvas.drawLine(centerX, centerY, centerX, centerY - radius / 2, paint);
paint.setStyle(Paint.Style.STROKE);
}
public void killThread(){//结束线程
isKill = true;
}
public void setSpeed(int speed){//对外开放设置时针速度接口
this.speed = speed;
}
}
好了就这些。
更多相关博客
模仿搜狗加载小球