亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ChartView

2019-11-09 16:17:02
字體:
來源:轉載
供稿:網友

package com.wei.demo.view;

import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.graphics.Typeface; import android.support.annotation.Dimension; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; import android.view.ViewConfiguration; import android.webkit.WebSettings; import android.widget.TextView; import android.widget.Toast;

import com.wei.demo.ColumnBean; import com.wei.demo.ColumnLocation;

import java.security.NoSuchAlgorithmException; import java.text.DecimalFormat; import java.util.ArrayList;

/** * Created by ${wei} on 2016/12/15. */

public class ChartView extends SurfaceView { PRivate static final String TAG = “zpy_ChartView”;

private ArrayList<ColumnBean> list = new ArrayList<>();private Context context;//默認線的顏色private static final String LINECOLOR = "#666666";//負值的顏色private static final String BLUECOLOR = "#8800ffff";//正值的顏色private static final String REDCOLOR = "#666666";//邊距private final int MARGIN = 24;private final int MARGINTOP = 48;private final int MARGINBOTTOM = 48;private final int VERTICALSPEC = 10;//柱狀圖間距private int mHeight;private int mWidth;private int avarageLine;private float mColumnWidth;private double avarageValue;//平均值private GestureDetector gestureDetector;private int touchSlop;private int downX;private static boolean isLongPress;private final int STOREWIDTH = 3;//底部背景日期顏色private final String COLOR_BOTTOMDATEBG = "#88E2EBF9";//底部日期顏色private final String COLOR_BOTTOMDATE = "#66666666";//虛線的顏色private final String COLOR_DASHLINE = "#999999";//邊框的顏色private final String COLOR_BOX = "#999999";private int index;private boolean isCanvas;private int dateIndex;private boolean isSet;private int orange;private boolean isMoveLeft, isMoveRight;private int textsize = 14;private ArrayList<ColumnLocation> locations = new ArrayList<>();public ChartView(Context context) { super(context); init(context);}public ChartView(Context context, AttributeSet attrs) { super(context, attrs); init(context);}public ChartView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w - MARGIN * 2; mHeight = h - MARGINTOP - MARGINBOTTOM * 2; //每個柱狀圖的寬度 整體寬度-左右邊距 - 左右線的寬度 - 間隔 mColumnWidth = (mWidth - STOREWIDTH * 2 - VERTICALSPEC * 30) / 31.0f;}private void init(Context context) { this.context = context; //系統認為最小的滑動距離 isSet = false; touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); setLayerType(View.LAYER_TYPE_SOFTWARE, null); gestureDetector = new GestureDetector(context, new MyGustrueListener()); textsize = dp2px(textsize);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(widthSize, heightSize);}@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); //繪制邊框及虛線 drawBox(canvas); if (isSet) { //繪制左側數值 drawLeftText(canvas); //繪制柱狀圖 //平均值不等于0 的時候開始繪制 drawColumnBitmap(canvas); }}@Overridepublic boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: downX = (int) event.getX(); break; case MotionEvent.ACTION_MOVE: int moveX = (int) event.getX(); int moveY = (int) event.getY(); int diffX = Math.abs(moveX - downX); int finalMoveX = moveX - MARGIN;//減去左側邊距 //滑動只在范圍內開始繪制虛線 if (isLongPress && moveX > MARGIN && moveX < (mWidth + MARGIN) && moveY > MARGINTOP && moveY < (MARGINTOP + mHeight)) { if (diffX >= touchSlop) { isCanvas = true; calculateLong(finalMoveX); } else { isCanvas = false; } } else { isCanvas = false; if (list.size() > 31) { if (moveX - downX > 0 && !isMoveLeft) { orange = moveX - downX + orange; downX = (int) event.getX(); postInvalidate(); } else if (moveX - downX < 0 && !isMoveRight) { orange = moveX - downX + orange; downX = (int) event.getX(); postInvalidate(); } } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: isLongPress = false; postInvalidate(); break; } return gestureDetector.onTouchEvent(event);}/** * 繪制框架 */private void drawBox(Canvas canvas) { Paint paint = getLinePaint(); //繪制邊框 Path path = new Path(); path.moveTo(MARGIN, MARGINTOP); path.lineTo(mWidth + MARGIN, MARGINTOP); path.lineTo(mWidth + MARGIN, mHeight + MARGINTOP); path.lineTo(MARGIN, mHeight + MARGINTOP); path.lineTo(MARGIN, MARGINTOP); path.close(); canvas.drawPath(path, paint); path.reset(); //平均值 avarageLine = mHeight / 6; //繪制橫線 paint.setPathEffect(new DashPathEffect(new float[]{8, 8}, 0)); paint.setColor(Color.parseColor(COLOR_DASHLINE)); for (int i = 1; i <= 5; i++) { int startY = MARGINTOP + avarageLine * i; canvas.drawLine(MARGIN, startY, mWidth + MARGIN, startY, paint); }}/** * 繪制左側數值 **/private void drawLeftText(Canvas canvas) { Paint paint = getTextPaint(COLOR_BOTTOMDATE, 30); int maxValueIndex = getMaxValueIndex(); if (maxValueIndex == -1) { return; } double[] doubles = calculateAvarage(list.get(maxValueIndex).getValue()); if (doubles == null || doubles.length == 0) { return; } String[] leftValues = new String[doubles.length]; //轉換成字符串 for (int i = 0; i < doubles.length; i++) { double aDouble = doubles[i]; if (aDouble > 0) { leftValues[i] = String.valueOf(String.format("%s%s", "+", formatValue(aDouble))); } else if (aDouble == 0) { leftValues[i] = String.valueOf(String.format("%s", "0.00")); } else leftValues[i] = String.valueOf(formatValue(aDouble)); } for (int i = 0; i < leftValues.length; i++) { canvas.drawText(leftValues[i], MARGIN + 10, MARGINTOP - 10 + avarageLine * i, paint); } paint.reset();}/** * 繪制柱狀圖 */private void drawColumnBitmap(Canvas canvas) { if (list == null || list.size() == 0) { Toast.makeText(context, "沒有數據", Toast.LENGTH_SHORT).show(); return; } Paint paint = getLinePaint(); paint.setStyle(Paint.Style.FILL); int centerLine = avarageLine * 3 + MARGINTOP; ColumnBean columnBean = list.get(0); String date_value = columnBean.getDate(); dateIndex = Integer.valueOf(date_value.substring(date_value.lastIndexOf("-") + 1)) - 1; for (int i = 0; i < list.size(); i++) { ColumnBean columnBean2 = list.get(i); String date2 = columnBean2.getDate(); int index2 = Integer.valueOf(date2.substring(date2.lastIndexOf("-") + 1)) - 1; //每個柱圖的高度 double value = list.get(i).getValue(); double percent = value / avarageValue;//比例 double endY = Math.abs(percent * avarageLine); //y點的結束點 if (value < 0) { paint.setColor(Color.GREEN); endY = centerLine + endY; } else { paint.setColor(Color.RED); endY = centerLine - endY; } endY = formatValue(endY); int startX = ((int) (index2 * (mColumnWidth + VERTICALSPEC) + MARGIN + STOREWIDTH) /*+ orange*/); int endX = (int) (startX + mColumnWidth); int left = MARGIN + STOREWIDTH;

// if (i == 0 && startX >= left) { // isMoveLeft = true; // isMoveRight = false; // } // // if (i == list.size() - 1 && endX <= MARGIN + STOREWIDTH + mWidth) { // isMoveRight = true; // isMoveLeft = false; // } // // if (startX < left && endX > left) { // startX = left; // } // int right = left + mWidth; // if (endY > right && startX < right) { // endX = right; // } // Log.e(TAG, “drawColumnBitmap: endx = ” + endX + ” startX = ” + startX + ” i = ” + i + ” ismoveleft = ” + isMoveLeft); // if (startX >= left && endX <= right) { Rect rect = new Rect(); rect.left = startX; rect.top = value < 0 ? centerLine : (int) endY; rect.right = endX; rect.bottom = value < 0 ? (int) endY : centerLine; canvas.drawRect(rect, paint); // } } //非常按時繪制底部日期 if (!isLongPress) { paint.setTextSize(textsize); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.parseColor(COLOR_BOTTOMDATE)); String startDate = list.get(0).getDate(); String endDate = list.get(list.size() - 1).getDate(); float textWidth = paint.measureText(startDate); int startX = (int) ((dateIndex * (mColumnWidth + VERTICALSPEC) + MARGIN + STOREWIDTH) - textWidth / 2); int endStartX = (int) ((dateIndex + list.size() - 1) * (mColumnWidth + VERTICALSPEC) + MARGIN + STOREWIDTH - textWidth / 2);

if (startX < MARGIN + STOREWIDTH) { startX = MARGIN + STOREWIDTH; } if (endStartX + textWidth > MARGIN + STOREWIDTH + mWidth) { endStartX = (int) (MARGIN + mWidth - textWidth); } canvas.drawText(startDate, startX, MARGINTOP + mHeight +textsize, paint); canvas.drawText(endDate, endStartX, MARGINTOP + mHeight + textsize, paint); } //繪制虛線 if (isLongPress) { paint.setPathEffect(new DashPathEffect(new float[]{8, 8}, 0)); paint.setStrokeWidth(STOREWIDTH); paint.setColor(Color.GRAY); int startX = (int) ((index + dateIndex) * (mColumnWidth + VERTICALSPEC) + MARGIN + STOREWIDTH + mColumnWidth / 2); canvas.drawLine(startX, MARGINTOP, startX, MARGINTOP + mHeight, paint); paint.reset(); String date = list.get(index).getDate(); drawBottomText(canvas, paint, startX, date); Log.e(TAG, "drawColumnBitmap: date = " + date); }}/** * 繪制底部日期及背景 * * @param text 文本 * @param startX 線的起始點X軸 */private void drawBottomText(Canvas canvas, Paint paint, int startX, String text) { paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(STOREWIDTH); //繪制底部日期 paint.setTextSize(40); paint.setColor(Color.parseColor(COLOR_BOTTOMDATEBG)); int textLength = (int) paint.measureText(text); int right = startX + textLength / 2 + VERTICALSPEC; int left = startX - textLength / 2 - VERTICALSPEC; if (left < MARGIN) { left = MARGIN; right = left + textLength + VERTICALSPEC * 2; } if (right > MARGIN + mWidth) { right = MARGIN + mWidth; left = right - textLength - VERTICALSPEC * 2; } //繪制日期的背景 Rect rect = new Rect(left, MARGINTOP + mHeight + VERTICALSPEC, right, MARGINTOP + mHeight + 50 + VERTICALSPEC); canvas.drawRect(rect, paint); //繪制底部日期 paint.setTextSize(40); paint.setTypeface(Typeface.DEFAULT); paint.setTextAlign(Paint.Align.LEFT); paint.setColor(Color.parseColor(COLOR_BOTTOMDATE)); canvas.drawText(text, left + VERTICALSPEC, MARGINTOP + mHeight + 40 + VERTICALSPEC, paint);}/** * 計算長按事件的位置 * * @param finalMoveX 去除左側邊距的位置 */private void calculateLong(int finalMoveX) { index = (int) ((finalMoveX - VERTICALSPEC / 2) / (mColumnWidth + VERTICALSPEC)); if (index > dateIndex + list.size() - 1) { index = list.size() - 1; } else if (index < dateIndex) { index = 0; } else { index = Math.abs(index - dateIndex); } if (index < 0) { index = 0; } postInvalidate();}/** * 虛線及邊框的畫筆 */private Paint getLinePaint() { Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(STOREWIDTH); paint.setAntiAlias(true); paint.setAlpha(0); paint.setColor(Color.parseColor(COLOR_BOX)); return paint;}/** * 獲取繪制文本的畫筆 * * @param textColor 文本顏色 * @param textSize 文本大小 * @return */private Paint getTextPaint(String textColor, int textSize) { Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(STOREWIDTH); paint.setAntiAlias(true); paint.setTextSize(textSize); paint.setAlpha(0); paint.setTypeface(Typeface.DEFAULT); paint.setTextAlign(Paint.Align.LEFT); paint.setColor(Color.parseColor(textColor)); return paint;}/** * 獲取最大值的索引 如果沒有數據返回-1 */private int getMaxValueIndex() { if (list == null || list.size() == 0) { Toast.makeText(context, "沒有數據", Toast.LENGTH_SHORT).show(); return -1; } int size = list.size(); double indexValue = Math.abs(list.get(0).getValue()); int index = 0; for (int i = 1; i < size; i++) { double tempValue = Math.abs(list.get(i).getValue()); if (tempValue > indexValue) { indexValue = tempValue; index = i; } } return index;}//設置數據public void setData(ArrayList<ColumnBean> list) { this.list = list; isSet = true; postInvalidate();}//計算平均值 并把左側文案放到數組中private double[] calculateAvarage(double maxValue) { if (maxValue == 0) { Toast.makeText(context, "最大值不能是0", Toast.LENGTH_SHORT).show(); return null; } avarageValue = maxValue / 3; double[] textValue = new double[7]; int tempIndex = 3; //如果最大值是小數則 大-->小 設置數據 if (maxValue > 0) { for (int i = 0; i < 7; i++) { textValue[i] = formatValue(avarageValue * (tempIndex--)); if (tempIndex + 1 == 0) { textValue[i] = 0.00f; } } } else { for (int i = 6; i >= 0; i--) { textValue[i] = formatValue(avarageValue * (tempIndex--)); if (tempIndex + 1 == 0) { textValue[i] = 0.00f; } } } return textValue;}/** * 全部轉換為兩位小數 */private double formatValue(double value) { DecimalFormat decimalFormat = new DecimalFormat("#.00"); return Double.valueOf(decimalFormat.format(value));}private int dp2px(int dpValue) { float density = context.getResources().getDisplayMetrics().density; return (int) (dpValue * density + 0.5f);}private int px2dp(int pxValue) { float density = context.getResources().getDisplayMetrics().density; return (int) (pxValue / density + 0.5f);}private class MyGustrueListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDown(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { isLongPress = true; calculateLong((int) (e.getX() - MARGIN)); }}

}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
96国产粉嫩美女| 国产欧美亚洲精品| 亚洲精品在线观看www| 91国产美女视频| 国产一区二区激情| 亚洲一区二区自拍| 国产一区二区三区免费视频| 欧美日韩亚洲系列| 亚洲成人性视频| 欧美午夜无遮挡| 久久久久北条麻妃免费看| 欧美人在线视频| 国产+成+人+亚洲欧洲| 成人激情av在线| 国产日韩欧美电影在线观看| 日韩精品亚洲元码| 日韩电影视频免费| 欧美色欧美亚洲高清在线视频| 亚洲人成伊人成综合网久久久| 国产va免费精品高清在线观看| 亚洲人成亚洲人成在线观看| 揄拍成人国产精品视频| 国产69精品久久久久久| 精品在线观看国产| 欧美一级在线播放| 欧美中文在线观看| 中文字幕日韩电影| 91久久精品美女高潮| 成人性教育视频在线观看| 91精品国产乱码久久久久久久久| 欧美黄网免费在线观看| 国产有码在线一区二区视频| 久久久极品av| 一个色综合导航| 国产精品久久久久久超碰| 久久久国产精品x99av| 国产成人精品一区二区在线| xvideos亚洲人网站| 尤物九九久久国产精品的分类| 久久久999成人| 亚洲午夜未删减在线观看| 久久久久国产精品一区| 成人福利在线视频| 精品久久久久久电影| 亚洲精品成a人在线观看| 成人乱人伦精品视频在线观看| 黑人狂躁日本妞一区二区三区| 亚洲成人久久久久| 最新日韩中文字幕| 日韩精品久久久久久久玫瑰园| 日韩av影视综合网| 亚洲美女av在线| 欧美成人免费网| 色婷婷久久一区二区| 日韩欧美国产免费播放| 高清一区二区三区日本久| 精品性高朝久久久久久久| 国产区精品在线观看| 国产精品色午夜在线观看| 欧美亚洲另类视频| 成人国产精品一区二区| 亚洲人成啪啪网站| 一级做a爰片久久毛片美女图片| 国产亚洲精品高潮| 色先锋久久影院av| 欧洲成人免费视频| 色偷偷888欧美精品久久久| 国产69精品99久久久久久宅男| 国产激情999| 红桃视频成人在线观看| 欧美国产第一页| 欧美激情a∨在线视频播放| 亚洲福利视频二区| 国产成人一区二区三区电影| 日韩经典中文字幕在线观看| 国产成人精品a视频一区www| 亚洲综合色av| 97国产suv精品一区二区62| 精品精品国产国产自在线| 一区二区三区在线播放欧美| 久久精品91久久香蕉加勒比| 日韩欧美在线字幕| 国产精品都在这里| 欧美电影在线观看| 成人黄色av播放免费| 日韩电影免费在线观看中文字幕| 欧美一级成年大片在线观看| 91亚洲永久免费精品| 欧美高清视频一区二区| 久久激情视频免费观看| 亚洲春色另类小说| 久久精品99无色码中文字幕| 国产精品视频网址| 久久av.com| 国产精品爽爽ⅴa在线观看| 久久福利视频导航| 国产小视频国产精品| 亚洲免费视频一区二区| 亚洲小视频在线| 亚洲人成网站777色婷婷| 国产精品久久久久福利| 久久综合久中文字幕青草| 日韩av在线电影网| 欧美日韩国产丝袜美女| 亚洲人av在线影院| 久久露脸国产精品| 国产成人精品电影| 欧美日韩日本国产| 亚洲成人在线网| xxx一区二区| 亚洲va久久久噜噜噜久久天堂| 国产精品99蜜臀久久不卡二区| www亚洲欧美| 九九精品视频在线| 亚洲第一视频在线观看| 欧美二区在线播放| 黄网站色欧美视频| 亚洲一区二区在线播放| 精品久久久一区| 欧美xxxx18性欧美| 亚洲人高潮女人毛茸茸| 亚洲国产成人一区| 亚洲精品资源在线| 精品国模在线视频| 国产www精品| 91国语精品自产拍在线观看性色| 国产三级精品网站| 一区二区三区四区精品| 亚洲大胆美女视频| 亚洲精品永久免费精品| 亚洲图片欧美日产| 91av国产在线| 国产va免费精品高清在线观看| 日韩成人黄色av| 亚洲欧洲在线观看| 国产精品久久在线观看| 成人激情视频在线播放| 欧美日韩国产激情| 国产精品美女久久久久av超清| 亚洲福利影片在线| 久99久在线视频| wwwwwwww亚洲| 中文字幕一区二区三区电影| 欧美肥老太性生活视频| 亚洲成av人影院在线观看| 亚洲精品国精品久久99热一| 51精品在线观看| 久久亚洲国产成人| 久久精品视频中文字幕| 国产中文日韩欧美| 亚洲国产精品高清久久久| 成人黄色av播放免费| 日韩av在线最新| 精品中文字幕在线观看| 日韩一区二区av| 久久国产精品网站| 日韩成人中文字幕在线观看| 国产精品久久久999| 亚洲女人天堂av| 日韩h在线观看| 国产精品久久久久久久久久三级| 91大神在线播放精品| 欧美成年人视频网站| 欧美成人精品在线|