最近公司做的项目中要用到折线图,网上看了下都不是很能满足自己的需要,因此就自己写了个,废话不说了,直接上代码
package com.example.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; import android.graphics.Typeface; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.widget.Scroller; import com.example.aa.R; /** * LastTNT * @author 翟昆 * @date 2014-5-6 上午10:28:53 * @version 1.0 */ public class LineChartView extends View { private int mov_x; // 移动X坐标 private int mov_y; // 移动Y坐标 private int diff_Y; // Y轴高度 private Paint paint;// 声明画笔 private int color_xy = Color.rgb(77, 189, 235);//设置标线颜色 private int line_color_y = Color.rgb(18, 197, 255);//标注线的颜色 private int zhexian_color = Color.rgb(21, 139, 229);//折线的颜色 private int Guides_line_color = Color.rgb(229, 21, 60);//参考线的颜色 private int text_color = Color.rgb(254, 102, 1);//折线字体颜色 private int width_xy = 4;//设置标线宽度 private int line_width_y = 2;//标注线的宽度 private int zhexian_width = 4;//折线的宽度 int init_x = 0;//初始按下的X坐标 int init_left = 0;//左边距 private int MAX_X = 2000; private int MAX_X_Extend = 100;//向右侧继续延伸100 private int MAX_Y = 100;//Y轴最大值 private int lineNum = 24; //标线份数 private int lineInterval_x =0;//标线间隔 private int lineInterval_y = 0;//标注线间隔 private int width = 0;//控件宽度 private int height = 0;//控件高度 private Bitmap bmp;//标记点的图 private int Guides_line = 80;//参考线 private float textSize = 22;//折线图字体大小 private float CalloutSize = 18;//标注字体大小 private PaintFlagsDrawFilter pfd; private Matrix matrix = new Matrix(); private int paddingBottom = 50; private int paddingTop = 10; private int[] nums = new int[24]; //实现惯性滑动效果 private Scroller mScroller; private int mTouchSlop; private int mMinimumVelocity; private int mMaximumVelocity; public LineChartView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public LineChartView(Context context) { super(context); } public LineChartView(Context context, AttributeSet attrs) { super(context, attrs); paint = new Paint(); pfd = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); paint.setAntiAlias(true); matrix.postScale(1f, 1f); lineInterval_x = MAX_X/lineNum; bmp = BitmapFactory.decodeResource(getResources(), R.drawable.point); for (int i = 0; i < nums.length; i++) { nums[i] = (int) (Math.random()*MAX_Y); } } // void init(Context context) { // mScroller = new Scroller(getContext()); // setFocusable(true); // setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); // setWillNotDraw(false); // final ViewConfiguration configuration = ViewConfiguration.get(context); // mTouchSlop = configuration.getScaledTouchSlop(); // mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); // mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); // // } @Override protected void onDraw(Canvas canvas) { if(init_left==0){ init_left = this.getLeft(); } if(width==0){ width = this.getRight()-this.getLeft(); height = this.getBottom() - this.getTop(); lineInterval_y = (height*2/3)/MAX_Y; } diff_Y = this.getBottom() - this.getTop(); // 设置画布颜色 也就是背景颜色 canvas.drawColor(Color.TRANSPARENT); paint.setColor(Color.BLACK); canvas.drawText("绘制无规则几何图形喔!!!", 150, 30, paint); //绘制X坐标轴 paint.setColor(color_xy); paint.setStrokeWidth(width_xy); canvas.drawLine(paddingBottom, diff_Y-paddingBottom, MAX_X+paddingBottom+MAX_X_Extend, diff_Y-paddingBottom, paint); //绘制Y坐标轴 paint.setColor(color_xy); paint.setStrokeWidth(width_xy); canvas.drawLine(paddingBottom, diff_Y-paddingBottom, paddingBottom, this.getTop()+paddingTop, paint); //绘制标注线 for (int i = 1; i <=lineNum; i++) { paint.setColor(line_color_y); paint.setStrokeWidth(line_width_y); canvas.drawLine(paddingBottom+lineInterval_x*i, diff_Y-paddingBottom, paddingBottom+lineInterval_x*i, this.getTop()+paddingTop, paint); //绘制标注线下的字体 paint.setColor(Color.BLACK); paint.setTextSize(CalloutSize); paint.setTextScaleX(1.0f);//设置文本缩放 paint.setTypeface(Typeface.SERIF); canvas.drawText("6日"+i+"时", paddingBottom+lineInterval_x*i-20, diff_Y-paddingBottom+20, paint); } //绘制参考线 paint.setColor(Guides_line_color); paint.setStrokeWidth(width_xy); canvas.drawLine(paddingBottom, diff_Y-paddingBottom-lineInterval_y*Guides_line, MAX_X+paddingBottom+MAX_X_Extend, diff_Y-paddingBottom-lineInterval_y*Guides_line, paint); //绘制参考线标注 paint.setColor(text_color); paint.setTextSize(textSize); paint.setTextScaleX(1.0f);//设置文本缩放 paint.setTypeface(Typeface.SERIF); canvas.drawText(Guides_line+"", paddingBottom-30, diff_Y-paddingBottom-lineInterval_y*Guides_line+5, paint); //绘制折线 for (int i = 1; i < nums.length; i++) { int temp = nums[i-1]; if(temp==0){ temp = 10; } int temp1 = nums[i]; if(temp1==0){ temp1 = 10; } paint.setColor(zhexian_color); paint.setStrokeWidth(zhexian_width); canvas.drawLine(paddingBottom + lineInterval_x * i, (diff_Y - paddingBottom) - (lineInterval_y * temp), paddingBottom+lineInterval_x*(i+1), (diff_Y-paddingBottom)-(lineInterval_y*temp1), paint); } //绘制折线点 for (int i = 1; i <= nums.length; i++) { int temp = nums[i-1]; if(temp==0){ temp = 10; } // 绘制一个圆形 canvas.drawBitmap(bmp, paddingBottom+lineInterval_x*i-8, (diff_Y-paddingBottom)-(lineInterval_y*temp)-5, paint); paint.setColor(text_color); paint.setTextSize(textSize); paint.setTextScaleX(1.0f);//设置文本缩放 //设置字体样式 Typeface.DEFAULT:默认字体;Typeface.DEFAULT_BOLD:加粗字体;Typeface.MONOSPACE:monospace;Typeface.SANS_SERIF:sans;Typeface.SERIF:serif paint.setTypeface(Typeface.SERIF); canvas.drawText(temp+"", paddingBottom+lineInterval_x*i-8, (diff_Y-paddingBottom)-(lineInterval_y*temp)-10, paint); } } @Override public boolean onTouchEvent(MotionEvent event) { mov_x = (int) event.getX(); switch (event.getAction()) { case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_DOWN: init_x = (int) event.getX(); break; case MotionEvent.ACTION_MOVE: int diff_left = this.getLeft() + mov_x - init_x; int diff_right = MAX_X+paddingBottom+MAX_X_Extend-width;//向左滑动的最大距离 if (diff_left < init_left) { if(diff_right>0&&diff_left>-diff_right){ this.setLeft(diff_left); }else{ this.setLeft(-diff_right); } }else{ this.setLeft(init_left); } break; } return true; } }