How to make line with rounded (smooth) corners with AndroidPlot

后端 未结 5 2118
挽巷
挽巷 2020-12-05 08:27

I have a small problem with ploting my graph. On a picture below is what I have already done.


The graph should represent the actual signal strength of availabl

5条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-05 09:17

    1- I guess that you only use a few points to draw graphs of signals. All graph/chart applications try to connect points with direct lines and then your chart will be shown. So if you only use three points, your graph will looks like a triangle! If you want your graph to be curved, you have to add more points. Then it comes out like a curve.

    2- Or you can find any library that can draw sin graph, for example GraphView Library. Then try to draw this function:

    Enter image description here

    So it looks like to this:

    Enter image description here

    Then translate it to (a,0), so result seems like what you want.

    3- And another way, you can use built in Math.sin in Java:

    Chose for example 1000 point in range a to b and compute value of above function for each point and finally create a path and show them in a canvas.

    You can use quadTo (float x1, float y1, float x2, float y2) that simplify drawing quad curves for you. The documentation says:

    Add a quadratic bezier from the last point, approaching control point (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for this contour, the first point is automatically set to (0,0).

    Parameters

    x1 The x-coordinate of the control point on a quadratic curve
    y1 The y-coordinate of the control point on a quadratic curve
    x2 The x-coordinate of the end point on a quadratic curve
    y2 The y-coordinate of the end point on a quadratic curve

    Finally, I add a simple class that extends View and can draw a curve that looks like what you want:

    public class SinWave extends View {
    
        private float first_X = 50;
        private float first_Y = 230;
        private float end_X = 100;
        private float end_Y = 230;
        private float Max = 50;
    
        public SinWave(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Paint paint = new Paint() {
                {
                    setStyle(Paint.Style.STROKE);
                    setStrokeCap(Paint.Cap.ROUND);
                    setStrokeWidth(0.7f);
                    setAntiAlias(true);
                    setColor(0xFFFF00FF);
                }
            };
            final Path path = new Path();
            path.moveTo(first_X, first_Y);
            path.quadTo((first_X + end_X)/2, Max, end_X, end_Y);
            canvas.drawPath(path, paint);
        }
    }
    

    The result must look like this:

    Enter image description here

    You can add more methods to the class and change it to increase performance!

提交回复
热议问题