Problema com Canvas

25 respostas
vfmartins

Pessoal,

fiz uma tela em canvas para meu aplicativo, testei no palm e funcina perfeitamente, mas instalei esse aplicativo em outro aparelho, um nokia 5800, mas nesse aparelho essa tela não funciona corretamente, pois ao clicar em um botão da classe dessa tela ela deve ser redesenhada, mas isso só acontece quando eu saio dela e abro novamente.

Alguem sabe por que isso acontece? Alguem sabe corrigir?

obs. lembrando que num aparelho ta normal e só acontece isso no outro

aguardo sugestões!
obrigado

25 Respostas

j0nny

Posta o código aí.

vfmartins
j0nny:
Posta o código aí.

Tem algo errado aqui?

public void onButtomTouch(ButtomImage buttom){
        if (buttom == img01)
            repaint();
    }
protected void paint(Graphics g){
        // Re-define a cor que será usada no label dos botões
        int corPreto = 0x00000000;

        // Re-define a fonte que será usada no label dos botões
        Font fonteBotao = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);

        // Re-define a imagem que será usada nos botões
        Image image01 = getImg01();

        // Re-define botões e posicionamento
        img01 = new ButtomImage(212, 18, image01, this, "", corPreto, fonteBotao);

        // Pinta a tela
        g.setColor(0x00ffffff);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(0x00000000);
        g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL));

        img01.paint(g);
    }
j0nny

Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.

vfmartins

j0nny:
Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.

sim, como eu disse a tela só é mostrada quando eu saio e entro na classe novamente, mas a ideia é recarregar dentro da propria classe
isso ja funciona no palm da maneira que postei, só nesse outro aparelho que não

o que vc fez para resolver na sua situação?

j0nny

vfmartins:
j0nny:
Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.

sim, como eu disse a tela só é mostrada quando eu saio e entro na classe novamente, mas a ideia é recarregar dentro da propria classe
isso ja funciona no palm da maneira que postei, só nesse outro aparelho que não

o que vc fez para resolver na sua situação?

Ok, tente chamar o repaint do seu botão quando vc da um repaint na sua tela, deve funcionar.

vfmartins

não entendi, o meu código é só isso, tudo junto, o que mudaria se chamar separado?

j0nny

Tente assim…

public void onButtomTouch(ButtomImage buttom){
        if (buttom == img01) {
            button.repaint();
            repaint();
        }
}

Não sei se é a melhor solução, mas assim que resolvi meu problema momentaneamente :oops:

vfmartins

j0nny:
Tente assim…

public void onButtomTouch(ButtomImage buttom){
        if (buttom == img01) {
            button.repaint();
            repaint();
        }
}

Não sei se é a melhor solução, mas assim que resolvi meu problema momentaneamente :oops:

aqui deu erro no buttom.repaint(); deu cannot find symbol

viu, uma coisa que eu reparei testando no aparelho é que ele executa sim ao tocar, mas ele só pinta a tela quando eu executo alguma outra ação qualquer (mesmo que seja algo do aparelho que nem faça parte do aplicativo)

será que é algum bug do aparelho que pinta a tela com atraso ou será que estou fazendo algo errado?

j0nny

vfmartins:
j0nny:
Tente assim…

public void onButtomTouch(ButtomImage buttom){
        if (buttom == img01) {
            button.repaint();
            repaint();
        }
}

Não sei se é a melhor solução, mas assim que resolvi meu problema momentaneamente :oops:

aqui deu erro no buttom.repaint(); deu cannot find symbol

viu, uma coisa que eu reparei testando no aparelho é que ele executa sim ao tocar, mas ele só pinta a tela quando eu executo alguma outra ação qualquer (mesmo que seja algo do aparelho que nem faça parte do aplicativo)

será que é algum bug do aparelho que pinta a tela com atraso ou será que estou fazendo algo errado?

Então melhor, crie um método repinta() no seu botão que chama o repaint() e teste. Claro que é meio POG :oops: , mas teste para ver se é isso msm.

vfmartins

eu tentei isso, mas nem assim deu certo
eu verifiquei que isso também acontece quando uma tela canvas de uma classe chama uma outra tela canvas de outra classe
o que pode ser ein?

j0nny

É estranho, pq aqui faço o seguinte.
No meu form canvas, no pointerPressed(), verifico se a área de algum dos comopnentes foi tocada, se foi, então repasso o pointerPressed() para o componente, então ele se encarrega de fazer a ação que quiser e dar um repaint() nele.
No caso seria mais ou menos assim.

//no form
protected void pointerPressed(int x, int y) {
   //faço um laço percorrendo os componentes e chamando o isTouched() que nm vc
   if(componente.isTouched(int x, int y) {
      componente.pointerPressed(int x, int y);
      repaint();
   }
}

//no componente
protected void pointerPressed(int x, int y) {
   //faço a ação desejada conforme as coordenadas e repinto
   repaint();
}
vfmartins

cara, mesma coisa!

o teu código tbm funciona, mas não da maneira que eu preciso
das duas formas a tela só é pintada após alguma outra ação no aparelho
e agora?? alguém sabe o que eu faço para pintar a tela no ato?

continuo aguardado

j0nny

Cara, nem tinha me tocado, mas observe, cada vez que vc chamar o repaint(), um novo botao será criado, é isso mesmo que vc quer?
Creio que assim não pode funcionar mesmo.

vfmartins

j0nny:
Cara, nem tinha me tocado, mas observe, cada vez que vc chamar o repaint(), um novo botao será criado, é isso mesmo que vc quer?
Creio que assim não pode funcionar mesmo.

então, a intenção é que ao clicar nesse botão o usuário tenha a sensação que ele mudou de cor, mas na verdade pinta novamente a tela e no lugar daquela imagem vai uma de outra cor (eu percebi que ele faz isso, mas com atraso, pois quando eu clico a primeira vez visualmente não faz nada, mas quando eu clico a segunda eu vejo ele executar a primeira ação, entende?)

vc tem alguma sugestão??

alguém tem??

vfmartins

lembrando que no outro aparelho ja funciona (será que é erro mesmo ou imcompatibilidade)

j0nny

Cara, então use algo assim.
Tenha uma variavel de controle no seu botao, por exemplo, boolean estaClicado = false.
E quando ele for tocado, faça o seguinte, estaClicado = true.

No paint() do botao, faça

if(estaClicado) {
   //pinta na cor e no jeito que vc quiser
}
else {
   //pinte na forma comum
}

//ou ainda
int corBotao;
if(estaClicado)
   corBotao = 0x00ffffff;
else
   corBotao = 0x00000000;

//pinte seu botao com a cor que está em corBotao

Ah, e não esqueça de instanciar seu botao fora do paint() :thumbup:

vfmartins

ixi… mesma coisa…

ele executa sabe, mas a tela só carrega na próxima ação

será incompatibildade?

j0nny

Tirou a instanciação de dentro do paint()?
Ele executa normal no emmulador?
Qq coisa, posta aí como vc fez.

vfmartins
j0nny:
Tirou a instanciação de dentro do paint()? Ele executa normal no emmulador? Qq coisa, posta aí como vc fez.

tirei, testei todas as formas, mas sempre da esse atraso
no emulador funciona, mas pelo command, não consigo testar o touch
mas no palm funciona de todas as maneiras

segue meu código (que funciona no palm e no nokia tfunciona com atraso)

protected void pointerPressed(int x, int y){
    if (img01.isTouched(x, y))
        repaint();
}
protected void paint(Graphics g){   
    repinta(); 
}
public void repinta(){
    // Re-define a cor que será usada no label dos botões   
    int corPreto = 0x00000000;   
  
    // Re-define a fonte que será usada no label dos botões   
    Font fonteBotao = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);   
  
    // Re-define a imagem que será usada nos botões   
    Image image01 = getImg01();   
  
    // Re-define botões e posicionamento   
    img01 = new ButtomImage(212, 18, image01, this, "", corPreto, fonteBotao);   
  
    // Pinta a tela   
    g.setColor(0x00ffffff);   
    g.fillRect(0, 0, getWidth(), getHeight());   
    g.setColor(0x00000000);   
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL));   
  
    img01.paint(g);
}
j0nny
vfmartins:
j0nny:
Tirou a instanciação de dentro do paint()? Ele executa normal no emmulador? Qq coisa, posta aí como vc fez.

tirei, testei todas as formas, mas sempre da esse atraso
no emulador funciona, mas pelo command, não consigo testar o touch
mas no palm funciona de todas as maneiras

segue meu código (que funciona no palm e no nokia tfunciona com atraso)

protected void pointerPressed(int x, int y){
    if (img01.isTouched(x, y))
        repaint();
}
protected void paint(Graphics g){   
    repinta(); 
}
public void repinta(){
    // Re-define a cor que será usada no label dos botões   
    int corPreto = 0x00000000;   
  
    // Re-define a fonte que será usada no label dos botões   
    Font fonteBotao = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);   
  
    // Re-define a imagem que será usada nos botões   
    Image image01 = getImg01();   
  
    // Re-define botões e posicionamento   
    img01 = new ButtomImage(212, 18, image01, this, "", corPreto, fonteBotao);   
  
    // Pinta a tela   
    g.setColor(0x00ffffff);   
    g.fillRect(0, 0, getWidth(), getHeight());   
    g.setColor(0x00000000);   
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL));   
  
    img01.paint(g);
}

Cara, mas vc continua instanciando seu botao no paint() :roll:

vfmartins

mas como ele vai aparecer na tela se não for assim?

j0nny

Cara, faz do seu botao um atributo da classe Form, instancia em algum lugar fora do paint(), e sempre repinta ele no paint() do form.

vfmartins

tentei tbm desta maneira, mas o resultado é o mesmo.

fiz uma outra tentativa, somente com uma tela, sem botões, era para simplesmente carregar a tela canvas de uma classe para outra tela canvas de outra classe, mas tbm aconteceu o mesmo
o estranho é que na segunda tela eu adicionei um command.Back, aí ele mostrou a tela diretamente, mas da primeira para a segunda ele carrega e não mostra, só mostra depois que executa outra ação

será que não vai funcionar corretamente nesse aparelho?

vfmartins

Pessoal, consegui resolver essa situação utilizando serviceRepaints()

Agradeço a disponibilidade em me ajudar!

vfmartins

ahh, esse link tbm fala algo sobre o problema!!

http://www.guj.com.br/posts/list/15824.java

Abraços!!

Criado 8 de março de 2010
Ultima resposta 10 de mar. de 2010
Respostas 25
Participantes 2