Material para estudar

29 respostas
L

Olá.
Eu sou novo em programação android, e gostaria que
alguem pudesse me indicar algum material de estudo de android, desde o basico ao avançado…
Ja vi alguns tutoriais, mas eram coisas simples que só te ensinavam a fazer uma calculadora.
Tenho experiencia com Java.

29 Respostas

J

Tem a apostila de desenvolvimento mobile com android da K19

http://www.k19.com.br/downloads/apostilas/java/k19-k41-desenvolvimento-mobile-com-android

F

Tem essa video aulas.

http://www.informaticon.com.br/lojavirtual1/index.php?page=shop.browse&category_id=19&option=com_virtuemart&Itemid=71&vmcchk=1&Itemid=71

São 3 cursos, primeiro, acredito que vc já deve saber.

Mas os outros, é um pouco mais avançados, explica como usar banco, mapas eGPS.

Se eu não me engano essas aulas estão disponíveis no youtube.
Agora se vc quiser o código fonte os arquivos e os softwares, terá que comprar os DVD’s.

Abraços.

Fica com DEUS.

M

Tenho esses artigos que já estão ficando desatualizados que podem ajudar também.

A

Olá
Se entende bem o inglês, o site Android Developers tem bastante material.
Mas, eu sempre indico usar um bom livro como guia.
Não recomendo usar video-aulas, tutoriais, apostilas e coisas do tipo na fase inicial do aprendizado. Tem muita coisa boa , mas muito coisa, vamos dizer, nem tanto.
Usa um livro como base e depois usa esses materiais como apoio, exemplo, etc.

Bons estudos!

D

A H Gusukuma:
Olá
Se entende bem o inglês, o site Android Developers tem bastante material.
Mas, eu sempre indico usar um bom livro como guia.
Não recomendo usar video-aulas, tutoriais, apostilas e coisas do tipo na fase inicial do aprendizado. Tem muita coisa boa , mas muito coisa, vamos dizer, nem tanto.
Usa um livro como base e depois usa esses materiais como apoio, exemplo, etc.

Bons estudos!


Eu concordo! Estudando por livros se tem um resultado talvez um pouco mais lento, porém, muito mais eficaz na minha opinião.

Eu indico esse: http://www.casadocodigo.com.br/products/livro-android

L

Obrigado a todos.
Eu vou ler os livros e as apostilas que vocês
me indicaram.
Mas só mais uma coisa, alguém poderia me
indicar alguma apostila, livro, ou tutorial sobre a parte de Canvas? Porque depois que eu estudar o básico, a parte de Canvas e desenhos de imagens é o que eu pretendo estudar.
Desde já, obrigado.

M

Sobre o Canvas (que é bem parecido com o Graphics2D) voce pode ver algo nesse tutorial de um jogo de Pong para Android.

L

Valeu cara.
Mas eu tentei bastante desenhar com esse tutorial, mas ainda não consegui.
Eu consigo desenhar um RGB, fazendo com que a tela fique com um background colorido.
Mas quando eu tentei desenhar a bolinha, deu um erro.

a stacktrace no LogCat:

05-06 18:05:13.946: E/AndroidRuntime(758): FATAL EXCEPTION: main 05-06 18:05:13.946: E/AndroidRuntime(758): java.lang.NullPointerException 05-06 18:05:13.946: E/AndroidRuntime(758): at com.example.view.Tela.onDraw(Tela.java:36) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.View.draw(View.java:13712) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.View.draw(View.java:13596) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.View.draw(View.java:13715) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.widget.FrameLayout.draw(FrameLayout.java:467) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.View.draw(View.java:13596) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.View.draw(View.java:13594) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.View.draw(View.java:13715) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.widget.FrameLayout.draw(FrameLayout.java:467) 05-06 18:05:13.946: E/AndroidRuntime(758): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2211) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2281) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2177) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2045) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1854) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.Choreographer.doFrame(Choreographer.java:532) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.os.Handler.handleCallback(Handler.java:725) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.os.Handler.dispatchMessage(Handler.java:92) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.os.Looper.loop(Looper.java:137) 05-06 18:05:13.946: E/AndroidRuntime(758): at android.app.ActivityThread.main(ActivityThread.java:5041) 05-06 18:05:13.946: E/AndroidRuntime(758): at java.lang.reflect.Method.invokeNative(Native Method) 05-06 18:05:13.946: E/AndroidRuntime(758): at java.lang.reflect.Method.invoke(Method.java:511) 05-06 18:05:13.946: E/AndroidRuntime(758): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 05-06 18:05:13.946: E/AndroidRuntime(758): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 05-06 18:05:13.946: E/AndroidRuntime(758): at dalvik.system.NativeStart.main(Native Method)

Eu ficaria feliz se você me ajudasse :smiley:

M

Voce conseguiu carregar o Bitmap da bolinha corretamente? Precisa baixa-la e deixar no assets se bem me lembro.

L

Ainda nem cheguei na parte de usar imagem kk.
To usando “canvas.drawCircle”.

Aqui o código da tela:

package com.example.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class Tela extends View {
    Paint paint;
    Paint bpaint;
	
	public Tela(Context context) {
		super(context);
	}
	
	public Tela(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	public Tela(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}
	
	public void init() {
		paint = new Paint();
		paint.setColor(Color.BLACK);
		bpaint = new Paint();
		bpaint.setColor(Color.RED);
	}
	
	public void onDraw(Canvas canvas) {
		super.onDraw(canvas);
	    
		paint.setColor(Color.BLACK);
		
		canvas.save();
		canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
		canvas.drawCircle(80, 80, 10, bpaint);
		canvas.restore();
	}
}

Activity:

package com.example.view;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Canvas;
import android.view.Menu;

public class MainActivity extends Activity {
	
	Tela tela;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		tela = new Tela(this);
		setContentView(tela);
	}
}

:confused:

M

Falta chamar init nos seus construtores para criarem o Paint.

public Tela(Context context) {  
        super(context);  
        init();
    }  
      
    public Tela(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        init();
    }  
      
    public Tela(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
        init();
    }
L

Consegui :smiley:
Você poderia me explicar pra que servem esse construtores exatamente?

M

Os varios construtores são apenas para garantir que a View pode ser construida pelos varios mecanismos do Android.

Normalmente, via código voce utiliza apenas com o Context.
O LayoutInflater irá usar o com AttributeSet e também o com “int defStyle” se necessario.

L

Ah, entendi!
Desenhei a bolinha.
Mas to com um problema na segunda parte.
Baixei os fontes da classe Vector2D, mas ta faltando a classe Pointer2D.

Você sabe como eu posso resolver isso?

M

Pointer2D?? Não lembro nem de usar isso

L

Aliás, Point2D.
Eu peguei a classe Vector2D nesse artigo do ViniGodoy sobre vetores.
No código, há a importação de uma classe chamada Point2D.

Você não tem o link do código da classe Vector2D que você usou no tutorial do seu artigo?
Seria de grande ajuda :smiley:

M

Então, essa classe com Point2D não funciona no Android.

Essa sim: https://github.com/MarkyVasconcelos/AndroidTechsGames/blob/master/src/br/techs/math/Vector2D.java

Que aliás, faz parte do pacote com todo codigo fonte atualizado do artigo.

L

Valeu cara! :smiley:
Como é que você sabe tanto?
Vou ler o artigo sobre vetores do PontoV.
Qualquer dúvida eu tiro aqui, pode ser?

M

Opa, por nada :slight_smile:

Sei muito não, só sei empregar todo sub-set de tudo que sei para fazer as coisas. ^^

Leia os artigos do PontoV sim, isso me ajudou muito (desde antes do site), qualquer duvida pode perguntar no forum mesmo.

L

Cara, acho que to entendendo sobre e vetores até agora.
To tentando criar um movimento pra bola, porém me vem esse erro no LogCat:

05-10 16:17:55.773: E/AndroidRuntime(849): FATAL EXCEPTION: main
05-10 16:17:55.773: E/AndroidRuntime(849): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ball/com.example.ball.MainActivity}: java.lang.NullPointerException
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.os.Handler.dispatchMessage(Handler.java:99)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.os.Looper.loop(Looper.java:137)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.app.ActivityThread.main(ActivityThread.java:5041)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at java.lang.reflect.Method.invokeNative(Native Method)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at java.lang.reflect.Method.invoke(Method.java:511)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at dalvik.system.NativeStart.main(Native Method)
05-10 16:17:55.773: E/AndroidRuntime(849): Caused by: java.lang.NullPointerException
05-10 16:17:55.773: E/AndroidRuntime(849): 	at com.example.ball.MainActivity.onCreate(MainActivity.java:30)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.app.Activity.performCreate(Activity.java:5104)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-10 16:17:55.773: E/AndroidRuntime(849): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
05-10 16:17:55.773: E/AndroidRuntime(849): 	... 11 more

Pode me ajudar?

M

O que tem

at com.example.ball.MainActivity.onCreate(MainActivity.java:30)

?

L

na linha 30

gameView.setCallbackHandler(guiRefresher);

As 3 classes:

MainActivity

package com.example.ball;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {
	
	private GameView gameView;
	Handler guiRefresher;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		gameView = (GameView) findViewById(R.id.action_settings);
		
		guiRefresher = new Handler() {
			public void handleMessage(Message msg) {
				if(msg.what == 10001) {
					gameView.invalidate();
			    }
				super.handleMessage(msg);
			}
		};
		
		gameView.setCallbackHandler(guiRefresher);
		
		Thread t = new Thread(gameView);
		t.setDaemon(true);
		t.start();
		
	
	}
}

GameView

package com.example.ball;

import java.util.Vector;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;

public class GameView extends View implements Runnable {
	int width = 600, height = 1024;
	Paint background;
	Handler handler;
	Ball ball;
	
	public GameView(Context context) {
		super(context);
	}
    
	public GameView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	public GameView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}
	
	public void init() {
		background = new Paint();
		background.setColor(Color.BLACK);
		
		
	}
	
	public void onDraw(Canvas canvas) {
		canvas.drawRect(0,0, getWidth(), getHeight(), background);
	}

	@Override
	public void run() {
		while(true) {
			try {
				ball.processAI();
				
				Message msg = new Message();
				msg.what = 10001;
				
				Thread.sleep(10);
			} catch (Exception e) {
			}
		}
		
	}
	
    public void setCallbackHandler(Handler guiRefresher) {
    	this.handler = guiRefresher;
    }
}

Ball

package com.example.ball;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import com.example.ball.Vector2D;

public class Ball {
    Paint paint;
    
    Vector2D pos;
    Vector2D dir;
    float speed;
    
    public Ball(Vector2D pos, Vector2D dir, float speed) {
    	this.pos = pos;
    	this.dir = dir;
    	this.speed = speed;
    	
    	paint = new Paint();
    	paint.setColor(Color.RED);
    }

    public void draw(Canvas canvas) {
    	canvas.save();
    	canvas.drawCircle(pos.getX(), dir.getY(), 10, paint);
    	canvas.restore();
    }
    
    public void move() {
    	pos.plusMe(dir.multiply(speed));
    }
    
    public void processAI() {
    	move();
    }
}
M

Cade activity_main.xml ?

Seu GameView tem id=action_settings?

L

O Handler seria um atualizador que apaga a bolinha e redesenha em outro lugar?
Uma coisa que eu não entendi no artigo, foi que o construtor da classe Ball
tem os parâmetros :

public Ball(Vector2D pos, Vector2D dir, float speed)

Mas na classe GameView, os parâmetros do objeto da classe Ball, são:

ball = new Ball(new Vector2D(20, 20), new Vector(1,1), 1.2)

Por que Vector ao invés de Vector2D? E o parâmetro da variável speed devia ser um
float, e não um double… ou não? kk

Eu coloquei:

Rodou, a bolinha se mexe, mas só uma vez, depois para.

M

O Handler (assim como descrito no artigo se bem me lembro) serve para sincronizar a tela com a Thread secundaria que está rodando o loop do jogo.

Talvez foi erro meu antes de formatar o codigo para o artigo remover o 2D do parametro, e auto-castings funcionam sem f também.

M

Ahh… a bola não está se mechendo por que falta enviar a mensagem no seu método run (dentro do while) para o Handler.

@Override  
    public void run() {  
        while(true) {  
            try {  
                ball.processAI();  
                  
                Message msg = new Message();  
                msg.what = 10001;  
                  
handler.sendMessage(msg);
                Thread.sleep(10);  
            } catch (Exception e) {  
            }  
        }  
          
    }
L

Valeu Mark.
Consegui fazer o movimento.
Agora eu tava querendo fazer uma troca de imagens simples,
ao toque de um botão.

MainActivity:

package com.example.animar;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Canvas;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

@SuppressLint("WrongCall") 
public class MainActivity extends Activity implements Runnable {
	
	GV gv;
	Canvas canvas;
    Button bt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button bt = (Button) findViewById(R.id.button);
        gv = new GV(this);
        setContentView(R.layout.activity_main);
    }

	@Override
	public void run() {
		while(true) {
			gv.onDraw(canvas);
			try {
				Thread.sleep(1000/30);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public void move() {
		bt.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				gv.animar();
			}
		});
	}
}
GameView
package com.example.animar;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class GV extends View {
	Paint paint;
	Bitmap[] image = new Bitmap[2];
	Canvas canvas;
	
	int n = 0;
	
	public GV(Context context) {
		super(context);
		init();
	}
	
	public GV(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}
	
	public GV(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}
	
	public void init() {
		paint = new Paint();
		paint.setColor(Color.BLACK);
		
		image[0] = BitmapFactory.decodeResource(getResources(), R.drawable.ball);
		image[1] = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
	}
	
	public void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		canvas.save();
        canvas.drawRect(0, 0, 600, 1024, paint);
        canvas.drawBitmap(image[n], 0, 0, paint);
		canvas.restore();
	}
	
	public void animar() {
		n++;
	}
}

Eu queria fazer que quando eu clicasse
no botão, a int n (numero do array) fosse para 1 e o array 1 é uma outra imagem,
e com isso, aparecer outra imagem na tela.
Mas até agora não consegui nada.
Na verdade não sei se da pra fazer desse jeito
pra android. Com Java pra desktop eu conseguia.
Desde já obrigado.

M

Nesse caso, a GameView é uma View, voce precisaria de um componente fora desse layout para modificar o valor que voce quer.

Isso é possivel sim, mas o ideal é lidar com mudanças de frames do sprite num método proccessLogics, se voce seguir o artigo adiante essa lógica vai ser extraida para um método desses e voce pode modificar lá.

L

Blz, vlw!
Vou até o final do artigo agora :smiley:

Criado 3 de maio de 2013
Ultima resposta 17 de mai. de 2013
Respostas 29
Participantes 6