可點擊價格走勢圖-貝塞爾曲線

記錄下項目中使用貝塞爾曲線實現(xiàn)可點擊查看價格功能


1. XML 使用方式


? ? android:id="@+id/customCurveChart"

? ? android:layout_width="match_parent"

? ? android:layout_height="187dp"

? ? android:layout_below="@+id/online_tv_carve"

? ? android:layout_marginLeft="16dp"

? ? android:layout_marginRight="6dp"

? ? android:layout_marginTop="20dp"

? ? android:gravity="center"

? ? android:orientation="vertical"

? ? android:paddingBottom="10dp"

? ? >



Activity:


private void initCurveChart2() {

List listY =new ArrayList<>();

? ? int number= BubbleSort2(listPrice);

????????listY.add("0");

? ? ? ? listY.add("2.1w");

? ? ? ? listY.add("4.2w");

? ? ? ? listY.add("6.3w");

? ? ? ? listY.add("8.4w");

? ? ? ? listY.add("10.5w");

? ? ? ? listY.add("12.6w");

List color =new ArrayList<>();

? ? color.add(R.color.make_money_tv_color_red);

? ? customCurveChart2.addView(new CustomCurveChart(this, listRiqi, listY, listPrice, color, true));

}



自定義工具類:


package cn.ihk.www.fww.OnLineAssessment;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.CornerPathEffect;

import android.graphics.DashPathEffect;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.PathEffect;

import android.graphics.RectF;

import android.os.Build;

import android.support.annotation.RequiresApi;

import android.support.v4.content.ContextCompat;

import android.text.Layout;

import android.text.StaticLayout;

import android.text.TextPaint;

import android.view.MotionEvent;

import android.view.View;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import cn.ihk.www.fww.R;

/**

* 2017年4月24日11:47:25

* zhangchengbo

*

* 總是改不完的需求贺辰,開始說OK,后面又說不行,現(xiàn)在又搞事情!我呸~

* 我有有一句話不知當(dāng)講不當(dāng)講? M M P

*/

public class CustomCurveChartextends View {

Map>mapXY =new HashMap>();

? ? ListmaplistX =new ArrayList();

? ? ListmaplistY =new ArrayList();

? ? // 坐標(biāo)單位

? ? private ListxLabel;

? ? private ListyLabel;

? ? // 曲線數(shù)據(jù)

? ? private ListdataList;

? ? private ListcolorList;

? ? private boolean showValue;

? ? // 默認(rèn)邊距

? ? private int margin =45;

? ? // 距離左邊偏移量

? ? private int marginX =45;

? ? // 原點坐標(biāo)

? ? private int xPoint;

? ? private int yPoint;

? ? // X,Y軸的單位長度

? ? private int xScale;

? ? private int yScale;

? ? // 畫筆

? ? private PaintpaintAxes;

? ? private PaintpaintCoordinate;

? ? private PaintpaintTable;

? ? private PaintpaintCurve;

? ? private PaintpaintRectF;

? ? private Paintpaint,paint2,paint3;

? ? private ListliststrY;

? ? private ListliststrX;

? ? private int isFalse;

? ? public CustomCurveChart(Context context, List xLabel, List yLabel,

? ? ? ? ? ? ? ? ? ? ? ? ? ? List dataList, List colorList, boolean showValue) {

super(context);

? ? ? ? this.xLabel = xLabel;

? ? ? ? this.yLabel = yLabel;

? ? ? ? this.dataList = dataList;

? ? ? ? this.colorList = colorList;

? ? ? ? this.showValue = showValue;

? ? }

public CustomCurveChart(Context context) {

super(context);

? ? }

/**

* 初始化數(shù)據(jù)值和畫筆

*/

? ? public void init() {

xPoint =margin +marginX;

? ? ? ? yPoint =this.getHeight() -margin;

? ? ? ? xScale = (this.getWidth() -2 *margin -marginX) / (xLabel.size() -1)-5;

? ? ? ? yScale = (this.getHeight() -2 *margin) / (yLabel.size() -1);

? ? ? ? //X與Y軸的繪制(顏色線條)

? ? ? ? paintAxes =new Paint();

? ? ? ? paintAxes.setStyle(Paint.Style.STROKE);

? ? ? ? paintAxes.setAntiAlias(true);

? ? ? ? paintAxes.setDither(true);

? ? ? ? paintAxes.setColor(ContextCompat.getColor(getContext(), R.color.curve_line));

? ? ? ? paintAxes.setStrokeWidth(5);

? ? ? ? paintAxes.setPathEffect(new DashPathEffect(new float[] {10, 10}, 1f));

? ? ? ? //XY 軸 的字體

? ? ? ? paintCoordinate =new Paint();

? ? ? ? paintCoordinate.setStyle(Paint.Style.STROKE);

? ? ? ? paintCoordinate.setDither(true);

? ? ? ? paintCoordinate.setAntiAlias(true);

? ? ? ? paintCoordinate.setColor(ContextCompat.getColor(getContext(), R.color.color_gray));

? ? ? ? paintCoordinate.setTextSize(30);

? ? ? ? //網(wǎng)格線條的繪制與顏色

? ? ? ? paintTable =new Paint();

? ? ? ? paintTable.setStyle(Paint.Style.STROKE);

? ? ? ? paintTable.setAntiAlias(true);

? ? ? ? paintTable.setDither(true);

? ? ? ? paintTable.setColor(ContextCompat.getColor(getContext(), R.color.curve_line));

? ? ? ? paintTable.setStrokeWidth(3);

? ? ? ? //繪制曲線

? ? ? ? paintCurve =new Paint();

? ? ? ? paintCurve.setStyle(Paint.Style.STROKE);

? ? ? ? paintCurve.setDither(true);

? ? ? ? paintCurve.setAntiAlias(true);

? ? ? ? paintCurve.setStrokeWidth(5);

? ? ? ? PathEffect pathEffect =new CornerPathEffect(5);

? ? ? ? paintCurve.setPathEffect(pathEffect);

? ? ? ? //繪制直線

? ? ? ? paintRectF =new Paint();

? ? ? ? paintRectF.setStyle(Paint.Style.FILL);

? ? ? ? paintRectF.setDither(true);

? ? ? ? paintRectF.setAntiAlias(true);

? ? ? ? paintRectF.setStrokeWidth(3);

? ? ? ? // 定義畫筆圓圈

? ? ? ? paint =new Paint();

? ? ? ? paint.setStyle(Paint.Style.FILL);

? ? ? ? // 消除鋸齒

? ? ? ? paint.setAntiAlias(true);

? ? ? ? // 設(shè)置畫筆的顏色

? ? ? ? paint.setColor(Color.RED);

? ? ? ? // 設(shè)置paint的外框?qū)挾?/p>

? ? ? ? paint.setStrokeWidth(2);

? ? ? ? paint2 =new Paint();

? ? ? ? paint2.setStyle(Paint.Style.FILL);

? ? ? ? paint2.setAntiAlias(true);

? ? ? ? paint2.setColor(Color.RED);

? ? ? ? paint2.setStrokeWidth(2);

? ? ? ? paint3 =new Paint();

? ? ? ? paint3.setStyle(Paint.Style.FILL);

? ? ? ? paint3.setAntiAlias(true);

? ? ? ? paint3.setColor(Color.WHITE);

? ? }

@RequiresApi(api = Build.VERSION_CODES.M)

@Override

? ? protected void onDraw(Canvas canvas) {

canvas.drawColor(ContextCompat.getColor(getContext(), R.color.color1));

? ? ? ? init();

? ? ? ? drawTable(canvas, paintTable);

? ? ? ? drawAxesLine(canvas, paintAxes);

? ? ? ? drawCoordinate(canvas, paintCoordinate);

? ? ? ? //邏輯有點亂蔑鹦,瞎寫就瞎看吧永高,改來改去,BB來BB去奠骄。M M P

// 就這點破B玩意迁匠,不斷改剩瓶,操你大爺

? ? ? ? for (int i =0; i

if (showValue) {

drawCurve(canvas, paintCurve, paint, paint2, dataList, colorList.get(0));

? ? ? ? ? ? ? ? drawZero(canvas,dataList, paint);

? ? ? ? ? ? ? ? drawPrice(canvas,dataList);

? ? ? ? ? ? }

switch (isFalse){//滴滴萬 后臺控制 最多顯示6個,有問題直接找他城丧。

? ? ? ? ? ? ? ? case 6:

//? ? ? ? ? ? ? ? ? ? drawLine(canvas,dataList,colorList.get(0));//為了重新繪制曲線圖延曙,但是X Y 坐標(biāo)發(fā)生變化。暫時就這樣吧

? ? ? ? ? ? ? ? ? ? drawCurve(canvas,paint3, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawCurve0(canvas, paint,paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawZeroForThree(canvas,dataList, paint);

break;

? ? ? ? ? ? ? ? case 1:

drawCurve(canvas,paint3, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawCurve1(canvas,paint, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawZeroForThree(canvas,dataList, paint);

break;

? ? ? ? ? ? ? ? case 2:

drawCurve(canvas,paint3, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawCurve2(canvas,paint, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawZeroForThree(canvas,dataList, paint);

break;

? ? ? ? ? ? ? ? case 3:

drawCurve3(canvas,paint, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawZeroForThree(canvas,dataList, paint);

break;

? ? ? ? ? ? ? ? case 4:

drawCurve(canvas,paint3, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawCurve4(canvas,paint, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawZeroForThree(canvas,dataList, paint);

break;

? ? ? ? ? ? ? ? case 5:

drawCurve(canvas,paint3, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawCurve5(canvas,paint, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawZeroForThree(canvas,dataList, paint);

break;

? ? ? ? ? ? ? ? case 7:

drawCurve(canvas,paint3, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawCurve6(canvas,paint, paint2, dataList);

? ? ? ? ? ? ? ? ? ? drawZeroForThree(canvas,dataList, paint);

break;

? ? ? ? ? ? }

}

}

private void drawPrice(Canvas canvas,List data) {

//節(jié)點價格

? ? ? ? for (int i =3; i <=3; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale -65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint2);//帶圓角

? ? ? ? ? ? paint2.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? //StaticLayout 并不是一個 View 或者 ViewGroup 亡哄,而是 android.text.Layout 的子類枝缔,它是純粹用來繪制文字的。

// StaticLayout 支持換行蚊惯,它既可以為文字設(shè)置寬度上限來讓文字自動換行愿卸,也會在 \n 處主動換行

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110,表示字符串的長度截型,當(dāng)滿足一定數(shù)值趴荸,就會換行,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? }

}

private void drawZeroForThree(Canvas canvas,List data,Paint paint2) {

paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? // 畫一個圓

? ? ? ? for (int i =0; i <=3; i++) {

canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawZero(Canvas canvas,List data,Paint paint2) {

paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? // 畫一個圓

? ? ? ? for (int i =0; i <= (xLabel.size() -1); i++) {

canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? ? ? String str = String.valueOf(toY(data.get(i)));

? ? ? ? ? ? maplistX.add(String.valueOf(xPoint + i *xScale));

? ? ? ? ? ? maplistY.add(str);

? ? ? ? ? ? mapXY.put("xxx", maplistX);

? ? ? ? ? ? mapXY.put("yyy", maplistY);

? ? ? ? }

}

/**

* 繪制坐標(biāo)軸

*/

? ? private void drawAxesLine(Canvas canvas, Paint paint) {

// X

//? ? ? ? paint.setPathEffect(new DashPathEffect(new float[] {8f, 8f}, 0f));

//? ? ? ? canvas.drawLine(xPoint, yPoint, this.getWidth() - margin / 6, yPoint, paint);

? ? ? ? Path path =new Path();

? ? ? ? path.moveTo(xPoint, yPoint);

? ? ? ? path.lineTo(this.getWidth() -margin /6, yPoint);

? ? ? ? paint.setPathEffect(new DashPathEffect(new float[] {8f, 8f}, 0f));

? ? ? ? canvas.drawPath(path, paint);

? ? ? ? canvas.drawLine(this.getWidth() -margin /6, yPoint, this.getWidth() -margin /2, yPoint -margin /3, paint);

? ? ? ? canvas.drawLine(this.getWidth() -margin /6, yPoint, this.getWidth() -margin /2, yPoint +margin /3, paint);

? ? ? ? // Y

//? ? ? ? canvas.drawLine(xPoint, yPoint, xPoint, margin / 6, paint);

//? ? ? ? canvas.drawLine(xPoint, margin / 6, xPoint - margin / 3, margin / 2, paint);

//? ? ? ? canvas.drawLine(xPoint, margin / 6, xPoint + margin / 3, margin / 2, paint);

? ? }

/**

* 繪制表格

*/

? ? private void drawTable(Canvas canvas, Paint paint) {

Path path =new Path();

? ? ? ? path.addCircle(0, 0, 3, Path.Direction.CCW);

? ? ? ? // 橫向線

? ? ? ? for (int i =1; (yPoint - i *yScale) >=margin; i++) {

int startX =xPoint;

? ? ? ? ? ? int startY =yPoint - i *yScale;

? ? ? ? ? ? int stopX =xPoint + (xLabel.size() -1) *xScale;

? ? ? ? ? ? path.moveTo(startX, startY);

? ? ? ? ? ? path.lineTo(stopX, startY);

? ? ? ? ? ? paint.setPathEffect(new DashPathEffect(new float[] {8f, 8f}, 0f));

? ? ? ? ? ? canvas.drawPath(path, paint);

? ? ? ? }

// 縱向線

//? ? ? ? for (int i = 1; i * xScale <= (this.getWidth() - margin); i++) {

//? ? ? ? ? ? int startX = xPoint + i * xScale;

//? ? ? ? ? ? int startY = yPoint;

//? ? ? ? ? ? int stopY = yPoint - (yLabel.size() - 1) * yScale;

//? ? ? ? ? ? path.moveTo(startX, startY);

//? ? ? ? ? ? path.lineTo(startX, stopY);

//? ? ? ? ? ? canvas.drawPath(path, paint);

//? ? ? ? }

? ? }

/**

* 繪制刻度

*/

? ? private void drawCoordinate(Canvas canvas, Paint paint) {

// X軸坐標(biāo)

? ? ? ? for (int i =0; i <= (xLabel.size() -1); i++) {

paint.setTextAlign(Paint.Align.CENTER);

? ? ? ? ? ? int startX =xPoint + i *xScale;

? ? ? ? ? ? canvas.drawText(xLabel.get(i), startX, this.getHeight() -margin /6, paint);

? ? ? ? }

// Y軸坐標(biāo)

? ? ? ? for (int i =0; i <= (yLabel.size() -1); i++) {

paint.setTextAlign(Paint.Align.LEFT);

? ? ? ? ? ? int startY =yPoint - i *yScale;

? ? ? ? ? ? int offsetX;

? ? ? ? ? ? switch (yLabel.get(i).length()) {

case 1:

offsetX =28;

break;

? ? ? ? ? ? ? ? case 2:

offsetX =20;

break;

? ? ? ? ? ? ? ? case 3:

offsetX =12;

break;

? ? ? ? ? ? ? ? case 4:

offsetX =5;

break;

? ? ? ? ? ? ? ? default:

offsetX =0;

break;

? ? ? ? ? ? }

int offsetY;

? ? ? ? ? ? if (i ==0) {

offsetY =0;

? ? ? ? ? ? }else {

offsetY =margin /5;

? ? ? ? ? ? }

// x默認(rèn)是字符串的左邊在屏幕的位置宦焦,y默認(rèn)是字符串是字符串的baseline在屏幕上的位置

? ? ? ? ? ? canvas.drawText(yLabel.get(i), margin /4 + offsetX, startY + offsetY, paint);

? ? ? ? }

}

/**

* 繪制曲線

* paint代表繪制曲線

* paint2代表繪制價格以及背景色

* paint3代表繪制價格節(jié)點的實心圓

*/

? ? private void drawCurve(Canvas canvas, Paint paint, Paint paint2, Paint paint3, List data, int color) {

paint.setColor(ContextCompat.getColor(getContext(), color));

? ? ? ? Path path =new Path();

? ? ? ? for (int i =0; i

if (i ==0) {

path.moveTo(xPoint, toY(data.get(i)));

? ? ? ? ? ? }else {

path.quadTo((xPoint + i *xScale)-xPoint,toY(data.get(i))-10,xPoint + i *xScale, toY(data.get(i)));

? ? ? ? ? ? }

if (i ==xLabel.size() -1) {

path.lineTo(xPoint + i *xScale, toY(data.get(i)));

? ? ? ? ? ? }

}

// 畫一個圓

? ? ? ? for (int i =0; i <= (xLabel.size() -1); i++) {

canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint3);

? ? ? ? ? ? String str = String.valueOf(toY(data.get(i)));

? ? ? ? ? ? maplistX.add(String.valueOf(xPoint + i *xScale));

? ? ? ? ? ? maplistY.add(str);

? ? ? ? ? ? mapXY.put("xxx", maplistX);

? ? ? ? ? ? mapXY.put("yyy", maplistY);

? ? ? ? }

//節(jié)點價格

? ? ? ? for (int i =3; i <=3; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale -65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint2);//帶圓角

? ? ? ? ? ? paint2.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? //StaticLayout 并不是一個 View 或者 ViewGroup 发钝,而是 android.text.Layout 的子類,它是純粹用來繪制文字的波闹。

// StaticLayout 支持換行酝豪,它既可以為文字設(shè)置寬度上限來讓文字自動換行,也會在 \n 處主動換行

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110精堕,表示字符串的長度孵淘,當(dāng)滿110時,就會換行歹篓,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? }

canvas.drawPath(path, paint);

? ? }

@Override

? ? public boolean onTouchEvent(MotionEvent event) {

String numX ="";

? ? ? ? String numY ="";

? ? ? ? Canvas canvas =new Canvas();

? ? ? ? canvas.drawColor(ContextCompat.getColor(getContext(), R.color.make_money_tv_color_red));

? ? ? ? switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

int i;

? ? ? ? ? ? ? ? for (i =0; i <=xLabel.size() -1; i++) {//(小紅點)

? ? ? ? ? ? ? ? ? ? liststrX =mapXY.get("xxx");

? ? ? ? ? ? ? ? ? ? liststrY =mapXY.get("yyy");

? ? ? ? ? ? ? ? ? ? numX =liststrX.get(i);

? ? ? ? ? ? ? ? ? ? numY =liststrY.get(i);

? ? ? ? ? ? ? ? ? ? BigDecimal bd =new BigDecimal(numX);

? ? ? ? ? ? ? ? ? ? float f1 = bd.setScale(0, BigDecimal.ROUND_HALF_UP).floatValue();

? ? ? ? ? ? ? ? ? ? BigDecimal bd2 =new BigDecimal(numY);

? ? ? ? ? ? ? ? ? ? float f2 = bd2.setScale(0, BigDecimal.ROUND_HALF_UP).floatValue();

? ? ? ? ? ? ? ? ? ? //點擊位置x坐標(biāo)與圓心的x坐標(biāo)的距離

? ? ? ? ? ? ? ? ? ? int distanceX = (int) Math.abs(f1 - event.getX());

? ? ? ? ? ? ? ? ? ? //點擊位置y坐標(biāo)與圓心的y坐標(biāo)的距離

? ? ? ? ? ? ? ? ? ? int distanceY = (int) Math.abs(f2 - event.getY());

? ? ? ? ? ? ? ? ? ? //點擊位置與圓心的直線距離

? ? ? ? ? ? ? ? ? ? int distanceZ = (int) Math.sqrt(Math.pow(distanceX, 2) + Math.pow(distanceY, 2));

//? ? ? ? ? ? ? ? ? LogUtil.i("ceshichart","點擊位置x坐標(biāo)與圓心的x坐標(biāo)的距離=======================================>"+distanceX);

//? ? ? ? ? ? ? ? ? LogUtil.i("ceshichart","點擊位置y坐標(biāo)與圓心的y坐標(biāo)的距離=======================================>"+distanceY);

//? ? ? ? ? ? ? ? ? ? LogUtil.i("ceshichart","點擊位置與圓心的直線距離=======================================>"+distanceZ);

? ? ? ? ? ? ? ? ? ? if (distanceZ >40) {

//? ? ? ? ? ? ? ? ? ? ? ? Snackbar.make(getRootView(), "沒在圓內(nèi)", Snackbar.LENGTH_INDEFINITE).show();

//? ? ? ? ? ? ? ? ? ? ? ? return false;

? ? ? ? ? ? ? ? ? ? }else {

//? ? ? ? ? ? ? ? ? ? ? ? LogUtil.i("ceshiCurveChart","iiiiiiiiiiiiiii==============================>"+i);

? ? ? ? ? ? ? ? ? ? ? ? if(i==1){

isFalse=1;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==2){

isFalse=2;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==3){

isFalse=3;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==4){

isFalse=4;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==5){

isFalse=5;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==0){

isFalse=6;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==6){

isFalse=7;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==7){

isFalse=8;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==8){

isFalse=9;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==9){

isFalse=10;

? ? ? ? ? ? ? ? ? ? ? ? }else if(i==10){

isFalse=11;

? ? ? ? ? ? ? ? ? ? ? ? }

//? ? ? ? ? ? ? ? ? ? ? ? Snackbar.make(getRootView(),"當(dāng)前坐標(biāo)為:"+i+"屏幕坐標(biāo)值:"+ event.getX() + "" + event.getY(), Snackbar.LENGTH_INDEFINITE).show();

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? }

}

break;

? ? ? ? }

invalidate();

//? ? ? ? return super.onTouchEvent(event);

? ? ? ? return? true;

? ? }

private void drawCurve(Canvas canvas,Paint paint, Paint paint2, List data) {

for (int i =3; i <=3; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale-65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -78;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -12;

? ? ? ? ? ? canvas.drawRoundRect(r2, 1, 1, paint);//帶圓角

? ? ? ? ? ? canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawCurve6(Canvas canvas,Paint paint, Paint paint2, List data) {

paint.setColor(Color.parseColor("#474E5E"));

? ? ? ? paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? for (int i =6; i <=6; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale-65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint);//帶圓角

? ? ? ? ? ? paint.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110瘫证,表示字符串的長度,當(dāng)滿110時滋捶,就會換行痛悯,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? ? ? canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawCurve5(Canvas canvas,Paint paint, Paint paint2, List data) {

paint.setColor(Color.parseColor("#474E5E"));

? ? ? ? paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? for (int i =5; i <=5; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale-65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint);//帶圓角

? ? ? ? ? ? paint.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110余黎,表示字符串的長度重窟,當(dāng)滿110時,就會換行惧财,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? ? ? canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawCurve4(Canvas canvas,Paint paint, Paint paint2, List data) {

paint.setColor(Color.parseColor("#474E5E"));

? ? ? ? paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? for (int i =4; i <=4; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale-65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint);//帶圓角

? ? ? ? ? ? paint.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110巡扇,表示字符串的長度扭仁,當(dāng)滿110時,就會換行厅翔,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? ? ? canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawCurve3(Canvas canvas,Paint paint, Paint paint2, List data) {

paint.setColor(Color.parseColor("#474E5E"));

? ? ? ? paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? for (int i =3; i <=3; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale-65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint);//帶圓角

? ? ? ? ? ? paint.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110乖坠,表示字符串的長度,當(dāng)滿110時刀闷,就會換行熊泵,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? ? ? canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawCurve2(Canvas canvas,Paint paint, Paint paint2, List data) {

paint.setColor(Color.parseColor("#474E5E"));

? ? ? ? paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? for (int i =2; i <=2; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale-65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint);//帶圓角

? ? ? ? ? ? paint.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110,表示字符串的長度甸昏,當(dāng)滿110時顽分,就會換行,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? ? ? canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawCurve1(Canvas canvas, Paint paint,Paint paint2,List data) {

paint.setColor(Color.parseColor("#474E5E"));

? ? ? ? paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? for (int i =1; i <=1; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale-65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint);//帶圓角

? ? ? ? ? ? paint.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110施蜜,表示字符串的長度卒蘸,當(dāng)滿110時,就會換行翻默,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? ? ? canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawCurve0(Canvas canvas,Paint paint, Paint paint2, List data) {

paint.setColor(Color.parseColor("#474E5E"));

? ? ? ? paint2.setColor(Color.parseColor("#FF4F51"));

? ? ? ? for (int i =0; i <=0; i++) {

RectF r2 =new RectF();

? ? ? ? ? ? r2.left =xPoint + i *xScale-65;

? ? ? ? ? ? r2.top = toY(data.get(i)) -75;

? ? ? ? ? ? r2.right =xPoint + i *xScale +70;

? ? ? ? ? ? r2.bottom = toY(data.get(i)) -15;

? ? ? ? ? ? canvas.drawRoundRect(r2, 12, 12, paint);//帶圓角

//? ? ? ? ? ? paint.setColor(Color.parseColor("#474E5E"));// 設(shè)置灰色

? ? ? ? ? ? TextPaint textPaint =new TextPaint();

? ? ? ? ? ? textPaint.setColor(Color.parseColor("#ffffff"));

? ? ? ? ? ? textPaint.setTextSize(20.0F);

? ? ? ? ? ? textPaint.setAntiAlias(true);

? ? ? ? ? ? String aboutTheGame ="參考均價\n" + data.get(i) +"元/m2";

? ? ? ? ? ? StaticLayout layout =new StaticLayout(aboutTheGame, textPaint, 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);

? ? ? ? ? ? // 這里的參數(shù)110缸沃,表示字符串的長度,當(dāng)滿110時修械,就會換行趾牧,也可以使用“\r\n”來實現(xiàn)換行

? ? ? ? ? ? canvas.save();

? ? ? ? ? ? canvas.translate(xPoint + i *xScale -55, toY(data.get(i)) -70);//從坐標(biāo) X,Y 點開始畫

? ? ? ? ? ? layout.draw(canvas);

? ? ? ? ? ? canvas.restore();//restore與save組合使用

? ? ? ? ? ? canvas.drawCircle(xPoint + i *xScale, toY(data.get(i)), 10, paint2);

? ? ? ? }

}

private void drawLine(Canvas canvas,List data,int color) {

paint.setColor(ContextCompat.getColor(getContext(), color));

? ? ? ? Path path =new Path();

? ? ? ? for (int i =0; i

if (i ==0) {

path.moveTo(xPoint, toY(data.get(i)));

? ? ? ? ? ? }else {

path.quadTo((xPoint + i *xScale)-xPoint,toY(data.get(i))-10,xPoint + i *xScale, toY(data.get(i)));

? ? ? ? ? ? }

if (i ==xLabel.size() -1) {

path.lineTo(xPoint + i *xScale, toY(data.get(i)));

? ? ? ? ? ? }

}

canvas.drawPath(path, paint);

? ? }

/**

* 數(shù)據(jù)按比例轉(zhuǎn)坐標(biāo)

*/

? ? public float toY(Integer num) {

float y;

? ? ? ? try {

float a = (float) Float.valueOf(num) /21000.0f;

? ? ? ? ? ? y =yPoint - a *yScale;

? ? ? ? }catch (Exception e) {

return 0;

? ? ? ? }

return y;

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祠肥,隨后出現(xiàn)的幾起案子武氓,更是在濱河造成了極大的恐慌,老刑警劉巖仇箱,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件县恕,死亡現(xiàn)場離奇詭異,居然都是意外死亡剂桥,警方通過查閱死者的電腦和手機忠烛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來权逗,“玉大人美尸,你說我怎么就攤上這事≌遛保” “怎么了师坎?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堪滨。 經(jīng)常有香客問我胯陋,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任遏乔,我火速辦了婚禮义矛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盟萨。我一直安慰自己凉翻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布捻激。 她就那樣靜靜地躺著制轰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胞谭。 梳的紋絲不亂的頭發(fā)上艇挨,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音韭赘,去河邊找鬼缩滨。 笑死,一個胖子當(dāng)著我的面吹牛泉瞻,可吹牛的內(nèi)容都是我干的脉漏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼袖牙,長吁一口氣:“原來是場噩夢啊……” “哼侧巨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鞭达,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤司忱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畴蹭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坦仍,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年叨襟,在試婚紗的時候發(fā)現(xiàn)自己被綠了繁扎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡糊闽,死狀恐怖梳玫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情右犹,我是刑警寧澤提澎,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站念链,受9級特大地震影響盼忌,放射性物質(zhì)發(fā)生泄漏莉炉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一碴犬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梆暮,春花似錦服协、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唠椭,卻和暖如春跳纳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贪嫂。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工寺庄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人力崇。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓斗塘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亮靴。 傳聞我的和親對象是個殘疾皇子馍盟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容