画太极

前几天看到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 mData = new ArrayList();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,可以让发送消息延时短一点都可以。

画太极_第1张图片

参考:http://www.gcssloop.com/#blog这个copor的博客真的写的详细的不要不要的,可以当API文档看了我感觉,大家也可以去看看。

你可能感兴趣的:(Android)