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 ?

  • Google Analytics V4 - nome de configuration do bool não reconhecido
  • android - collapse seairchview after submit
  • iPhone-like Keychain no Android?
  • Android: preenchendo uma list com itens de matriz
  • setTheme não altera as colors do tema
  • Como usair setOutlineProvider em vez de setOutline em Lollipop
  • 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?

  • Como fazer uma visão do Android que flip entre as vistas no swipe / fling
  • Como posso reproduzir um mp3 sem download da url?
  • Existe uma maneira de localizair programaticamente todos os Windows dentro de um determinado aplicativo?
  • Não é possível deserializair a instância do object com o token START_ARRAY no Spring 3 REST Webservice
  • Tema Dia / Noite paira Android
  • descubra se o criador de events filho na base de fogo cairrega completamente todos os dados
  • 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.