admin管理员组

文章数量:819705

扇形数据android编程,Android 扇形控件

最近想做一个扇形的控件, 比如说扇形按钮, 或者是扇形的图片。这时候正常时要自定位控件了。

在这里,但是跟我想要的还是有点出入,于是就参考他的控件,打算自己写一个控件。

想要做扇形控件,首先要会绘制扇形,android绘制里面有个Path的类,看这个名字感觉就是用来绘制路径的。

主要的方法就是通过Path类的arcTo来获取一个圆的路径,详细可以见点击打开链接。

通过对内圈截取一段弧度,然后移动到外圈,以相反的方向截取一样的弧度,然后闭合起来,就形成了一个扇形。

private Path makePath(int startAngle, int endAngle, int inner, int outer, Point center) {

TLog.d("makePath", "start, end = " + startAngle + ", " + endAngle);

Path path = new Path();

RectF innerRect = new RectF(center.x - inner, center.y - inner,

center.x + inner, center.y + inner);

RectF outerRect = new RectF(center.x - outer, center.y - outer,

center.x + outer, center.y + outer);

path.arcTo(innerRect, startAngle, endAngle - startAngle, true);

path.arcTo(outerRect, endAngle, startAngle - endAngle, false);

path.close();

return path;

}

布局也是一个比较麻烦的问题,因为item不是方形的,而是扇形的,所以在排布的时候要跟平常控件不一样

就一层的扇形来讲,首先我们要定一个初始的角度,然后沿着这个角度逐步增加并获取到Path,这时候扇形按钮的子View的布局就要确定了

首先先得到扇形的中心点(角度是开始角度和结束角度的中间,半径是内圈半径和外圈半径加起来的一半)

然后获取到子View布局的大小,沿着中心点将它布局下去就可以。

private void layoutItems() {

int intervalAngle = 1;

int inner = mInnerRadius;

int outer = mInnerRadius + mRadiusInc;

int incInterval = 2;

int startAngleInterval = 45;

int levelStartAngle = 45;

for (Listlist : mItemList) {

int itemAngle = CIRCLE_ANGLE / list.size() - intervalAngle;

int startAngle = levelStartAngle;

TLog.d("layout", "list.size = " + list.size());

for (PieItem item : list) {

View view = item.getView();

view.measure(view.getLayoutParams().width,

view.getLayoutParams().height);

int w = view.getMeasuredWidth();

int h = view.getMeasuredHeight();

//show in center

int r = inner + (outer - inner) / 2;

double arc = angle2arc(startAngle + itemAngle / 2 + intervalAngle / 2);

int x = mCenter.x + (int) (r * Math.cos(arc)) - w / 2;

int y = mCenter.y + (int) (r * Math.sin(arc)) - h / 2;

view.layout(x, y, x + w, y + h);

Path path = makePath(startAngle, startAngle + itemAngle, inner, outer, mCenter);

item.setGeometry(startAngle, itemAngle, inner, outer, path);

startAngle += itemAngle + intervalAngle;

}

inner += mRadiusInc + incInterval;

outer += mRadiusInc + incInterval;

levelStartAngle += startAngleInterval;

}

}

上张效果图

最后附上 项目源码

PS:最近用android studio(其实是不小心更新了sdk导致eclipse没法用),然后后面想起项目通用的都是用eclipse

我只好把之前的sdk和eclipse删除,然后重新解压eclipse

本文标签: 扇形数据android编程Android 扇形控件