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

在这里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;        }    }
上张效果图

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

更多相关文章

  1. Appium Android(安卓)Bootstrap源码分析之启动运行
  2. android 手把手教你打造万能的ListView GridView的适配器
  3. android的LinearLayout杂记
  4. android控件框架介绍
  5. Android学习之ListView控件
  6. Android如何集成Vitamio
  7. android 解决键盘弹出后输入框被下方控件遮盖
  8. 某android平板项目开发笔记--自定义sharepreference UI
  9. 【Android开发学习44】android: 静态XML和动态加载XML混合使用,以

随机推荐

  1. Android:SqliteDatabase 数据库的简单使
  2. Android中音视频合成的几种方案详析
  3. Android(安卓)中自定义View的应用(二)
  4. Android(安卓)Mediaplayer 三种从资源文
  5. Android控件之SlidingDrawer(滑动式抽屉)详
  6. Android开发基础之AlertDialog的单选对话
  7. Activity有几点你可能不知道的
  8. Android中有关Handler的使用(一)
  9. Android(安卓)蓝牙开发实例--蓝牙聊天程
  10. Android培训---支持不同的平台版本