android 自定义绘制,Android 自定义View 绘制正N边形

支付宝芝麻信用分-分析中,有个正五边形,刚刚有空试着做了下

效果图:

AAffA0nNPuCLAAAAAElFTkSuQmCC

分析图:

AAffA0nNPuCLAAAAAElFTkSuQmCC

实现原理、步骤:

已知半径为R,圆心点O(a,b),点A(a, c=b-R), OA=OB=R,圆心角O的度数

1) 求出弦AB的长度

2) 利用两点间距离公式,得到两个方程AB、OB相关的,解出y的值

3) 将y代入其中一个方程,解出x的值 (我这里代入的是AB的方程)

4) 利用canvas旋转,循环绘制

package com.stone.canvaspath.zhima;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.View;

/**

* 正N边形

* author : stone

* email : aa86799@163.com

* time : 2016/11/17 14 12

*/

public class ZhimaView extends View {

private Paint mPaint;

private float mR, mCx, mCy;

private static final int mN = 9;

private static final float DEGREES_UNIT = 360 / mN; //正N边形每个角 360/mN能整除

public ZhimaView(Context context) {

this(context, null);

}

public ZhimaView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public ZhimaView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mPaint = new Paint();

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

float mW = getMeasuredWidth();

float mH = getMeasuredHeight();

mCx = mW / 2;

mCy = mH / 2;

mR = Math.min(mCx, mCy) / 4 * 3;

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

mPaint.setColor(Color.BLUE);

mPaint.setStyle(Paint.Style.STROKE);

float d = (float) (2 * mR * Math.sin(Math.toRadians(DEGREES_UNIT / 2)));

float c = mCy - mR;

float y = (d * d + mCy * mCy - c * c - mR * mR) / (2 * (mCy - c));

float x = (float) (mCx + Math.sqrt(-1 * c * c + 2 * c * y + d * d - y * y));

for (int i = 0; i < mN; i++) {

canvas.save();

canvas.rotate(DEGREES_UNIT * i, mCx, mCy);

canvas.drawLine(mCx, mCy, mCx, c, mPaint);

canvas.drawLine(mCx, c, x, y, mPaint);

canvas.restore();

}

}

}

本人不定期分享自定义View的一些效果实现,csdn博客地址:http://blog.csdn.net/jjwwmlp456

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值