自定义view实战笔记--饼图demo

1:想要从view的中心开始绘制可以如下

        canvas.save();
        canvas.translate(mWidth / 2, mHeight / 2);
        canvas.restore();

2:数学相关的计算多用:Math类 —三角函数等等

3:想要在一组数据中查找value在这组数据中的位置,可以先排序,再用二分查找法(binarySearch)找出

 int position = Arrays.binarySearch(endAngles, (float) touchDegree);

4:在处理触摸事件和绘制的时候,特别注意坐标问题,可以转变坐标系,常用还可以用两个变量来提升性能,不用一直绘制 lastTouchedPosition ,currentTouchedPosition

@Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                float touchX = event.getX();
                float touchY = event.getY();
                //转换坐标为圆中心点的坐标
                touchX = touchX - mWidth / 2;
                touchY = touchY - mHeight / 2;
                //根据反正切值拿到角度
                touchDegree = MathUtil.getTouchAngle(touchX, touchY);
                Log.e("degree", touchDegree + "");
                //找出触摸的是第几块区域
                float touchRadius = (float) Math.sqrt(touchX * touchX + touchY * touchY);
                if (touchRadius < circleRadius) {
                    int position = Arrays.binarySearch(startAngles, (float) touchDegree);
                    if (position > 0) {
                        currentTouchedPosition = position;
                    } else {
                        // -index - 1 = position
                        currentTouchedPosition = -position - 1;
                    }
                    if (currentTouchedPosition != lastTouchedPosition) {
                        lastTouchedPosition = currentTouchedPosition;
                        Log.e("lastTouchedPosition",lastTouchedPosition +"");
                        invalidate();
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                lastTouchedPosition = -1;
                invalidate();
                break;
        }
        return true;
    }

5:注意坐标系的象限和数学中不一样

 String percentText = String.format("%.2f", pieBean.getPercent() * 100) + "%";
            if (startAngle % 360 > 90 && startAngle % 360 < 270) {
                mLinePaint.setTextAlign(Paint.Align.RIGHT);
                canvas.drawText(percentText, endX, endY, mLinePaint);
                mLinePaint.setTextAlign(Paint.Align.LEFT);
            } else {
                canvas.drawText(percentText, endX, endY, mLinePaint);
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值