/** * 难点在于: * (1)触摸事件的处理: * 获取点击的点p,查看p点的坐标 ,根据圆心和p点坐标求斜率,根据斜率Math.atan算出点击点的角度, * 查看点击角度位于哪个角度区间内,确定颜色块索引,然后触发重绘。 * * 重绘时根据颜色块索引,来确定哪一块区域是要放大的,剩下的区域要恢复原大小。 * 颜色块放大过程:根据每个颜色块中点所属象限,来动态调整圆弧对应矩形的上下左右值。 * */ public class CharView extends View { private int mWidth; private int center; private Paint paint; private float mStrokeWidth; private float radius; private int mCount; private int[] mColor = {Color.RED, Color.YELLOW, Color.BLUE, Color.GREEN, Color.GRAY}; private List<Float> mDegree = new ArrayList<>(); private float lastDegree;//最后一次的角度 private List<Angle> mAngles=new ArrayList<>(); /** * 每份所占的比例 */ private List<Float> mList = new ArrayList<Float>(); private int clickIndex=-1; private RectF selectOval; private RectF normalOval; public CharView(Context context) { this(context,null); init(); } public CharView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); init(); } public CharView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CharView, defStyleAttr, 0); int indexCount = ta.getIndexCount(); for (int i = 0; i < indexCount; i++) { int attr = ta.getIndex(i); switch (attr) { case R.styleable.CharView_strokeWidth: mStrokeWidth = ta.getDimensionPixelOffset(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics())); break; } } ini
自定义控件---带触摸效果的饼状图
最新推荐文章于 2022-07-02 14:14:29 发布