Нарисуйте путь с масштабированием и даргом

Разрабатываю приложение, в котором я вставляю изображения, рисую и рисую на холсте. Это приложение также может масштабировать холст вверх/вниз или перетаскивать его в другое место. Моя проблема: я не могу получить правильные координаты холста после масштабирования или перетаскивания холста. Я хочу рисовать пальцем после масштабирования или перетаскивания холста, но не могу найти нужное место, где я коснулся...

@Override
public boolean onTouchEvent(MotionEvent event) {

    scaleListener.onTouchEvent(event);

    synchronized(thread.getSurfaceHolder()){

        switch ( event.getAction() & MotionEvent.ACTION_MASK ){

            case MotionEvent.ACTION_DOWN :
                // Remember our initial down event location.
                savedMatrix.set(m_matrix);
                start.set(event.getX() , event.getY());
                mode = DRAG;                
            break;

            case MotionEvent.ACTION_POINTER_DOWN :

                oldDist = spacing(event);
                if (oldDist > 10f) {

                    savedMatrix.set(m_matrix);
                    m_matrix.getValues(matrixValues);
                    midPoint(mid, event);
                    mode = ZOOM;
                }

             break;

            case MotionEvent.ACTION_UP :
            case MotionEvent.ACTION_POINTER_UP :
                    mode = NONE;

            break;

            case MotionEvent.ACTION_MOVE :

                if(mode==DRAG && isDragAllowd){
                        m_matrix.set(savedMatrix);
                        rebound(event.getX() , event.getY());
                }
                else if(mode==ZOOM){

                    float newDist = spacing(event);
                    if (newDist > 10f){

                            m_matrix.set(savedMatrix);

                            float scale = newDist/oldDist;
                            m_matrix.getValues(matrixValues);
                            float currentScale = matrixValues[Matrix.MSCALE_X];

                            // limit zoom
                            if (scale * currentScale > maxZoom){
                                    scale = maxZoom / currentScale;
                                    //scale = maxZoom;
                            }
                            else if (scale * currentScale < minZoom){
                                    scale = minZoom / currentScale;
                                    //scale = minZoom;
                            }

                            m_matrix.postScale(scale, scale, mid.x, mid.y);
                            m_matrix.getValues(matrixValues);

                  }

            }
       break;

    }

    return true; //done with this event so consume it


    }       

}

@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);

            canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(currentBitmap, m_matrix, null);
        c2.drawColor(Color.BLACK); 
        commandManager.executeAll(c2); // Drawing all the Paints on Canvas c2
        // Overlay bitmap it's a transparent layour 
            canvas.drawBitmap(overlayBitmap, 0, 0, pTouch);

}

когда пользователь масштабирует растровое изображение, он не может рисовать поверх него, после масштабирования рисование не происходит в нужном месте.


person strike    schedule 07.09.2012    source источник
comment
пожалуйста, помогите мне с вышеуказанной проблемой.   -  person strike    schedule 07.09.2012
comment
Привет, Страйк, можешь поделиться кодом для масштабирования изображения и рисования краской.   -  person Ramesh Akula    schedule 26.04.2016


Ответы (1)


используйте следующее уравнение для преобразования точек, после чего пользователь не столкнется с трудностями при рисовании во время масштабирования или после прокрутки.

 float f1 = (( motionEvent.getX() - m_transformedPoints[0] )/( m_transformedPoints[2] - m_transformedPoints[0] ))*currentBitmapWidth;
     float f2 = (( motionEvent.getY() - m_transformedPoints[1] )/( m_transformedPoints[3] - m_transformedPoints[1] ))*currentBitmapHeight; 

    //calculate the transformed view in onDraw Method
    this.m_transformedPoints[0] = 0.0F;
    this.m_transformedPoints[1] = 0.0F;
    this.m_transformedPoints[2] = currentBitmapWidth;
    this.m_transformedPoints[3] = currentBitmapHeight;
    this.m_matrix.mapPoints(this.m_transformedPoints);
person strike    schedule 13.09.2012
comment
что такое m_transformedPoints? - person MohsinSyd; 17.03.2015