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

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

ChartView

2019-11-09 15:01:48
字體:
來源:轉載
供稿:網友

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
疯狂做受xxxx欧美肥白少妇| 精品无人区太爽高潮在线播放| 亚洲片在线资源| 精品二区三区线观看| 亚洲色图15p| yw.139尤物在线精品视频| 亚洲国产精品va在线看黑人| 91精品国产高清自在线看超| 久久精品影视伊人网| 怡红院精品视频| 日韩欧美成人精品| 亚洲最大成人在线| 久久婷婷国产麻豆91天堂| 在线观看久久久久久| 高清欧美性猛交| 国产大片精品免费永久看nba| 国产精品一二区| 91在线观看欧美日韩| 亚洲色图50p| 欧美超级免费视 在线| 亚洲国产天堂网精品网站| 国产日韩欧美另类| 色偷偷88888欧美精品久久久| 91在线无精精品一区二区| 中文字幕日韩欧美在线视频| 51久久精品夜色国产麻豆| 91天堂在线视频| 亚洲精品v欧美精品v日韩精品| 97国产在线视频| 国产一区二区三区视频| 亚洲成av人片在线观看香蕉| 欧美精品videos另类日本| 欧美日韩精品在线视频| 国产自产女人91一区在线观看| 国产精品网址在线| 日韩美女免费观看| 97超碰蝌蚪网人人做人人爽| 欧美大尺度在线观看| 日韩精品视频免费| 97超碰色婷婷| 精品毛片三在线观看| 日韩高清免费观看| 精品国产91久久久久久老师| 久久精品中文字幕电影| 中文字幕精品视频| 4k岛国日韩精品**专区| 亚洲一区二区久久| 国产日韩欧美在线| 欧美视频免费在线观看| 国产免费一区视频观看免费| 国产日韩av高清| 欧美多人乱p欧美4p久久| 亚洲人精品午夜在线观看| 亚洲综合小说区| 日韩av在线网站| 91精品国产综合久久香蕉| 日韩在线视频二区| 国外成人性视频| 欧美一区三区三区高中清蜜桃| 国产一区二区三区久久精品| 亚洲日本aⅴ片在线观看香蕉| 久久人体大胆视频| 久久精品最新地址| 亚洲天堂第一页| 久久久久久久久久久久av| 韩国福利视频一区| 国产精品视频免费观看www| 亚洲欧美日韩国产中文| 成人黄色激情网| 欧美在线视频网| 亚洲精品福利资源站| 国产精自产拍久久久久久| 久久久久久久影视| 国产精品99久久久久久久久| 欧美人与性动交| 亚洲国产天堂网精品网站| 日本欧美在线视频| 久久精品国产2020观看福利| 日韩电影中文字幕一区| 欧美激情欧美激情| 最近2019中文字幕在线高清| 91中文字幕一区| 久久手机精品视频| 国产日本欧美一区二区三区| 国产免费一区二区三区香蕉精| 精品成人乱色一区二区| 日韩精品在线免费播放| 欧美激情奇米色| 欧美日韩中文字幕日韩欧美| 韩国v欧美v日本v亚洲| 91av福利视频| 亚洲一区亚洲二区亚洲三区| 18性欧美xxxⅹ性满足| 欧美在线日韩在线| 国产视频精品va久久久久久| 51精品国产黑色丝袜高跟鞋| 久久夜色精品国产欧美乱| 九九热99久久久国产盗摄| 成人精品久久av网站| 久久久伊人欧美| 欧美日韩性视频| 国内免费精品永久在线视频| 亚洲国产精彩中文乱码av| 97国产真实伦对白精彩视频8| 蜜臀久久99精品久久久久久宅男| 亚洲欧美在线播放| 中文字幕精品www乱入免费视频| 国产日韩中文在线| 色狠狠av一区二区三区香蕉蜜桃| 一区二区三区四区在线观看视频| 欧美精品久久久久久久久久| 这里只有精品丝袜| 欧美午夜激情视频| 91在线播放国产| 91精品国产自产在线老师啪| 国产亚洲一区精品| 最近日韩中文字幕中文| 欧美重口另类videos人妖| 久久久久久91香蕉国产| 国产亚洲欧洲高清一区| 亚洲激情第一页| 日韩欧美成人网| 日韩成人av在线播放| 国产成人久久久| 欧美特级www| 中文字幕国产精品| 亚洲人成电影网站色…| 久久精品亚洲一区| 亚洲精品视频在线观看视频| 午夜精品一区二区三区在线视频| 欧美精品在线观看91| 九九热在线精品视频| www.久久色.com| 国产精品r级在线| 国产精品女人网站| 亚洲精品在线视频| 国内精品久久影院| 欧美日韩综合视频网址| 国产成人精品电影| 国内精品久久久久久| 欧美国产日本高清在线| 国产亚洲精品综合一区91| 成人情趣片在线观看免费| 亚洲成人黄色在线| 久热精品视频在线观看一区| 亚洲天堂av在线播放| 亚洲人成电影网站色xx| 欧美性高潮床叫视频| 日韩av中文字幕在线| 国产欧美日韩精品丝袜高跟鞋| 亚洲a区在线视频| 亚洲在线观看视频网站| 中文字幕精品影院| 亚洲有声小说3d| 亚洲精品98久久久久久中文字幕| 91欧美视频网站| 欧美高清一级大片| 97在线精品国自产拍中文| 欧美黑人性视频| 国产日产欧美a一级在线| 亚洲第一免费播放区| 一本色道久久88精品综合| 在线播放日韩欧美| 日韩风俗一区 二区|