MPAndroidChart绘制三角函数曲线

  • 最近项目中有个需求,通过正弦函数的相位变化来实现某个功能,整理了一下,供以后借鉴使用,点击下载

image

使用方式如下
1. build.gradle引用

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

dependencies {
    ...
    compile 'com.github.PhilJay:MPAndroidChart:v3.0.2'
}
  1. 引入布局
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.github.mikephil.charting.charts.LineChart
            android:id="@+id/lineChart1"
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:background="#434e64"/>

    </RelativeLayout>

2.试着绘制两条曲线,一条是默认的曲线,用于参考,一条曲线设置成相位移动的曲线



public class SinaActivity extends AppCompatActivity {
    private LineChart mChart;

    private Typeface tf;

    private SeekBar seekBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sina);
        tf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
        init();

        initSeekBar();

    }

    private void initSeekBar() {
        seekBar = (SeekBar) findViewById(R.id.seekBar);
        seekBar.setMax(127);
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                addEntry(seekBar.getProgress());
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });


    }

    /**
     * 改变数据
     *
     * @param progress
     */
    private void addEntry(int progress) {

        LineData data = mChart.getLineData();


        if (data != null) {

            LineDataSet lastSet = (LineDataSet) data.getDataSetByIndex(1);
            if (lastSet == null) {


            } else {

                data.removeDataSet(1);
                mChart.invalidate(); // refresh

                data.addDataSet(getDateLine(getValue(progress)));

            }



        }



    }


    public double getValue(int progress) {

        return 2 * Math.PI * progress / 127;

    }

    private void init() {


        mChart = (LineChart) findViewById(R.id.lineChart1);

        mChart.getDescription().setEnabled(false);
        /*是否可以触摸*/
        mChart.setTouchEnabled(true);
        /*是否显示表格颜色*/
        mChart.setDrawGridBackground(false);

        mChart.setDragEnabled(true);// 是否可以拖拽
        mChart.setScaleEnabled(true);// 是否可以缩放

        mChart.setData(generateLineData());
        mChart.animateX(3000);
        // 是否在折线图上添加边框
        mChart.setDrawBorders(false);


        Typeface tf = Typeface.createFromAsset(getAssets(), "OpenSans-Light.ttf");

        setLabel(tf);

        setYAxis(tf);

        setXAxis(tf);


    }

    /**
     * 设置标签说明
     *
     * @param tf
     */
    private void setLabel(Typeface tf) {
        Legend l = mChart.getLegend();
        l.setTypeface(tf);
        l.setTextColor(getResources().getColor(R.color.write));
    }

    /**
     * 设置Y轴
     *
     * @param tf
     */
    private void setYAxis(Typeface tf) {
        YAxis leftAxis = mChart.getAxisLeft();
        leftAxis.setTypeface(tf);
        leftAxis.setAxisMaximum(1.2f);
        leftAxis.setAxisMinimum(-1.2f);
        leftAxis.setTextColor(getResources().getColor(R.color.write));

        leftAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return "" + value;
            }
        });

       /*设置右侧显示坐标*/
        mChart.getAxisRight().setEnabled(false);
    }

    /**
     * 设置X轴
     *
     * @param tf
     */
    private void setXAxis(Typeface tf) {
        XAxis xAxis = mChart.getXAxis();
        xAxis.setEnabled(true);
        xAxis.setTextColor(getResources().getColor(R.color.write));
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setTextSize(10f);
        xAxis.setTextColor(Color.WHITE);
        xAxis.setDrawAxisLine(true);
        xAxis.setDrawGridLines(false);
        xAxis.setLabelCount(6);
        xAxis.setTypeface(tf);
        xAxis.setDrawGridLines(true);
        xAxis.setAxisMinimum(0);
        xAxis.setAxisMaximum(540);
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return (int) value / 10 + "m";
            }
        });
    }


    public double Sin(int i, double k) {
        double result = 0;
        //在这里我是写sin函数,其实可以用cos,tan等函数的,不信大家尽管试试
        //result = Math.cos(i * Math.PI / 180);
        result = Math.sin((i * Math.PI / 180) + k);
        //result = Math.tan(i * Math.PI / 180);
        return result;
    }

    /**
     * 默认曲线
     *
     * @return
     */
    protected LineDataSet getDefaultLine() {

        List<Entry> yVals = new ArrayList<>();
        for (int i = 0; i < 540; i++) {
            yVals.add(new Entry(i, (float) Sin(i, 0)));
        }
        LineDataSet ds1 = new LineDataSet(yVals, "sinA");
        ds1.setLineWidth(2f);
        ds1.setDrawCircles(false);
        //设置文字颜色
        ds1.setValueTextColor(getResources().getColor(R.color.write));
        //设置线的颜色
        ds1.setColor(Color.YELLOW);
        return ds1;
    }

    /**
     * 可变化的函数曲线
     *
     * @return
     */
    protected LineDataSet getDateLine(double x) {
        List<Entry> yVals = new ArrayList<>();
        for (int i = 0; i < 540; i++) {
            yVals.add(new Entry(i, (float) Sin(i, x)));
        }
        LineDataSet ds2 = new LineDataSet(yVals, "sinB");
        //设置线条宽度
        ds2.setLineWidth(2f);
        //设置有原点
        ds2.setDrawCircles(false);
        ds2.setColor(Color.GREEN);
        return ds2;

    }

    /**
     * 添加两条曲线的数据曲线数据
     *
     * @return
     */
    protected LineData generateLineData() {
        ArrayList<ILineDataSet> sets = new ArrayList<>();
        // load DataSets from textfiles in assets folders
        sets.add(getDefaultLine());
        sets.add(getDateLine(1));
        LineData d = new LineData(sets);
        d.setValueTypeface(tf);
        return d;
    }

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值