RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1168070
Accepted
DuosDuo
DuosDuo
Asked:2020-08-20 02:24:57 +0000 UTC2020-08-20 02:24:57 +0000 UTC 2020-08-20 02:24:57 +0000 UTC

绕过画布的角落

  • 772

有这样一个循环

public class PieChartView extends View {

    private final static String[] RColors = {"#448c9b", "#789a98", "#a4a795", "#ac6226", "#ef3c5e", "#b17170", "#9a9a82", "#bda763"};

    private RectF rec;
    private Paint p = new Paint();
    private String[][] data = {
            {"Facebook", "20"},
            {"Twitter", "20"},
            {"Whats app", "20"},
            {"Pinterest", "20"},
            {"Baby App", "20"}
    };
    private int d = 0;
    private float textSize = 20f;

    //========================
    public PieChartView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    //========================
    public PieChartView(Context ctx){super(ctx);}

    //========================
    @Override
    public void onSizeChanged(int nw, int nh, int ow, int oh){
        super.onSizeChanged(nw, nh, ow, oh);
        d = nw>nh?nh:nw;
        rec = new RectF(0, 0, d, d);
        p.setFlags(Paint.ANTI_ALIAS_FLAG);
    }

    //========================
    public void setTextSize(float size){textSize=size;}

    //========================
    /**Set data to be shown in pie chart view
     * @param dList ArrayList of Object[], 1st element will contain the name, 2nd the percentage (int)
     */
    public void setData(ArrayList<Object[]> dList){
        data = new String[dList.size()][2];
        int i=0;
        for(Object[] op:dList){
            data[i++] = new String[]{op[0]+"",op[1]+""};
        }
    }

    //========================
    @Override
    public void onDraw(Canvas c){

        int size = data.length;
        int sa=0, ea=0, ci=0;
        //== draw arc
        for(int i=0;i<size;i++){
            int perc = Integer.parseInt(data[i][1]);
            int pdeg = (perc*360)/100;
            ea = sa+pdeg;
            p.setColor(Color.parseColor(RColors[ci++]));
            if(ci==RColors.length)
                ci=0;
            c.drawArc(rec, sa+3, pdeg-2, true, p);
            sa = ea;
        }

        //== draw circle in center
        p.setColor(Color.WHITE);
        c.drawCircle(rec.right/2, rec.bottom/2, (int)(0.8*(d/2)) , p);

        //== write text
        p.setColor(Color.BLACK);
        p.setFakeBoldText(true);
        p.setTextSize(textSize);
        sa=0;ea=0;ci=0;
        double ra = 0; // Radian angle
        for(int i=0;i<size;i++){
            p.setColor(Color.parseColor(RColors[ci++]));
            if(ci==RColors.length)
                ci=0;
            int perc = Integer.parseInt(data[i][1]);
            int pdeg = (perc*360)/100;
            ea = sa+pdeg; //== in degrees
            ra = (sa+pdeg/2)*Math.PI/180;
            int x = (int)(rec.right/2+(((rec.right/2)*.5)*Math.cos(ra)));
            int y = (int)(rec.right/2+(((rec.right/2)*.5)*Math.sin(ra)));
            String text = data[i][0];
            c.drawText(text, x-p.measureText(text)/2, y, p);
            text = data[i][1]+"%";
            c.drawText(text, x-p.measureText(text)/2, y-p.ascent()+p.descent(), p);
            sa = ea;
        }
    }
}

结果 在此处输入图像描述

Canvas 专家的问题,您如何制作相同的视图,但只能使线条的角落变圆(在红色部分,它大致显示了如何圆角),当然,希望能够控制四舍五入的程度。 在此处输入图像描述

java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    DuosDuo
    2020-08-24T02:42:15Z2020-08-24T02:42:15Z

    弄成这样。如果你有什么要补充的,那么欢迎!

    class Data(
        val color: Int,
        val percent: Float
    )
    
    class PieChart : View {
        private val paint = Paint()
        private val tPaint = Paint()
        private var oval = RectF()
        private var demo: Boolean = false
    
        var lineOffset: Int = 0
        var startAngle: Float = 0F
        set(value) {
            field = value
            invalidate()
        }
    
        var descriptionTextSize: Float = 14F
        set(value) {
            field = value
            initPaintByText()
            invalidate()
        }
    
        var description: String = "Test description"
        set(value) {
            field = value
            invalidate()
        }
    
        var data: List<Data> = listOf()
        set(value) {
            field = value
            invalidate()
        }
    
        constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
            initAttrs(context = context, attrs = attrs)
            initStart()
        }
    
        constructor(context: Context?) : super(context) {
            initStart()
        }
    
        init {
            initPaintByText()
            initPaint()
        }
    
        private fun initAttrs( context: Context, attrs: AttributeSet) {
            val a = context.theme.obtainStyledAttributes(attrs, R.styleable.PieChart, 0, 0)
            try {
                demo = a.getBoolean(R.styleable.PieChart_demo, false)
                lineOffset = a.getDimensionPixelOffset(R.styleable.PieChart_lineOffset, 0)
                description = a.getString(R.styleable.PieChart_description) ?: ""
                startAngle = a.getFloat(R.styleable.PieChart_startAngle, 0F)
    
                descriptionTextSize = a.getDimensionPixelOffset(R.styleable.PieChart_descriptionTextSize, 14).toFloat()
            } finally {
                a.recycle()
            }
        }
    
        private fun initPaint(){
            paint.isAntiAlias = true
            paint.strokeWidth = 30f
            paint.strokeCap = Paint.Cap.ROUND
            paint.style = Paint.Style.STROKE
        }
    
        private fun initPaintByText() {
            tPaint.color = Color.BLACK
            tPaint.isFakeBoldText = true
            tPaint.textSize = descriptionTextSize
        }
    
        private fun initStart(){
            if (demo) {
                data = listOf(Data(Color.GREEN, 45F), Data(Color.BLUE, 35F), Data(Color.RED, 20F))
            }
            initPaint()
            initPaintByText()
        }
    
        public override fun onDraw(canvas: Canvas) {
            val width = width.toFloat()
            val height = height.toFloat()
            val radius: Float
            radius = if (width > height) {
                height / 3
            } else {
                width / 3
            }
    
            val centerX = width / 2
            val centerY = height / 1.6f
            val left = centerX - radius
            val top = centerY - radius
            val right = centerX + radius
            val bottom = centerY + radius
    
            oval[left, top, right] = bottom
    
            var mAngle: Float = startAngle
    
            for ((index, item) in data.withIndex()) {
                paint.color = item.color
                val pInAngle = item.percent * 3.6F
                val sAngle = pInAngle - (lineOffset)
                canvas.drawArc(oval, mAngle, sAngle, false, paint)
    
                mAngle += lineOffset + sAngle
            }
        }
    }
    

    在此处输入图像描述

    • 1

相关问题

  • wpcap 找不到指定的模块

  • 如何以编程方式从桌面应用程序打开 HTML 页面?

  • Android Studio 中的 R.java 文件在哪里?

  • HashMap 初始化

  • 如何使用 lambda 表达式通过增加与原点的距离来对点进行排序?

  • 最大化窗口时如何调整元素大小?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5