国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

TimeSharingView

2019-11-09 15:01:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

分時(shí)圖,可長(zhǎng)按出現(xiàn)焦點(diǎn)

package com.wei.demo.view;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.DashPathEffect;

import android.graphics.LinearGradient;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.Rect;

import android.graphics.Shader;

import android.graphics.Typeface;

import android.util.AttributeSet;

import android.util.Log;

import android.view.GestureDetector;

import android.view.MotionEvent;

import android.view.View;

import android.widget.Toast;

import com.wei.demo.ColumnBean;

import com.wei.demo.bean.PointF;

import com.wei.demo.utils.StringUtil;

import java.text.DecimalFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

/**

Created by ${wei} on 2017/1/4.

*/

public class TimeSharingView extends View {

PRivate static final String TAG = "zpy_TimeSharingView";//邊框的顏色private final String COLOR_BOX = "#999999";private final String TEXT_COLOR = "#666666";//線的顏色private final String COLOR_BLUE = "#429ae6";//背景漸變色private final String COLOR_BLUE_ALPHA = "#429ae6";//底部背景日期顏色private final String COLOR_BOTTOMDATEBG = "#88E2EBF9";//底部日期顏色private final String COLOR_BOTTOMDATE = "#66666666";/** * 線的顏色 */private final String COLOR_LINE = "#275CAA";/** * 一屏展示的總數(shù) */private int totalPoints = 48;/** * 橫向間距 */private float spacPointHorizontal = 0, spacVertical = 0, spac = 4;private float spacLineHorizontal = 0.0f;/** * 邊距 */private static final float MARGINTOP = 48, MARGINBOTTOM = 48;//左右邊距private static final float MARGINLEFT = 24, MARGINRIGHT = 24;//邊框內(nèi)的x y 的起始private float leftSpac = 0;//框的左邊的起始點(diǎn),包括左側(cè)文案的寬度private float mWidth, mHeight;private int leftTextSize = 12, textSize = 14;private String[] times = new String[]{"9:30", "10:30", "11:30", "14:00", "15:00"};private String[] leftValue = new String[9];private ArrayList<ColumnBean> list;private boolean isSet = false;private Context context;private double midValue = 1.0000;/** * 最大值 */private double maxValue;private double avarageValue;//平均值/** * 浮動(dòng)值 */private double floatingValue = 0.02f;private ArrayList<PointF> pointLists = new ArrayList<>();private Path linePath, alphaPath;private long moringTime;private long midTime;private long afterTime;private GestureDetector detector;private boolean isLongPress;public TimeSharingView(Context context) { this(context, null);}public TimeSharingView(Context context, AttributeSet attrs) { this(context, attrs, 0);}public TimeSharingView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context);}private void init(Context context) { this.context = context; //去掉硬件加速 setLayerType(LAYER_TYPE_SOFTWARE, null); setBackgroundColor(Color.WHITE); leftTextSize = dp2px(leftTextSize); textSize = dp2px(textSize); detector = new GestureDetector(context, new MyGestureListener());}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w - MARGINLEFT - MARGINRIGHT; mHeight = h - MARGINBOTTOM - MARGINTOP - MARGINBOTTOM; spacVertical = mHeight / 8;//縱向間距 spac = dp2px((int) spac); formatFinalTiem();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); widthMeasureSpec = MeasureSpec.getSize(widthMeasureSpec); heightMeasureSpec = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);}float downX = 0;@Overridepublic boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); break; case MotionEvent.ACTION_MOVE: if (isLongPress) { downX = event.getX(); postInvalidate(); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: isLongPress = false; postInvalidate(); break; } return detector.onTouchEvent(event);}@Overrideprotected void onDraw(Canvas canvas) { drawBoxPath(canvas);//繪制邊框及中間線 if (isSet) { drawLeftText(canvas);//繪制左側(cè)凈值 drawBottomText(canvas);//繪制底部時(shí)間 drawLine(canvas);//繪制分時(shí)曲線 drawLong(canvas);//長(zhǎng)按繪制 }}/** * 繪制布局 */private void drawBoxPath(Canvas canvas) { Paint paint = getPathPaint(); paint.setTextSize(leftTextSize); //測(cè)量maxValue的寬度 float textWidth = paint.measureText(get4Decimal(maxValue)); leftSpac = MARGINLEFT + textWidth + spac; float width = mWidth - textWidth - spac; spacPointHorizontal = width / totalPoints;//點(diǎn)與點(diǎn)的間距 spacLineHorizontal = width / 8; Path path = new Path(); path.moveTo(leftSpac, MARGINTOP); path.lineTo(leftSpac + width, MARGINTOP); path.moveTo(leftSpac + width, MARGINTOP + mHeight); path.lineTo(leftSpac, MARGINTOP + mHeight); path.moveTo(leftSpac, MARGINTOP); path.close(); canvas.drawPath(path, paint); //繪制中間的橫線 int i = 1; for (; i < leftValue.length; i++) { float startY = MARGINTOP + i * spacVertical; canvas.drawLine(leftSpac, startY, leftSpac + width, startY, paint); } //繪制豎線 for (i = 1; i < 8; i++) { float startX = leftSpac + spacLineHorizontal * i; canvas.drawLine(startX, MARGINTOP, startX, MARGINTOP + mHeight, paint); }}/** * 繪制左側(cè)文字 */private void drawLeftText(Canvas canvas) { Paint paint = getTextPaint(); paint.setTextSize(leftTextSize); paint.setColor(Color.parseColor(TEXT_COLOR)); paint.setTextAlign(Paint.Align.LEFT); for (int i = 0; i < leftValue.length; i++) { String text = leftValue[i]; float startY = 0; //第一個(gè)和最后一個(gè)在需特殊計(jì)算 if (i == 0) { startY = MARGINTOP + leftTextSize - 10 + i * spacVertical; } else if (i == leftValue.length - 1) { startY = MARGINTOP + i * spacVertical; } else { startY = MARGINTOP + leftTextSize / 2 + i * spacVertical; } canvas.drawText(text, MARGINLEFT, startY, paint); }}/** * 繪制底部日期 */private void drawBottomText(Canvas canvas) { float startY = MARGINTOP + mHeight + textSize + spac; Paint paint = getTextPaint(); paint.setTextSize(textSize); paint.setColor(Color.parseColor(TEXT_COLOR)); paint.setTextAlign(Paint.Align.LEFT); for (int i = 0; i < times.length; i++) { String timeText = times[i]; float textWidth = paint.measureText(timeText); float mid = textWidth / 2; float startX = leftSpac + i * spacLineHorizontal * 2 - mid; if (startX < leftSpac) { startX = leftSpac; } if ((startX + textWidth) > (MARGINLEFT + mWidth)) { startX = MARGINLEFT + mWidth - textWidth + spac / 2; } canvas.drawText(timeText, startX, startY, paint); }}/** * 繪制凈值曲線 */private void drawLine(Canvas canvas) { //計(jì)算點(diǎn)的位置 calcuatePoints(); if (pointLists.size() > 0) { //繪制曲線 Paint paint = getLinePaint(); paint.setAlpha(255); paint.setStyle(Paint.Style.STROKE); canvas.drawPath(linePath, paint); paint.reset(); //繪制背景 PointF pointF = pointLists.get(0); //設(shè)置漸變背景 LinearGradient linearGradient = new LinearGradient(pointF.x, MARGINTOP, 0, mHeight, Color.parseColor(COLOR_BLUE), Color.parseColor(COLOR_BLUE_ALPHA), Shader.TileMode.MIRROR); paint.setShader(linearGradient); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.TRANSPARENT); paint.setStrokeWidth(0); paint.setAlpha(80); canvas.drawPath(alphaPath, paint); paint.reset(); }}private void drawLong(Canvas canvas) { //繪制長(zhǎng)按時(shí)的虛線 if (isLongPress) { //初始化畫(huà)筆 Paint paint = getDeshPathPaint(); paint.setColor(Color.GRAY); PointF startPoint = pointLists.get(0); PointF endPoint = pointLists.get(pointLists.size() - 1); int index = 0; if (downX < startPoint.x) { index = 0; } else if (downX > endPoint.x) { index = pointLists.size() - 1; } else { index = search(downX, 0, pointLists.size() - 1); }

// if (index < 0) return;

PointF point = pointLists.get(index); //橫線 canvas.drawLine(leftSpac, point.y, MARGINLEFT + mWidth, point.y, paint); //豎線 canvas.drawLine(point.x, MARGINTOP, point.x, MARGINTOP + mHeight, paint); //繪制底部時(shí)間 繪制左側(cè)凈值 ColumnBean columnBean = list.get(index); drawLongText(canvas, getTextPaint(), (int) point.x, point.y, columnBean.getDate(), String.valueOf(columnBean.getNetValue())); paint.reset(); }}/** * 繪制底部日期及背景 * * @param startX 線的起始點(diǎn)X軸 * @param bottomDate 文本 * @param leftNetValue 左側(cè)凈值 */private void drawLongText(Canvas canvas, Paint paint, float startX, float y, String bottomDate, String leftNetValue) { paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(1.5f); paint.setColor(Color.parseColor(COLOR_BOTTOMDATEBG)); //繪制底部日期 paint.setTextSize(textSize); int textWidth = (int) paint.measureText(bottomDate); int right = (int) (startX + textWidth / 2 + spac); int left = (int) (startX - textWidth / 2 - spac); if (left < leftSpac) { left = (int) leftSpac; right = (int) (left + textWidth + spac * 2); } if (right > MARGINLEFT + mWidth) { right = (int) (MARGINLEFT + mWidth); left = (int) (right - textWidth - spac * 2); } //繪制日期的背景 Rect rect = new Rect(left, (int) (MARGINTOP + mHeight + spac / 2), right, (int) (MARGINTOP + mHeight + textSize + spac * 2)); canvas.drawRect(rect, paint); //繪制左側(cè)凈值 float leftValueWidth = paint.measureText(leftNetValue); int valueleft = (int) MARGINLEFT; right = (int) (MARGINLEFT + leftValueWidth + spac); int top = (int) (y - leftTextSize / 2 + spac / 2); int bottom = (int) (top + leftTextSize + spac); rect = new Rect(valueleft, top, right, bottom); canvas.drawRect(rect, paint); //繪制底部日期 左側(cè)凈值 paint.setTextSize(textSize); paint.setTypeface(Typeface.DEFAULT); paint.setTextAlign(Paint.Align.LEFT); paint.setColor(Color.parseColor(COLOR_BOTTOMDATE)); // canvas.drawText(bottomDate, left + spac, MARGINTOP + mHeight + textSize + spac, paint); // 繪制左側(cè)凈值 canvas.drawText(leftNetValue, valueleft + spac / 2, bottom - spac / 2, paint);}/** * 遞歸 二分查找 查找按下的位置在那個(gè)時(shí)間點(diǎn)上 */private int search(float downX, int startIndex, int endIndex) { if (startIndex > endIndex) return -1; int midIndex = endIndex - startIndex; PointF point = pointLists.get(midIndex); //下一個(gè)點(diǎn) 上一個(gè)點(diǎn) PointF nextPoint, prePoint; if (midIndex != pointLists.size() - 1) { nextPoint = pointLists.get(midIndex + 1); } else { nextPoint = pointLists.get(pointLists.size() - 1); } if (midIndex != 0) { prePoint = pointLists.get(midIndex - 1); } else { prePoint = pointLists.get(0); } float left = point.x - (point.x - prePoint.x) / 2; float right = point.x + (nextPoint.x - point.x) / 2; if (left < leftSpac) { left = leftSpac; } if (right > MARGINLEFT + mWidth) { right = MARGINLEFT + mWidth; } //返回索引 if (downX < right && downX > left) { return midIndex; } if (downX < left && downX > leftSpac) { return search(downX, startIndex, midIndex - 1); } else if (downX > right && downX < pointLists.get(pointLists.size() - 1).x) { return search(downX, midIndex + 1, endIndex); } else { return -1; }}/** * 計(jì)算點(diǎn)的位置放入集合中 */private void calcuatePoints() { //計(jì)算點(diǎn)的位置 從左往右畫(huà) float midY = (MARGINTOP + spacVertical * 4);//中間點(diǎn)Y軸的位置 pointLists.clear(); linePath = new Path(); alphaPath = new Path(); int size = list.size(); for (int i = 0; i < size; i++) { ColumnBean columnBean = list.get(i); PointF pointF = getPoint(midY, columnBean); pointLists.add(pointF); if (i == 0) { linePath.moveTo(pointF.x, pointF.y); alphaPath.moveTo(pointF.x, MARGINTOP + mHeight); } alphaPath.lineTo(pointF.x, pointF.y); if (i > 0) { linePath.lineTo(pointF.x, pointF.y); if (i == list.size() - 1) { alphaPath.lineTo(pointF.x, MARGINTOP + mHeight); alphaPath.close(); } else if (i != list.size() - 1) {//或者是下一個(gè)點(diǎn)大于寬度時(shí) PointF point = getPoint(midY, list.get(i + 1)); if (point.x > MARGINLEFT + mWidth) { alphaPath.lineTo(pointF.x, MARGINTOP + mHeight); alphaPath.close(); break; } } } }}/** * @param midY 中間值 * @param column * @return */private PointF getPoint(float midY, ColumnBean column) { PointF pointF = new PointF(); float startX = 0.0f; float startY = 0.0f; //根據(jù)時(shí)間計(jì)算X點(diǎn) String startDate = column.getDate(); startX = getX(startDate); //根據(jù)凈值計(jì)算Y點(diǎn) //起始點(diǎn) double netValue = column.getNetValue(); startY = getY(midY, netValue); pointF.x = startX; pointF.y = startY; return pointF;}/** * @param midY 中間值 * @param netValue 凈值數(shù) * @return 根據(jù)凈值計(jì)算的Y點(diǎn) */private float getY(float midY, double netValue) { float startY; double percent = (midValue - netValue) / avarageValue;//計(jì)算比例 double tempY = percent * spacVertical; startY = Float.parseFloat(get4Decimal(Math.abs(midY + tempY))); return startY;}private float getX(String date) { SimpleDateFormat format = new SimpleDateFormat("hh:mm"); try { //大于13:00的需減去13:00 上午減去 9:30 long endTime = format.parse(date).getTime();//需計(jì)算的時(shí)間 long poorTime = 0L; if (endTime > afterTime) { poorTime = endTime - (afterTime - midTime) - moringTime; } else { poorTime = endTime - moringTime; } long index = poorTime / 1000 / 60 / 5; float startX = index * spacPointHorizontal + leftSpac;

// Log.e(TAG, “getX: startX = ” + startX + ” leftSpac = ” + leftSpac + ” index = ” + index);

return startX; } catch (ParseException e) { e.printStackTrace(); } return 0.0f;}/** * 計(jì)算平均值,并計(jì)算左側(cè)值 */private void calcuateAvarage() { double poorValue = Math.abs(maxValue - midValue); avarageValue = poorValue / 4 + floatingValue; double tempAvarage = poorValue / 4; int tempIndex = 4; for (int i = 0; i < leftValue.length; i++) { double tempValue = tempAvarage * tempIndex--; if (i == 4) { leftValue[i] = get4Decimal(midValue + tempValue); } else { tempValue = tempValue > 0 ? tempValue + floatingValue : tempValue - floatingValue; leftValue[i] = get4Decimal(midValue + (tempValue/* - floatingValue*/)); } }}/** * 格式化固定時(shí)間 9:30 11:30 13:00 轉(zhuǎn)換為毫秒 */private void formatFinalTiem() { SimpleDateFormat format = new SimpleDateFormat("hh:mm"); try { afterTime = format.parse("13:00").getTime();//下午 moringTime = format.parse("09:30").getTime();//上午 midTime = format.parse("11:30").getTime();//中午 } catch (ParseException e) { e.printStackTrace(); }}//繪制邊框的畫(huà)筆private Paint getPathPaint() { Paint paint = new Paint(); paint.setAntiAlias(true); paint.setStrokeWidth(1); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.parseColor(COLOR_BOX)); return paint;}//繪制長(zhǎng)按虛線的畫(huà)筆private Paint getDeshPathPaint() { Paint paint = new Paint(); paint.setAntiAlias(true); DashPathEffect dashPathEffect = new DashPathEffect(new float[]{8f, 8f}, 0); paint.setPathEffect(dashPathEffect); paint.setStrokeWidth(1); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.parseColor(COLOR_BOX)); return paint;}//繪制邊框的畫(huà)筆private Paint getLinePaint() { Paint paint = new Paint(); paint.setAntiAlias(true); paint.setDither(true); paint.setFlags(Paint.ANTI_ALIAS_FLAG); paint.setStrokeWidth(1.5f); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.parseColor(COLOR_BLUE)); return paint;}/** * 繪制文字的畫(huà)筆 畫(huà)筆顏色、字體大小需自己設(shè)置 */private Paint getTextPaint() { Paint paint = new Paint(); paint.setStrokeWidth(2); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); paint.setTypeface(Typeface.DEFAULT); return paint;}private String get4Decimal(double value) { DecimalFormat decimalFormat = new DecimalFormat("#0.0000"); return 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);}//設(shè)置數(shù)據(jù)public void setData(ArrayList<ColumnBean> list) { this.list = list; int maxValueIndex = StringUtil.getMaxIndex(list, context, midValue); if (maxValueIndex == -1) { Toast.makeText(context, "暫無(wú)數(shù)據(jù)", Toast.LENGTH_SHORT).show(); return; } isSet = true; this.list = list; maxValue = list.get(maxValueIndex).getNetValue(); Log.e(TAG, "setData: maxValue = " + maxValue); calcuateAvarage(); postInvalidate();}private class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDown(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { isLongPress = true; postInvalidate(); }}

}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临沂市| 莱西市| 神农架林区| 慈溪市| 乃东县| SHOW| 长顺县| 绥滨县| 海宁市| 安远县| 岢岚县| 周宁县| 祥云县| 长乐市| 昂仁县| 济阳县| 常德市| 稻城县| 光泽县| 富平县| 永川市| 文化| 东海县| 荣成市| 石嘴山市| 崇左市| 余干县| 苏尼特右旗| 云龙县| 博湖县| 天台县| 藁城市| 中卫市| 富锦市| 金坛市| 五指山市| 潼关县| 千阳县| 屏东县| 嘉黎县| 会宁县|