2017-10-08 13 views
0

J'utilise canvas pour dessiner sur un bitmap et définir le bitmap couvert sur un imageView. J'ai dessiné un dessin de base dans la méthode appelée drawGraph(), quand l'utilisateur touche dans la toile je dois y dessiner un cercle, pour cela j'ai utilisé canvas à l'intérieur de la méthode onTouchEvent(), il n'y dessine rien , le code est donné ci-dessous, quel est le problème et comment puis-je résoudre ce problème.Toile Android ne dessine pas sur bitmap dans une autre méthode

J'ai également essayé de créer un autre bitmap avec une ligne droite, définissez le nouveau bitmap à imageView à la fin de drawGraph() et checkClicked(). Il montre que le nouveau bitmap (avec une ligne droite tracée) est correctement défini sur imageView au début, mais lorsque vous cliquez sur l'image, vous voyez un bitmap vide (n'étant pas tracé en ligne droite) sur imageView. Donc, je suis sûr que le dessin de toile ne fonctionne pas dans checkClicked().

Merci de m'avoir aidé à l'avance!

ImageView imageView; 

Paint p = new Paint(); 
Bitmap myBitmap; 
Bitmap workingBitmap; 
Bitmap mutableBitmap; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img_drawpanel); 
    workingBitmap = Bitmap.createBitmap(myBitmap); 
    mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); 

    imageView = (ImageView) findViewById(R.id.image1); 

    imageView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      int touchX = (int) (event.getX() + imageView.getX()); 
      int touchY = (int) (event.getY() + imageView.getY()); 

      checkClicked(touchX, touchY); 

      return true; 
     } 
    }); 

    drawGraph(); 
} 

public void drawGraph(){ 

    p.setAntiAlias(true); 
    p.setColor(Color.BLACK); 
    p.setStyle(Style.FILL_AND_STROKE); 
    p.setStrokeWidth(5); 

    Canvas canvas = new Canvas(mutableBitmap); 

    //basic drawing is successfully drawn here 

    imageView.setAdjustViewBounds(true); 
    imageView.setImageBitmap(mutableBitmap); 

} 

public void checkClicked(int x, int y){ 

    p.setAntiAlias(true); 
    p.setColor(Color.RED); 
    p.setStyle(Style.FILL_AND_STROKE); 

    Canvas canvas = new Canvas(mutableBitmap); 

    //canvas doesn't draw a circle here 
    canvas.drawCircle(x, y, 10, p); 

    imageView.setAdjustViewBounds(true); 
    imageView.setImageBitmap(mutableBitmap); 

Répondre

0

Il est dessiné, mais dessiné à une mauvaise position. Parce que les coordonnées dans la vue ne sont pas les mêmes que les coordonnées dans le bitmap.

Vous pouvez le vérifier en commençant à appuyer sur l'image et en faisant glisser votre doigt vers la partie supérieure gauche de l'écran.

Vous aurez besoin de l'échelle et de la translation de l'écran et de l'image pour convertir les coordonnées avant le dessin.

Vous pouvez utiliser imageView.getImageMatrix() pour obtenir la matrice de dessin du imageView qui contient la transformation de l'image et effectuer les calculs en conséquence.

+0

J'ai converti la coordonnée: int a = (int) (drawPanel.getX() + x); int b = (entier) (drawPanel.getY() + myBitmap.getHeight() - y); Fonctionne bien dans la fonction drawGraph(), même règle s'applique à la fonction checkClicked() ne dessine rien (ou ailleurs) Est-ce que drawPanel.getX() et drawPanel.getY() changent entre les fonctions? Aidez-moi s'il vous plaît à partir de là! Merci! – philwu

+0

J'appelle la fonction drawGraph() lorsque je clique sur l'imageView. Une chose étrange se produit, drawGraph() redessine le dessin de base hors de portée d'imgaeView, car je ne peux voir que la moitié supérieure du dessin ... – philwu