Pergunta

Quando eu uso o Widget da galeria, como faço para obter as imagens para dizer escala & brilho em ser selecionado e escalado & ONU-GLOW em ser Não selecionado?

Todos os tutoriais que eu vi têm esse efeito, mas não sou capaz de vê -lo ...

Existe algum tipo de animação que eu tenho que anexar ao Galeria?

Foi útil?

Solução

Espero que isso seja útil. Eu consigo "simular" a solução de encolhimento/crescimento com o Gallery ferramenta. Desde que eles removeram o getScale(), as coisas ficam um pouco complicadas. Eu acho que essa não é a melhor solução, mas pelo menos eu posso viver com ela.

O que eu descobri é que Gallery gerencia o foco extremamente ruim. Então, a primeira abordagem foi adicionar um ouvinte de mudança de foco no ImageView exibido, mas sem sorte lá. O foco é uma bagunça lá ... em termos que, a imagem selecionada, não é a visão atualmente focada. Enviei um e-mail para o Android-Developers Mailing List sobre algum erro no documento da API (sobre o focusSearch()método e alguns contantes de foco).

Aqui está minha solução para este problema:

Crie um recurso de animação para 'crescer' a imagem:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
       android:fromXScale="1.0"
       android:toXScale="1.10"
       android:fromYScale="1.0"
       android:toYScale="1.10"
       android:duration="300"
       android:pivotX="50%"
       android:pivotY="50%"
       android:interpolator="@android:anim/accelerate_decelerate_interpolator"
       android:fillAfter="false"/>

Se você não entende o que isso significa, então você deve ler isto

Esse será o nosso efeito de 'crescimento', e você precisará salvá -lo em: res/anim/grow.xml Ou qualquer nome que te suida (mas sempre em res/anim).

Você pode seguir o guia de recursos de aqui para criar um Gallery Visão. o ImageAdapter constrói um ImageView toda vez que o Gallery chamadas de objeto getView(). Uma solução alternativa que você pode implementar é adicionar uma linha ao getView() método que identifica um View com um position, Por aqui:

...
i.setId(position);
...

Com essa linha adicionada ao getView() Método do ImageAdpater Objeto, você pode identificar inequivocamente essa visão em um ouvinte, por exemplo:

g.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void  onItemSelected  (AdapterView<?>  parent, View  v, int position, long id) {
        Animation grow = AnimationUtils.loadAnimation(YourActivity.this, R.anim.grow);

        View sideView = parent.findViewById(position - 1);
        if (sideView != null)
           ((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100));

        sideView = parent.findViewById(position + 1);
        if (sideView != null)
           ((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100));

        v.startAnimation(grow);
        v.setLayoutParams(new Gallery.LayoutParams(170, 150));
    }

    public void  onNothingSelected  (AdapterView<?>  parent) {
        System.out.println("NOTHING SELECTED");

    }
    });

Nota: Você pode notar que todos os valores da animação e dos parâmetros de layout foram escolhidos por mim em mãos. Isso é porque não vou limpar o código para você. E, essa é apenas uma solução alternativa, o problema de foco ruim com este widget ou o sistema de visualização Android. Se o foco estava bem, tudo o que você precisa fazer é definir um ouvinte de mudança de foco que faz o Gros/encolher quando foi foco/sem foco.

Espero que isso possa ajudá -lo a encontrar um caminho para o seu problema,

Cumprimentos,

Nova edição: este é o ouvinte que eu configurei, também adicionei a linha i.clearAnimation() no getView() método:

private class SelectListener implements AdapterView.OnItemSelectedListener {
     private Animation grow;
     private int last;

     public SelectListener() {
        grow = AnimationUtils.loadAnimation(RouteGallery.this, R.anim.grow);
        last = 0;
     }

     public void  onItemSelected  (AdapterView<?>  parent, View  v, int position, long id) {
        View sideView = parent.findViewById(last);
        if (sideView != null && last != position)
           sideView.clearAnimation();

        v.startAnimation(grow);
        last = position;
     }

    public void  onNothingSelected  (AdapterView<?>  parent) {
    }
}

Outras dicas

Você precisa usar um imagenswitcher. O ImagesWitcher possui métodos para definir as animações de entrada e saída (quando a imagem é selecionada e desmarcada, ou selecionada e substituída).

o Link seguinte Tem um bom tutorial sobre como usá -lo em conjunto com a galeria.

Eu implementei uma animação semelhante como esta:

final Animation shrink = AnimationUtils.loadAnimation(activity, R.anim.shrink);
shrink.setFillAfter(true);

gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            // This iterates through the views which are currently displayed on screen.
            for (int k=0; k<gallery.getChildCount(); k++){
                // Do whatever else you want, here.
                // This is how you get a particular element of a view
                ImageView background = (ImageView) gallery.getChildAt(k).findViewById(R.id.menu_item_background);

                //clear animation
                gallery.getChildAt(k).clearAnimation();

            }

            // Scale the selected one
            view.startAnimation(shrink);

        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {}

    });
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top