天气折线图

来源:互联网 发布:淘宝站内其他是杭州ip 编辑:程序博客网 时间:2024/05/22 17:21

天气预报的App中都会存在气温变化的折线图,自定义了一个天气的折线图只要传入气温数组就能显示


import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;public class ChartView extends View {public int XPoint; // 原点的X坐标public int XScale; // X的刻度长度public int YScale; // Y的刻度长度public int Trange;public int Ysw;public int ToLength;public int maxLength;public int minLength;public int radiu;public int size;private int[] max;// 折线的转折点private int[] min;// 折线的转折点public Paint paint;public Paint paintText;public Paint paint1;private int Ysw1;private Paint paintFirst;private Paint paintFirst1;private int radiu1;public ChartView(Context context) {super(context);init(context);}public ChartView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public void setData(int[] max, int[] min) {if (max != null && max.length == 5) {this.max = max;}if (min != null && min.length == 5) {this.min = min;}postInvalidate();}private void init(Context context) {//ScreenUtil是dip转化px的工具类size = ScreenUtil.sp2px(context, 12);radiu = ScreenUtil.dip2px(context, 3);radiu1 = ScreenUtil.dip2px(context, 4);Trange = ScreenUtil.dip2px(context, 22);int strokeWidth = ScreenUtil.dip2px(context, 2);//第一条折线的实心园的画笔paint = new Paint();paint.setStrokeWidth(strokeWidth);paint.setStyle(Paint.Style.FILL);paint.setAntiAlias(true);// 去锯齿paint.setColor(getResources().getColor(R.color.broken_line_orange));// 颜色//第一条折线的空心园的画笔paintFirst = new Paint();paintFirst.setStrokeWidth(strokeWidth);paintFirst.setStyle(Paint.Style.STROKE);paintFirst.setAntiAlias(true);// 去锯齿paintFirst.setColor(getResources().getColor(R.color.broken_line_orange));// 颜色//文字的画笔paintText = new Paint();paintText.setStyle(Paint.Style.STROKE);paintText.setAntiAlias(true);// 去锯齿paintText.setColor(getResources().getColor(R.color.white));// 颜色paintText.setTextSize(size); // 设置轴文字大小//第二条折线的实心园的画笔paint1 = new Paint();paint1.setStrokeWidth(strokeWidth);paint1.setStyle(Paint.Style.FILL);paint1.setAntiAlias(true);// 去锯齿paint1.setColor(getResources().getColor(R.color.broken_line_azure));// 颜色//第二条折线的空心园的画笔paintFirst1 = new Paint();paintFirst1.setStrokeWidth(strokeWidth);paintFirst1.setStyle(Paint.Style.STROKE);paintFirst1.setAntiAlias(true);// 去锯齿paintFirst1.setColor(getResources().getColor(R.color.broken_line_azure));// 颜色}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 重写onDraw方法if (max == null || min == null) {return;}XScale = getWidth() / 5;YScale = getHeight();XPoint = XScale / 2;ToLength = (YScale - Trange * 2) / 8;maxLength = Trange + ToLength;if (getMax(max) - getMin(max) == 0 || getMax(min) - getMin(min) == 0) {Ysw = 0;Ysw1 = 0;} else {Ysw = (YScale - Trange * 2) / (4 * (getMax(max) - getMin(max)));Ysw1 = (YScale - Trange * 2) / (4 * (getMax(min) - getMin(min)));}minLength = YScale / 2 + ToLength;for (int i = 0; i < max.length; i++) {if (i == 0) {canvas.drawCircle(XPoint + XScale * i, maxLength + Ysw* (getMax(max) - max[i]), radiu, paintFirst);}else{canvas.drawCircle(XPoint + XScale * i, maxLength + Ysw* (getMax(max) - max[i]), radiu1, paint);}canvas.drawText(String.valueOf(max[i]) + "°", XPoint + XScale * i- size / 2, maxLength + Ysw * (getMax(max) - max[i]) - ScreenUtil.dip2px(getContext(), 10),paintText);if (i > 0) {canvas.drawLine(XPoint + XScale * (i - 1) + radiu, maxLength+ Ysw * (getMax(max) - max[i - 1]), XPoint + XScale * i- radiu, maxLength + Ysw * (getMax(max) - max[i]),paint);}}for (int i = 0; i < min.length; i++) {if (i == 0) {canvas.drawCircle(XPoint + XScale * i, minLength + Ysw1* (getMax(min) - min[i]), radiu, paintFirst1);}else{canvas.drawCircle(XPoint + XScale * i, minLength + Ysw1* (getMax(min) - min[i]), radiu1, paint1);}canvas.drawText(String.valueOf(min[i]) + "°", XPoint + XScale * i- size / 2, minLength + Ysw1 * (getMax(min) - min[i])+ ScreenUtil.dip2px(getContext(), 20), paintText);if (i > 0) {canvas.drawLine(XPoint + XScale * (i - 1) + radiu, minLength+ Ysw1 * (getMax(min) - min[i - 1]), XPoint + XScale* i - radiu, minLength + Ysw1 * (getMax(min) - min[i]),paint1);}}}public int getMin(int[] arr) {int min = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] < min)min = arr[i];}return min;}public int getMax(int[] arr) {int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;}}

0 0