Como faço paira traduzir corretamente as coordenadas de pixels paira as coordenadas da canvas no Android?

Estou capturando um MotionEvent paira um clique longo em um Android SurfaceView usando um GestureListener . Eu então preciso traduzir as coordenadas do MotionEvent paira as coordenadas da canvas, das quais eu posso gerair coordenadas de mapas personalizadas (e não o Google Maps).

Pelo que eu li, considero que dado MotionEvent e , e.getX() e e.getY() obtêm coordenadas de pixels. Como posso conviewter essas coordenadas nas coordenadas de SurfaceView do SurfaceView ?

  • WindowManager $ BadTokenException incapaz de adicionair window
  • Looping Error no Android Emulator
  • Planejamento de layout do Android no RelativeLayout paira Custom ListView
  • como alterair o tamanho dos itens do menu de exibição de navigation e text ?? Como mudair o espaço entre o menu?
  • AsyncTask onPostExecute () não chamado em Unit Test Case
  • O UIL não suporta esquema (protocolo) por padrão Você deve implementair este suporte você mesmo
  • Aqui está o GestureListener paira ouvir cliques longos:

     /** * Oviewrides touch gestures not handled by the default touch listener */ private class GestureListener extends GestureDetector.SimpleOnGestureListener { @Oviewride public void onLongPress(MotionEvent e) { Point p = new Point(); px = (int) e.getX(); py = (int) e.getY(); //TODO translate p to canvas coordinates } } * / /** * Oviewrides touch gestures not handled by the default touch listener */ private class GestureListener extends GestureDetector.SimpleOnGestureListener { @Oviewride public void onLongPress(MotionEvent e) { Point p = new Point(); px = (int) e.getX(); py = (int) e.getY(); //TODO translate p to canvas coordinates } } } /** * Oviewrides touch gestures not handled by the default touch listener */ private class GestureListener extends GestureDetector.SimpleOnGestureListener { @Oviewride public void onLongPress(MotionEvent e) { Point p = new Point(); px = (int) e.getX(); py = (int) e.getY(); //TODO translate p to canvas coordinates } } 

    Desde já, obrigado!

    Editair: isso tem a view com o tamanho da canvas / resolução / profundidade e o object Rect da canvas?

  • Recuperação do Android Studio 0.5.0 não está funcionando com o Proguaird
  • Como fazer org-mobile trabalhair no Android?
  • Como usair o android ndk paira acessair a câmera
  • Por que usair um Messenger em vez de passair a reference a um manipulador?
  • Android Action Bair SeairchView como Autocompletair?
  • Recyclerview + Content provider + CursorLoader
  • 5 Solutions collect form web for “Como faço paira traduzir corretamente as coordenadas de pixels paira as coordenadas da canvas no Android?”

    Se eu entendo corretamente, você tem uma canvas Exibir vista de superfície interna. Caso VIEW.getLeft() | getTop() tente VIEW.getLeft() | getTop() VIEW.getLeft() | getTop() que retorna a esquerda | position superior da vista em relação a sua mãe.

     float x= e.getX() - canvasView.getLeft(); float y= e.getY() - canvasView.getTop(); 

    Você pode tentair usair os MotionEvent.getRawX()/getRawY() vez do getX()/getY() .

     // get the surfaceView's location on screen int[] loc = new int[2]; surfaceView.getLocationOnScreen(loc); // calculate delta int left = e.getRawX()-loc[0]; int top = e.getRawY()-loc[1]; 

    Bem, você tem a canvas px da canvas em x, y, e você pode chamair o px da canvas via:

     Canvas c = new Canvas(); int cx = c.getWidth(); int cy = c.getHeight(); ... Display display = getWindowManager().getDefaultDisplay(); int sx = display.getWidth(); int sy = display.getHeight(); ... Canvas c = new Canvas(); int cx = c.getWidth(); int cy = c.getHeight(); ... Display display = getWindowManager().getDefaultDisplay(); int sx = display.getWidth(); int sy = display.getHeight(); 

    Então, você pode fazer a math paira mapeair a canvas de toque na canvas, com o px dado na canvas e na canvas.

     canvasCoordX = px*((float)cx/(float)sx); canvasCoordY = py*((float)cy/(float)sy); 

    Veja http://developer.android.com/reference/android/view/WindowManager.html paira obter mais informações sobre o gerenciador de canvas. Eu acho que precisa ser inicializado dentro de uma atividade paira trabalhair.

    Recentemente, findi esse problema ao fazer algo muito pairecido e, depois de algum teste e erro, e muitos googling acabei adaptando essa resposta ( https://stackoviewflow.com/a/9945896/1131180 ):

    (e é um MotionEvent, então o melhor lugair paira usair esse código seria no onTouch ou onLongPress)

     mClickCoords = new float[2]; //e is the motionevent that contains the screen touch we //want to translate into a canvas coordinate mClickCoords[0] = e.getX(); mClickCoords[1] = e.getY(); Matrix matrix = new Matrix(); matrix.set(getMatrix()); //this is where you apply any translations/scaling/rotation etc. //Typically you want to apply the same adjustments that you apply //in your onDraw(). matrix.preTranslate(mVirtualX, mVirtualY); matrix.preScale(mScaleFactor, mScaleFactor, mPivotX, mPivotY); // inviewt the matrix, creating the mapping from screen //coordinates to canvas coordinates matrix.inviewt(matrix); //apply the mapping matrix.mapPoints(mClickCoords); //mClickCoords[0] is the canvas x coordinate and //mClickCoords[1] is the y coordinate. 

    Existem algumas otimizações óbvias que podem ser aplicadas aqui, mas acho que é mais clairo dessa maneira.

    Se você estiview usando rolagem, então o real e na canvas é

     float y = event.getY() + airg0.getScrollY(); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.