Não consigo desenhar quando o usuário toca na tela

23 respostas
P

Galera,

Vejam meu código:

@Override
public boolean onTouchEvent(MotionEvent event) {
		String tag = null;
		
        if(i == 0) {
            static_x = event.getX();
            static_y = event.getY();
            
            i = 1;
            
        } else{
                static_x1 = event.getX();
                static_y1 = event.getY();

        }

       if(i == 1) {
    	   Paint p = new Paint();
    	   p.setColor(Color.BLACK);
    	   p.setStyle(Paint.Style.STROKE);
    	   Canvas canvas = new Canvas();
    	   canvas.drawColor(Color.BLUE);
    	   canvas.drawLine(static_x, static_y, static_x1, static_y1,p);
    	   System.out.println("Era p/ desenhar na tela");
    	   i = 0;
       }

       return false;
	}

O Canvas simplesmente não desenha nada na tela. Quero desenhar uma linha quando o usuário tocar na tela.

Alguém poderia me ajudar?

Vlw

23 Respostas

P

Esse código está uma classe que estende Activity!

Marky.Vasconcelos

Voce precisa desenhar isso no Canvas que vem do onDraw de alguma View.

No seu caso, voce apenas criou um Canvas e desenhou nele.

Voce pode ver nesse artigo como fazer isso:

www.pontov.com.br/site/index.php/java/69-android/247-android-desenhando-na-tela

P

Amigo,

Uma dúvida…o onDraw ñ é chamado qdo a View é renderizada?? Pois é…eu ñ gostaria de desenhar qdo a Vies fosse renderizada, porém, no evento do toque da tela!!

Obrigado pela resposta!!

Marky.Vasconcelos

Exato!

suaView.invalidate();//Fara que sua view se re-renderize.
P

Como assim??

Ñ entendi!!

P

Coloco esse trecho de código dentro do “onDraw”?

Me ajude!

P

?? :?: :?: :?:

Marky.Vasconcelos

No onDraw voce deve desenhar tudo que deseja.

Voce deve processar os novos valores depois de ler o evento no onTouch, e depois disso, invocar o invalidate() para desenhar com os novos valores.

P

Amigo,

Eu fiquei até tarde tentando fazer, porém, sem sucesso!

Será q vc ñ poderia postar ao menos um exemplo básico e funcional, p/ q eu faça o resto?
Somente p/ me dar um norte e ñ ficar quebrando a kabeça…sou novo em Android.

Quero que quando o usuário tocar na tela seja desenhado um circulo ou uma linha por exemplo!!

Grato!

P

Se alguém tiver um exemplinho básico eu agradeço!!

Vlw

Marky.Vasconcelos

Se voce ler o artigo que postei com atenção, vai perceber como isso é feito.

Voce pode ver onde desenhar na primeira parte do artigo.
Na segunda ver como funciona o Handler para redesenhar a tela.
http://www.pontov.com.br/site/index.php/java/69-android/247-android-desenhando-na-tela?start=1

P

Ufa…

Consegui mto obrigado kra!!

Agora,

Estou desenhando um circulo quando o usuário toca na tela, porém, quando ele toca novamente o círculo desenhando no toque anterior desaparece.

Eu quero que quando o usuário toque na tela novamente o circulo anterior permanecesse, ou seja, como se o usuário estivesse pintando a tela.

Como faço isso colega?

Marky.Vasconcelos

Guardando a referencia para o circulo anterior também.

#dica

Cada vez que o usuario volta a clicar na tela o primeiro evento disparado é o MOTION_DOWN.

P

O método invalidate() da View é chamado e a renderiza novamente certo?

Como vou salvar o estado do Círculo?

P

Como tá difícil ainda ñ consegui…ñ tô entendendo!!

Como salvarei o estado do círculo?

Mas ñ vou desistir ñ!!

Marky.Vasconcelos

Voce precisa ter uma List dos objetos que voce já desenhou na tela.

E no onDraw desenha-los todas as vezes.

P

Hummmm…

Estou no trabalho, mas qdo eu chegar em kasa vou fazer isso!!!

Obrigado por suas respostas.

P

Assim...o q eu utilizo p/ pintar são as coordenada X e Y que capturo do MotionEvent.

Não utilizo nenhum objeto p/ pintar!! Como farei isso?

Veja o código:

@Override
public boolean onTouchEvent(MotionEvent event){
		 		
		switch (event.getAction()) {
				
			case MotionEvent.ACTION_DOWN:
				
				x = (int) event.getX();
				y = (int) event.getY();
				radius = 10;
				invalidate();
				break;
			case MotionEvent.ACTION_MOVE:
												
				break;
			case MotionEvent.ACTION_UP:
								
				break;
		}
		return true;
}
@Override
public void onDraw(Canvas canvas){
		
		super.onDraw(canvas);
					
		canvas.drawCircle(x, y, radius, pincelVermelho);
			
		System.out.println("X ---->>>" + x);
		System.out.println("Y ---->>>" + y);
		
	}
P

Kra…consegui!!

Criei 2 arrays que guardam as coordenadas X e Y do toque do usuário e no onDraw eu criei um for q itera pelos arrays e redesenha os pontos anteriores.

Fikou legal…

Obrigado pela força!!

Marky.Vasconcelos

Opa… só lembre de postar o resultado para darmos uma olhada, certo?

:wink:

P

Com certeza!!

Veja só:

@Override
public boolean onTouchEvent(MotionEvent event){
		 		
		switch (event.getAction()) {
				
			case MotionEvent.ACTION_DOWN:
				
				x = (int) event.getX();
				y = (int) event.getY();
				arrayX[contador] = x;
				arrayY[contador] = y;
				contador++;
				radius = 10;
				invalidate();
				break;
			case MotionEvent.ACTION_MOVE:
												
				break;
			case MotionEvent.ACTION_UP:
								
				break;
		}
		return true;
	}
P

Solução postada no post anterior!!

Marky.Vasconcelos

Era mais ou menos isso que eu tinha pensado mesmo.

Mas seria mais interessante voce fazer o esquema de Entitys que eu mostrei no artigo de dev para games com Android.

Criado 26 de abril de 2011
Ultima resposta 2 de mai. de 2011
Respostas 23
Participantes 2