直播程序源碼自定義View折線圖

我們可以在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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章