1
votes

I have multiple rectangles in a canvas view and i want to display the width and height of every rectangle in the form of text on right and bottom position respectively. Using

Canvas.DrawText(text,x,y,paint);

I can draw their width and height but i want to make them drag able so that user can easily assign the width or height of one rectangle to another.

Problem is that how can we detect that user exactly click on text as rectangle is also drag able. Please help!!!

1

1 Answers

1
votes

For All resolution set dimension in dimens.xml

 <dimen name="myFontSize20">20sp</dimen>
 <dimen name="myFontSize75">75sp</dimen>

//------------

 myFontSize75=75;
 EdtText touchedtext;
 ArrayList<EdtText> editTexts = new ArrayList<EdtText>();
 int imageSize20 = getResources().getDimensionPixelSize(R.dimen.myFontSize20);
 int imageSize75 = getResources().getDimensionPixelSize(R.dimen.myFontSize75);

Store text in Array list and find OnTouch event which text you are touched.

For Text check already text on that position or not after that if it is not on that position then create new one on that position otherwise return touched text.

/--------------Edit text class------------------//
      class EdtText {
            float startX, stopY;
            float textsize;

            String EdtText1;

            public EdtText(String EdtText, float startX, float stopY, float textsize) {
                this.EdtText1 = EdtText;
                this.textsize = textsize;
                this.startX = startX;
                this.stopY = stopY;
            }

        }

//--------------Check Text already is on touch position or not---------------//

 private EdtText obtainTouchedText(final float xTouch2, final float yTouch2) {
        EdtText touchedtext = getTouchedtext(xTouch2, yTouch2, 1);

    //for getting textSize
    textsize = c.getTextsize();
    if (null == touchedtext) {

        touchedtext = new EdtText("kdsks", xTouch2, yTouch2, textsize);
        editTexts.add(touchedtext);
}
   return touchedtext;
}

  private EdtText getTouchedtext(float xTouch2, float yTouch2, int i) {
            EdtText touched2 = null;
    for (EdtText edt : editTexts) {
        String hb = edt.EdtText1.toString();
        int k = hb.length();


        if (((Math.abs(edt.startX + ((k / 2) * 16) - xTouch2) < imageSize75) || (Math.abs(edt.startX + ((k) * 16) - xTouch2) < imageSize75)) && (Math.abs(edt.stopY - yTouch2) < imageSize20)) {

            touched2 = edt;
            if (i == 0) {
                text_cir++;
            } else {

            }
            break;
        } else {

        }
    }

    return touched2;
}

// For drag text on canvas

@Override
    public boolean onTouchEvent(final MotionEvent event) {
    boolean handled = false;

    float xTouch = 0;
    float yTouch = 0;
   switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            xTouch = event.getX(0);
            yTouch = event.getY(0);

            touchedtext = getTouchedtext(xTouch, yTouch, 0);

            if (touchedtext != null) {
                dx = xTouch - touchedtext.startX;
                dy = yTouch - touchedtext.stopY;

            }

         case MotionEvent.ACTION_MOVE:
            endX = event.getX();
            endY = event.getY();
            float x_add = endX - dx;
            float y_add = endY- dy;
            touchedtext.startX = x_add;
            touchedtext.stopY = y_add;
            invalidate();
            handled = true;
            break;

        case MotionEvent.ACTION_UP:
            invalidate();
            handled = true;
            break;

        case MotionEvent.ACTION_POINTER_UP:
            break;

        case MotionEvent.ACTION_CANCEL:
            invalidate();

            break;

        default:
        break;
    }
    invalidate();
    return super.onTouchEvent(event) || handled;
}

//--OnDraw method Add this code for drawing text---------------//

for (EdtText l : editTexts) {

          canvas.drawText(l.EdtText1, l.startX, l.stopY, mPaint);
 }