記錄下項目中使用貝塞爾曲線實現(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;
? ? }
}