Domanda

Ho problemi a tracciare la linea su un'immagine in scala e trasformata su tela, beh, per la trasformata sono in grado di disegnare la linea sull'immagine ma se l'immagine è stata ridimensionata (ingrandisci o fuori), la linea ha disegnato inaspettatamente pixel usando il tocco del dito. Dato che sto lavorando sull'applicazione di verniciatura ma non ne avevo più conoscenze, quindi ho bisogno del tuo aiuto, l'ho cercato su Google ma senza fortuna, non ho trovato nulla

Ecco le immagini 1 ° è predefinito funzionante correttamente e nella seconda immagine mossa funzionante ha disegnato correttamente la linea correttamente

enter image description here enter image description here

Mentre è in terza immagine in scala non disegnare correttamente, intendo se iniziano l'angolo in alto/sinistra, il punto di disegno della linea era diverso come qui

enter image description here

Se hai bisogno di codice, dillo, modificherò la domanda

È stato utile?

Soluzione

Ok dopo molte implementazione ho ottenuto la soluzione per questo.

Questo è il mio codice per disegnare ondraw ()

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    canvas.translate(mPosX, mPosY);
    canvas.scale(mScaleFactor, mScaleFactor);

    canvas.drawBitmap(MoveImageTestActivity.bmp, 0,0,null);
    if(mScaleFactor!=1.f)
        canvas.restore();

    if(isDrawing)
        canvas.drawPath(tempPath,get_paint());

    if(mScaleFactor==1.f)
        canvas.restore();
}

Qui devi verificare il valore del fattore di scala per il ripristino della tela. Se il valore del fattore di scala è stato predefinito che è 1.f e l'immagine è stata semplicemente spostata, ripristinare dopo la linea/percorso di disegno, se il fattore di scala non era uguale a 1.f (impostazione predefinita), quindi ripristinare la tela 1st quindi disegnare riga/ Percorso per usare il tempo di disegno del tocco del dito.

Ecco il mio codice ontouch ()

@Override
public boolean onTouchEvent(MotionEvent ev) {
    mScaleDetector.onTouchEvent(ev);
    final int action = ev.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN: {
        final float x = ev.getX();
        final float y = ev.getY();

        if(isDrawing){
            float dx = ev.getX();
            float dy = ev.getY();;

            if(mScaleFactor==1.f){
                dx = ev.getX() - mPosX;
                dy = ev.getY() - mPosY;
            }
            tempPath = new Path();
            tempPath.moveTo(dx,dy);
        }else{
            mLastTouchX = x;
            mLastTouchY = y;
            // Save the ID of this pointer
            mActivePointerId = ev.getPointerId(0);
        }
        break;
    }

    case MotionEvent.ACTION_MOVE: {
        // Find the index of the active pointer and fetch its position
        if(isDrawing){
            float dx = ev.getX();
            float dy = ev.getY();;

            if(mScaleFactor==1.f){
                dx = ev.getX() - mPosX;
                dy = ev.getY() - mPosY;
            }
            tempPath.lineTo(dx,dy);
        }else{
            final int pointerIndex = ev.findPointerIndex(mActivePointerId);
            final float x = ev.getX(pointerIndex);
            final float y = ev.getY(pointerIndex);

            final float dx = x - mLastTouchX;
            final float dy = y - mLastTouchY;

            mPosX += dx;
            mPosY += dy;

            mLastTouchX = x;
            mLastTouchY = y;
        }
        break;
    }
    case MotionEvent.ACTION_UP: {
        points.clear();
        mActivePointerId = INVALID_POINTER_ID;
        break;
    }

    case MotionEvent.ACTION_CANCEL: {
        mActivePointerId = INVALID_POINTER_ID;
        break;
    }

    case MotionEvent.ACTION_POINTER_UP: {
        if(!isDrawing){
            // Extract the index of the pointer that left the touch sensor
            final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
            final int pointerId = ev.getPointerId(pointerIndex);
            if (pointerId == mActivePointerId) {
                // This was our active pointer going up. Choose a new
                // active pointer and adjust accordingly.
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mLastTouchX = ev.getX(newPointerIndex);
                mLastTouchY = ev.getY(newPointerIndex);
                mActivePointerId = ev.getPointerId(newPointerIndex);
            }
        }
        break;
    }
    }
    invalidate();
    return true;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top