前几天看到http://www.gcssloop.com/customview/taiji这个copor写的太极蛮好玩的。自己也写了一个玩玩。
package com.zhou.zonghe.utils;
import java.util.Set;
import android.R.integer;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
//1.让这个类继承至View,实现其常见的构造方法
public class TaiJi extends View {
// 定义一白一黑两只画笔
private Paint baiPaint;
private Paint heiPaint;
// 定义画布的宽度和高度
private int mWidth;
private int mHeight;
public TaiJi(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public TaiJi(Context context) {
super(context);
initPaint();
}
// 2.写一个初始化画笔方法,让这个类在构造的时候同时实现这个初始化操作
private void initPaint() {
baiPaint = new Paint();
heiPaint = new Paint();
// 对两只画笔进行设置颜色和抗锯齿,模式默认为填充可不用设置
baiPaint.setAntiAlias(true);
heiPaint.setAntiAlias(true);
baiPaint.setColor(Color.WHITE);
heiPaint.setColor(Color.BLACK);
}
//3.重写onDraw方法开始绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//一: 确定画布的大小和背景色
mWidth = canvas.getWidth();
mHeight = canvas.getHeight();
canvas.drawColor(Color.GRAY);
//二:将画布坐标原点移动至屏幕中央
canvas.translate(mWidth/2, mHeight/2);
//让太极旋转(发现了要在移动坐标原点到画布中心之后再旋转,不然他会绕着屏幕的坐标原点也就是左上角转,而不是太极在旋转)
canvas.rotate(degrees);
//三:确定太极图的半径为宽高中小的那个除以2还减去一部分,不然圆直径就跟宽一样了显得不美观
int radius = Math.min(mWidth, mHeight)/2 - 100;
//四:开始画太极两个半圆,以画布坐标原点也就是屏幕中心先画一个宽高一样的矩形
RectF rectF = new RectF(-radius,-radius,radius,radius);
//黑的半圆居左
canvas.drawArc(rectF, 90, 180, true, heiPaint);
//白的半圆居右
canvas.drawArc(rectF, -90, 180, true, baiPaint);
//五:再开始画小半圆,总共再画一个四个圆,其中小圆半径为大半径的一半,更小的圆(就是那中间两个眼)为小圆半径的1/4
int radius1 = radius/2;
int radius2 = radius1/4;
canvas.drawCircle(0 , -radius1, radius1, heiPaint);
canvas.drawCircle(0 , radius1, radius1, baiPaint);
//两个鱼眼
canvas.drawCircle(0 , -radius1, radius2, baiPaint);
canvas.drawCircle(0 , radius1, radius2, heiPaint);
}
//4.怎么让太极旋转起来
//定义一个转动角度初始为0,给他一个接口让主线程对其角度变换,然后调用invalidate方法重绘
private float degrees = 0;
public void setAngle (float angle) {
this.degrees = angle;
invalidate();
}
}
主程序就更简单了就是一个handler不断发送消息让角度变动
public class MainActivity extends Activity {
// private static final ArrayList<Sector> mData = new ArrayList<Sector>();s
private TaiJi canvas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
canvas = new TaiJi(this);
setContentView(canvas);
Handler handler = new Handler(){
private float degrees = 0;
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
canvas.setAngle(degrees+=5);
this.sendEmptyMessageDelayed(0, 50);
}
};
handler.sendEmptyMessageDelayed(0, 10);
}
}
你要想让他快点转可以让角度一次加10,可以让发送消息延时短一点都可以。
参考:http://www.gcssloop.com/#blog这个copor的博客真的写的详细的不要不要的,可以当API文档看了我感觉,大家也可以去看看。