代码之家  ›  专栏  ›  技术社区  ›  Alex

用画线连接元件

  •  0
  • Alex  · 技术社区  · 7 年前

    我试图做一些视图,这将允许用户连接一些元素与绘制的线。

    E、 g.在图像上有几个 TextViews ,用户从一条线到另一条线,如果连接正确(text1到text3),线将保持不变。 enter image description here

    现在,我已经实现了自定义视图,它绘制了一条线,它跟随您的手指:

    public class FingerLineView extends View {
        private final Paint mPaint;
        private float startX;
        private float startY;
        private float endX;
        private float endY;
    
        public FingerLineView(Context context) {
            this(context, null);
        }
    
        public FingerLineView(Context context, AttributeSet attrs) {
            super(context, attrs);
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setStyle(Style.STROKE);
            mPaint.setColor(Color.RED);
        }
    
        @Override protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawLine(startX, startY, endX, endY, mPaint);
        }
    
        @Override
        public boolean onTouchEvent(@NonNull MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startX = event.getX();
                    startY = event.getY();
                    // Set the end to prevent initial jump 
                    endX = event.getX();
                    endY = event.getY();
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    endX = event.getX();
                    endY = event.getY();
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    endX = event.getX();
                    endY = event.getY();
                    invalidate();
                    break;
            }
            return true;
        }
    }
    

    工作原理如下:

    Gif

    但我不知道如何正确地将其与视图元素“连接”,比如 TextView .

    我应该使用完全自定义视图还是有更好的方法?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Antonio Vlasic    7 年前

    画布比你可能知道的更强大。;)
    drawText -方法。性能卓越,易于使用,100%可定制。

    编辑:

    public class FingerLineView extends View {
    private final Paint mPaint;
    private final Paint mPaintText;
    private float startX;
    private float startY;
    private float endX;
    private float endY;
    
    public FingerLineView(Context context) {
        this(context, null);
    }
    
    public FingerLineView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.RED);
        mPaintText = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaintText.setColor(Color.BLACK);
        mPaintText.setTextSize(30);
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawLine(startX, startY, endX, endY, mPaint);
        canvas.drawText("TEXT", startX - mPaintText.measureText("TEXT")/2, startY - 30, mPaintText);
        canvas.drawText("TEXT", endX - mPaintText.measureText("TEXT")/2, endY - 30, mPaintText);
    }
    
    @Override
    public boolean onTouchEvent(@NonNull MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = event.getX();
                startY = event.getY();
                // Set the end to prevent initial jump
                endX = event.getX();
                endY = event.getY();
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                endX = event.getX();
                endY = event.getY();
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                endX = event.getX();
                endY = event.getY();
                invalidate();
                break;
        }
        return true;
    }
    

    }