1.自定义View画钟实现转动
这个和画圆差不多,不过只是价格分针,并实现其转动,要加一个线程。代码如下:
Java类中的代码
package com.example.ll.canvas;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.logging.Handler;
/**
* Created by ll on 2018/3/30.
*/
public class CircleView extends View {
private Paint paint = new Paint();
private int sec;
//主线程更新Ui(os下的Handler)
private android.os.Handler handler = new android.os.Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//重新调用onDraw方法
invalidate();
}
};
public CircleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//大圆的颜色是蓝色
paint.setColor(Color.BLUE);
//设置抗锯齿
paint.setAntiAlias(true);
//圆不是填充的,是描边
paint.setStyle(Paint.Style.STROKE);
// //画笔边的宽度
// paint.setStrokeWidth(10);
//大圆与小圆的画出
canvas.drawCircle(getWidth() / 2, getHeight() / 2, getHeight() / 4, paint);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, getHeight() / 80, paint);
//利用循环将1到12的数字填写到表上
for (int i = 1; i <= 12; i++) {
//保存画布
canvas.save();
//旋转角度,旋转中心的设置
canvas.rotate(360 / 12 * i, getWidth() / 2, getHeight() / 2);
//数字大小的设置
paint.setTextSize(40);
//旋转的设置
canvas.drawText(String.valueOf(i), getWidth() / 2 - 15, getHeight() / 2 - getHeight() / 4 + 60, paint);
//刻度表(横线)的描写。参数意思:开始的X坐标,结束的X坐标,开始的Y坐标,结束的Y坐标,画笔(paint)
canvas.drawLine(getWidth() / 2, getHeight() / 2 - getHeight() / 4, getWidth() / 2, getHeight() / 2 - getHeight() / 4 + 30, paint);
//恢复原样
canvas.restore();
}
//保存画布
canvas.save();
//旋转角度,旋转中心的设置
canvas.rotate(6 * sec, getWidth() / 2, getHeight() / 2);
//子针设置
canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 4 + 100, paint);
//恢复原样
canvas.restore();
}
//点击事件(点一下,子针开始转)
@Override
public boolean onTouchEvent(MotionEvent event) {
new Thread(new Runnable() {
@Override
//子线程做读秒的耗时操作
public void run() {
//让子针不止转一次
while (true) {
//子针角度转变次数进行自加
sec++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//子线程发出消息让主线程捕获消息
handler.sendEmptyMessage(sec);
}
}
}).start();
return super.onTouchEvent(event);
}
}
xml中的代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ll.canvas.CircleActivity">
<com.example.ll.canvas.CircleView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>
效果图如下: