【问题标题】:Draw Text in canvas and make it Drag-able Android在画布中绘制文本并使其可拖动 Android
【发布时间】:2016-10-25 19:16:16
【问题描述】:

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

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

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

问题是我们如何检测用户准确点击文本,因为矩形也是可拖动的。 请帮忙!!!

【问题讨论】:

    标签: android canvas drag-and-drop


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      相关资源
      最近更新 更多