Telas Horizontais e verticais no android

Estou tendo dificuldade de como deixar a tela vertical da minha aplicação alinhada.
Eu tenho a aplicação na horizontal, e fica tudo certinho, bem alinhado, porém, quando eu coloco na vertical, a imagem do meio fica totalmente desalinhada.
É o seguinte, coloquei no diretorio drawable-hdpi a imagem back no formato horizontal, e no diretorio drawable-land a imagem back no formato vertical.
As duas com o mesmo nome. Até ai tudo certo.
Só que, ao colocar a imagem logo tb nos dois diretórios, quando vai pra vertical da problema
alguem pode me ajudar?


public void onDraw(Canvas canvas){
	      
		 
		   canvas.save();
		   canvas.drawBitmap(background, 0, 0, paint);
	           canvas.drawBitmap(logo, 110, 70, paint);
		   canvas.restore();
	   }

Mas voce desenha tudo na mão?

Por que não usa os atributos android:background dos componentes para isso? Esses o Android resolve sozinhod e acordo com a orientação.

Estava desenhando sim utilizando canvas.
Então como é que fica?
Não sei desse jeito que vc está dizendo

Outra coisa,
o background vai ficar desse jeito que vc falou, e as imagens tb?
Fiquei sem entender.

Marky.Vasconcelos

Consegui fazer o background,
ficou assim, confere?

android:background="@drawable/back"

Tudo ok. no caso do restante das imagens?
Eu tenho um logo que é pra ficar no meio da tela, de acordo com meu codigo ele fica na vertical, porem na horizontal nao fica.

Posta seu XML.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="@drawable/back"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
	
	<com.android.RedeDroidCanvas 
	 android:layout_width="fill_parent"
	 android:layout_height="fill_parent" 
	 android:id="@+id/RedeDroidCanvas">
	</com.android.RedeDroidCanvas>
	</LinearLayout>

no meu canvas consegui deixar a imagem no meio

canvas.drawBitmap(logo, (getWidth()/2) - (logo.getWidth()/2), (getHeight()/2) - (logo.getHeight()/2), paint);

Só não estou entendendo o seguinte,
Essa é minha tela inicial, deu certo.
ai no caso da tela de jogo mesmo que eu vou ter que colocar imagens mais a direita, ou a esquerda, como que vai ficar a questao do rendimensionamento da tela?

Ahh… isso é um jogo, ai a coisa muda.

Normalmente o que os devs fazem é criar o jogo para apenas uma orientação, o que na minha opnião é bem melhor do que se preocupar em ter um layout para os dois.

No seu caso, voce vai precisar verificar a orientação atual e pegar a imagem correta e desenhar no seu componente. O Android só cuida disso na hora que voce vai fazer o load das imagens enquanto inflando.

Marky,
Pode me explicar melhor?
Devs?

Marky ou alguém?

Vai ter que implementar transformação de matrizes, infelizmente não tem isso pronto no android.

Se voce está fazendo um jogo, por que quer suportar landscape e portrait? Isso te obriga a fazer um layout para cada orientação para aproveitar melhor o espaço.

No iOS basta configurar o componente para ocupar toda a tela e fazer:

componente.transform = CFAffineTransformMakeRotation(RADIANS(90));

Android tem que implementar tudo na mão. Não me leve a mal, os aparelhos podem ser fantásticos, mas em termos de API e ferramentas para o desenvolvedor, Android é mais parecido com j2me.

Apenas lembrando, não alimente os trolls.

No iOS basta configurar o componente para ocupar toda a tela e fazer:

componente.transform = CFAffineTransformMakeRotation(RADIANS(90));

Android tem que implementar tudo na mão. Não me leve a mal, os aparelhos podem ser fantásticos, mas em termos de API e ferramentas para o desenvolvedor, Android é mais parecido com j2me.[/quote]

Ta bom, e como voce vai especificar um layout para cada orientação apenas girando a tela?

Deixar apenas uma unica orientação na aplicação é tão facil no Android quanto no iOS.

Bom, não sei qual o jogo em questão, se é indicado ou não usar as duas orientaçoes, provavelmente vc esta certo. Mas…

…pello que entendi “é tão fácil quanto” quer dizer que não existe outra possiblidade a não ser usar um layout para cada tela ou então implementar seu proprio framework e por isso a comparação com j2me.

Para deixar apenas uma orientação no Android, basta invocar o seguinte na sua atividade.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Então vcs querem dizer que quando se trata de jogo, não é tão viável colocar das duas formas?

Marky, esse método faz o que?
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Faz um request para ficar nessa orientação.

E quando é jogos, não faz muito sentido manter as duas orientações, já que voce pode fazer o layout para aproveitar bem mais um tamanho especifico.

Ok.

Aproveitando a situação, gostaria que vcs me ajudassem em outra coisa.
Eu gostaria de fazer uma tela que quando abrisse o jogo aparecesse o logo e dpois fosse pro menu, uma espécie de Splash Window.
No caso, eu implemento o método run na classe que desenha as imagens ou na classe principal que chama as outras?

Eis as classes.

package com.android;

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;
import android.widget.ProgressBar;


public class RedeDroidCanvas extends View{
	  private Bitmap logo;
	  private Paint paint;
	  
	
	
	   public RedeDroidCanvas(Context context) {
	      super(context);
	      init();
	   }
	   public RedeDroidCanvas(Context context, AttributeSet attrs) {
	      super(context, attrs);
	      init();
	   }
	   public RedeDroidCanvas(Context context, AttributeSet attrs, int defStyle) {
	      super(context, attrs, defStyle);
	      init();
	   }
	   private void init() {
		   logo = BitmapFactory.decodeResource(getResources(), R.drawable.logo);
		   paint = new Paint();
	   }
	   public void onDraw(Canvas canvas){
	           canvas.save();
		   canvas.drawBitmap(logo, (getWidth()/2) - (logo.getWidth()/2), (getHeight()/2) - (logo.getHeight()/2), paint);
		   canvas.restore();
	   }

	   
	

}

public class RedeDroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
       
    } 
}