7
votes

Android Gallery Zoom in / Out

Bonjour, j'utilise le widget de la galerie pour afficher les images téléchargées à partir d'Internet.

Pour montrer plusieurs images et j'aimerais avoir un zoom progressif pendant que les gens glissent de haut en bas sur l'écran. Je sais comment mettre en œuvre l'événement tactile La seule chose que je ne sais pas comment rendre la vision de la galerie entière grandir progressivement. Je ne veux pas zoomer sur une seule image Je veux que toute la galerie soit zoomée progressivement. P>

Edit3: Je parviens à zoomer la partie visible de la galerie, mais que je dois trouver Un moyen pour la galerie d'en savoir plus et mettez à jour les autres enfants aussi. p>

Que se passe-t-il est si 3 images sont visibles, alors vous commencez à zoomer et que la galerie devient plus petite, alors faites les images, mais que je voudrais dans ce cas est plus d'images pour être visibles forte > Mais je ne sais pas comment atteindre cet effet désiré. Voici tout le code: P>

public class Gallery1 extends Activity implements OnTouchListener {

private static final String TAG = "GalleryTest";
private float zoom=0.0f;
// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
Gallery g;
LinearLayout layout2;
private ImageAdapter ad;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallery_1);
    layout2=(LinearLayout) findViewById(R.id.layout2);

    // Reference the Gallery view
    g = (Gallery) findViewById(R.id.gallery);
    // Set the adapter to our custom adapter (below)
    ad=new ImageAdapter(this);
    g.setAdapter(ad);


    layout2.setOnTouchListener(this);

}


public void zoomList(boolean increase) {
    Log.i(TAG, "startig animation");


    AnimatorSet set = new AnimatorSet();
    set.playTogether(

        ObjectAnimator.ofFloat(g, "scaleX", zoom),
        ObjectAnimator.ofFloat(g, "scaleY", zoom)

    );
    set.addListener(new AnimatorListener() {

        @Override
        public void onAnimationStart(Animator animation) {


        }

        @Override
        public void onAnimationRepeat(Animator animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animator animation) {

        }

        @Override
        public void onAnimationCancel(Animator animation) {
            // TODO Auto-generated method stub

        }
    });
    set.setDuration(100).start();


}


public class ImageAdapter extends BaseAdapter {
    private static final int ITEM_WIDTH = 136;
    private static final int ITEM_HEIGHT = 88;

    private final int mGalleryItemBackground;
    private final Context mContext;

    private final Integer[] mImageIds = {
            R.drawable.gallery_photo_1,
            R.drawable.gallery_photo_2,
            R.drawable.gallery_photo_3,
            R.drawable.gallery_photo_4,
            R.drawable.gallery_photo_5,
            R.drawable.gallery_photo_6,
            R.drawable.gallery_photo_7,
            R.drawable.gallery_photo_8
    };

    private final float mDensity;

    public ImageAdapter(Context c) {
        mContext = c;
        // See res/values/attrs.xml for the <declare-styleable> that defines
        // Gallery1.
        TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
        mGalleryItemBackground = a.getResourceId(
                R.styleable.Gallery1_android_galleryItemBackground, 1);
        a.recycle();

        mDensity = c.getResources().getDisplayMetrics().density;
    }

    public int getCount() {
        return mImageIds.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            convertView = new ImageView(mContext);

            imageView = (ImageView) convertView;
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            imageView.setLayoutParams(new Gallery.LayoutParams(
                    (int) (ITEM_WIDTH * mDensity + 0.5f),
                    (int) (ITEM_HEIGHT * mDensity + 0.5f)));

        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mImageIds[position]);

        return imageView;
    }
}

public boolean onTouch(View v, MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_MOVE
            && event.getPointerCount() > 1) {
        midPoint(mid, event);

        if(mid.y > start.y){

            Log.i(TAG, "Going down (Math.abs(mid.y - start.y)= "+(Math.abs(mid.y - start.y))+" and zoom="+zoom); // going down so increase
            if ((Math.abs(mid.y - start.y) > 10) && (zoom<2.5f)){

                zoom=zoom+0.1f;
                midPoint(start, event);
                zoomList(true);


            }
            return true;
        }else if(mid.y < start.y){

            Log.i(TAG, "Going up (Math.abs(mid.y - start.y)= "+(Math.abs(mid.y - start.y))+" and zoom="+zoom); //smaller
            if ((Math.abs(mid.y - start.y) > 10) &&(zoom>0.1)){

                midPoint(start, event);
                zoom=zoom-0.1f;
                zoomList(false);

            }
            return true;
        }

    }

    else if (event.getAction() == MotionEvent.ACTION_POINTER_DOWN) {
        Log.e(TAG, "Pointer went down: " + event.getPointerCount());
        return true;
    }
    else if (event.getAction() == MotionEvent.ACTION_UP) {
        Log.i(TAG, "Pointer going up");
        return true;
    }
    else if (event.getAction() == MotionEvent.ACTION_DOWN) {
        Log.i(TAG, "Pointer going down");
        start.set(event.getX(), event.getY());
        return true;
    }

     return false;
       // indicate event was handled or not
   }

private void midPoint(PointF point, MotionEvent event) {
    float x = event.getX(0) + event.getX(1);
    float y = event.getY(0) + event.getY(1);
    point.set(x / 2, y / 2);
 }


0 commentaires

4 Réponses :


1
votes

Pour garder l'état de l'animation après sa fin, faites-le simplement sur votre animation: xxx

édition:

dans mon projet, j'utilise cette méthode et je pense que c'est vous aider:

http://developer.sonymobile.com/w3/2011/04 / 12 / HOW-TOT-AVANT-AVANT-AVANT-AVANT-AN-PINCH-TO-ZOOM-FEURE-IN-YOUR-XPERIA% E2% 84% A2-10-Apps-Part-1 /


2 commentaires

Vous êtes une rigueur mais j'utilisais Animset alors dû l'appliquer à l'ensemble de l'ensemble, mais cela ne résout pas mon problème: l'animation redimensionniste la galerie mais pas d'une certaine manière que je veux. Quand la galerie devient plus petite, j'aimerais qu'il affiche davantage d'images, mais dans mon cas, il affiche encore une image, de sorte que toute la disposition se contracte.


oui j'ai vu ce code c'est génial mais il y a beaucoup d'exemples qui manipulent l'image zoomer le problème est que j'ai besoin de zoomer plusieurs images en même temps et la galerie doit se redresser pour montrer une ou plusieurs images en fonction du zoom niveau.



4
votes

Le suivant scalinggallery implémentatif pourrait être utile.
Cette sous-classe Gallery remplace la getchildstatictransformation (vue enfant, transformation t) méthode dans laquelle la mise à l'échelle est effectuée. Vous pouvez également personnaliser les paramètres de mise à l'échelle pour répondre à vos propres besoins.

Veuillez noter le scalinggalleryitemlayout.java classe. Ceci est nécessaire car une fois que vous avez effectué la mise à l'échelle de fonctionnement sur les vues de l'enfant, leurs boîtes à succès ne sont plus valides, elles doivent donc être mises à jour avec le getchildstatictransformation (vue enfant, transformation t) < / Strong> Méthode.

Ceci est fait en emballant chaque élément de galerie dans un scalinggalleryItemLayout qui étend un linearlayout . Encore une fois, vous pouvez personnaliser cela pour répondre à vos propres besoins si un linearlayout ne répond pas à vos besoins pour la mise en page des articles de la galerie.

fichier: /src/com/example/scalinggallery.java xxx

fichier: /src/com/example/scalinggalleryItemLayout.java xxx

Fichier: /res/layout/scaledgalleryItemLayout.xmlLeight/strong> xxx


3 commentaires

Merci Akos pour votre réponse. Je l'ai essayé mais j'utilise des animations sur la galerie, le résultat est le même qu'avant: Les visibles sont Schrinks mais aucune nouvelle vue n'est tirée. Si j'applique l'animation à une seule vue que la vue et qui ne fait que zoomer. Si j'utilise Scalex / Shagyy Même chose ... J'ai décidé de créer ma propre vision et de dessiner les bitmaps


S'il vous plaît mettez votre code complet ici ... j'en ai besoin de toute urgence ... merci d'avance!


@Akos CZ J'ai essayé avec votre solution mais sa erreur ne fonctionne pas.Got ArrayIndexoutofboundSException erreur.



0
votes

u peut faire l'option zoomer zoomer pour la galerie également. En utilisant ci-dessous lignes de code:

Vous pouvez télécharger l'exemple.

https://github.com/alvinsj/android-Image-gallery/downloads < / a>

J'espère que cet exemple vous aidera à vous-même.


0 commentaires

0
votes

1 commentaires

Veuillez ne pas copier et coller des réponses sur plusieurs questions. En outre, les réponses uniquement des liaisons sont généralement fronçées ici, pourriez-vous expliquer plus en détail pourquoi le projet LIME GITUB résoudra le problème exact? Enfin, nous préférerions que vous puissiez placer le code de l'échantillon quelque part autre que Mediafire, car ces liens meurent assez rapidement.