在画布中绘制文字并使其成为可拖动的Android

时间:2014-10-13 10:20:46

标签: android canvas drag-and-drop

我在画布视图中有多个矩形,我想分别以右侧和底部位置的文本形式显示每个矩形的宽度和高度。使用

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

我可以绘制它们的宽度和高度,但我想让它们可拖动,以便用户可以轻松地将一个矩形的宽度或高度分配给另一个矩形。

问题是我们怎样才能检测到用户正好点击文本,因为矩形也是可拖动的。 请帮忙!!!

1 个答案:

答案 0 :(得分:0)

对于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);

将文本存储在数组列表中,找到OnTouch事件,触摸哪个文本。

对于文本检查已经在该位置上的文本,如果它不在该位置上,则在该位置创建新的文本,否则返回被触摸的文本。

/--------------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;
            }

        }

// --------------检查文本是否已触摸位置--------------- //

 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;
}

//用于在画布上拖动文字

@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方法为绘图文本添加此代码--------------- //

for (EdtText l : editTexts) {

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