我們可以在onSizeChanged中獲取我們自定義View的寬和高,然後有助於我們後面的計算。在onDraw方法中進行一些折線和刻度值得繪製動作,這裏直接上代碼
(1)初始化參數的相關代碼
/**
* 初始化參數
*/
private void initData() {
//底部刻度高度爲15px,文字佔用15dp,文字和刻度間距爲15px
mTotalYPx = mHeight - mHeight * mMultiple - dipToPx(15) - 2 * mTextPadding;
//底部兩個刻度之間的大小px
mBottomCalWidth = (int) ((mWidth - 2 * mWidth * mMultiple) / mXCalValues.length);
//刻度之外的間距距離
mDiffValue = mWidth - 2 * mWidth * mMultiple - mBottomCalWidth * (mXCalValues.length - 1);
//y軸兩個刻度之間的像素大小
mYPxValue = mTotalYPx / mYCalCount;
for (int i = 0; i < mYCalCount; i++) {
mTotalYValue.add(String.valueOf((int) (mMaxYValue - i * mYPxValue)));
}
mTotalPoints = new ArrayList<>();
float valueOfPx = mTotalYPx / mMaxYValue; //每像素值的大小
//初始化這線上每個點的座標位置
for (int i = 0; i < mXCalValues.length; i++) {
Point point = new Point();
if (i == 0)
point.x = (int) (mWidth * mMultiple + mDiffValue / 2);
else
point.x = (int) (mWidth * mMultiple + mBottomCalWidth * i + mDiffValue / 2);
point.y = (int) (mHeight - dipToPx(15) - 2 * mTextPadding - mChartValues[i] * valueOfPx);
mTotalPoints.add(point);
if (i == 0) //連接所有的折線轉折點
mPath.moveTo(point.x, point.y);
else
mPath.lineTo(point.x, point.y);
}
}
(2)onDraw中具體的繪製過程(詳情參考源代碼)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawDashLine(canvas);
drawLeftCal(canvas);
drawBottomLine(canvas);
drawTimeCal(canvas);
drawChartLine(canvas);
drawPointCircle(canvas);
drawRectBackGround(canvas);
}
(3)對摺線原點的觸摸點擊事件處理
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
boolean inArea = isInArea(motionEvent.getX(), motionEvent.getY());
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
if (inArea) {
postInvalidate();
return true;
}
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
public boolean isInArea(float x, float y) {
for (int i = 0; i < mTotalPoints.size(); i++) {
int tempX = mTotalPoints.get(i).x;
int tempY = mTotalPoints.get(i).y;
if (x >= tempX - dipToPx(5) && x <= tempX + dipToPx(5) && y >= tempY - dipToPx(5) && y <= tempY + dipToPx(5)) {
mPosition = i;
return true;
}
}
return false;
}