Android 扇形控件

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

在这里http://blog.csdn.net/libre923045/article/details/7800227有看到一个扇形的控件,但是跟我想要的还是有点出入,于是就参考他的控件,打算自己写一个控件。


想要做扇形控件,首先要会绘制扇形,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 (List list : 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;
        }
    }
上张效果图
Android 扇形控件_第1张图片

最后附上 项目源码
PS:最近用android studio(其实是不小心更新了sdk导致eclipse没法用),然后后面想起项目通用的都是用eclipse
我只好把之前的sdk和eclipse删除,然后重新解压eclipse

你可能感兴趣的:(Android,扇形,pie)