2010-03-03 5 views
29

Ich habe ein paar Bilder in eine Galerie geladen. Jetzt kann ich scrollen, aber sobald das Scrollen begonnen hat, hört das Scrollen nicht auf. Ich möchte, dass die Galerie nur zum nächsten Bild blättert und dann stoppt, bis der Benutzer die Bildlaufgeste erneut ausführt.Wie kann ich das Scrollen in einem Gallery Widget stoppen?

dies ist mein Code

import android.widget.ImageView; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 

public class GalleryExample extends Activity { 

private Gallery gallery; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    gallery = (Gallery) findViewById(R.id.examplegallery); 
    gallery.setAdapter(new AddImgAdp(this)); 

    gallery.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView parent, View v, int position, long id) { 

      Toast.makeText(GalleryExample.this, "Position=" + position, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 

public class AddImgAdp extends BaseAdapter { 
    int GalItemBg; 
    private Context cont; 


    private Integer[] Imgid = { 
      R.drawable.a_1, R.drawable.a_2, R.drawable.a_3, R.drawable.a_4, R.drawable.a_5, R.drawable.a_6, R.drawable.a_7 
    }; 

    public AddImgAdp(Context c) { 
     cont = c; 
     TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme); 
     GalItemBg = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0); 
     typArray.recycle(); 
    } 

    public int getCount() { 
     return Imgid.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 imgView = new ImageView(cont); 

     imgView.setImageResource(Imgid[position]); 

     i.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     imgView.setBackgroundResource(GalItemBg); 

     return imgView; 
    } 
} 

}

und die xmlLayout Datei

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" > 
<Gallery xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/examplegallery" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 
</LinearLayout> 
+0

Sie sollten ein wenig mehr Informationen über Ihr Problem liefern, um eine Antwort zu erhalten. – Janusz

+0

OK Ich habe mehrere Bilder in einer Galerie geladen, wenn ich nach rechts scrolle, hört es nie auf, ich möchte in jedem Bild anhalten. –

+0

Janusz Ich bin sicher, du weißt, wie du das lösen kannst! : D –

Antwort

2

Der einfachste Weg, den ich gefunden habe dies durch Überschreiben der Galerie onFling zu erreichen ist Methode und einen eigenen velocityX-Wert:

@Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     return super.onFling(e1, e2, 10, velocityY); 
    } 

Es ist nicht perfekt, aber es macht den Job. Im Idealfall würden Sie wahrscheinlich etwas für onFling schreiben, damit es genau so funktioniert, wie Sie es möchten.

49

Ich glaube, ich habe einen Weg gefunden, beides zu erreichen, indem ich jeweils nur eine Ansicht in der Galerie scrollen und eine minimale Wischlänge haben kann, um die Animation auszulösen.

Aufschalten der onFling Methode der Galerie Widget und stattdessen super.onFling von rufen, überprüfen Sie, ob die Swipe von links nach rechts oder von rechts war zu sehen, die entsprechende dpad Ereignis nach links und rufen Sie wie folgt:

private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ 
    return e2.getX() > e1.getX(); 
} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ 
    int kEvent; 
    if(isScrollingLeft(e1, e2)){ //Check if scrolling left 
    kEvent = KeyEvent.KEYCODE_DPAD_LEFT; 
    } 
    else{ //Otherwise scrolling right 
    kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; 
    } 
    onKeyDown(kEvent, null); 
    return true; 
} 
+3

Sie, Sir, sind ein schlauer Fuchs. Danke für diese elegante Lösung - genau das, was ich brauchte, um meine Galerie nutzbar zu machen. – sniurkst

+3

Genau das, was ich gesucht habe. Um diese Lösung zu verdeutlichen, konnte ich nicht herausfinden, wie man onFling() inline einstellt und stattdessen auf die Erstellung einer eigenen Galerie zurückgreifen musste. Diese Lösung half mir bis zum Ende: http://stackoverflow.com/questions/4582123/creating-a-custom-gallery-overriding-onfling –

+0

+1 für die Einfachheit, es funktionierte für mich! –

2

fand ich die folgende Überschreibung auf onFling für kleinen Seitenhiebe und einzelne Seite Paginierung gut genug gearbeitet: Ihrem

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
{ 
    boolean leftScroll = isScrollingLeft(e1, e2); 

    float velX; 
    if(leftScroll) 
    { 
     velX=500; 
    } 
    else 
    { 
     velX=-500; 
    } 

    return super.onFling(e1, e2, velX, velocityY); 
} 

der velX + -500 Wert scheint, gut genug Ergebnis zu liefern, aber angepasst werden kann passen Präferenzen.

(Anmerkung: Die in @Nadewad's answer die isScrollingLeft Methode vorgestellt verwendet)

12

Dies ist der Code, der für mich gearbeitet.

Nadewad Lösung + einige Animationsgeschwindigkeit Anpassungen:

Klasse erstellen, die Galerie erstreckt, und diese metods außer Kraft setzen:

@Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
    setAnimationDuration(600); 
    return super.onScroll(e1, e2, distanceX, distanceY); 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    float velMax = 2500f; 
    float velMin = 1000f; 
    float velX = Math.abs(velocityX); 
    if (velX > velMax) { 
     velX = velMax; 
    } else if (velX < velMin) { 
     velX = velMin; 
    } 
    velX -= 600; 
    int k = 500000; 
    int speed = (int) Math.floor(1f/velX * k); 
    setAnimationDuration(speed); 

    int kEvent; 
    if (isScrollingLeft(e1, e2)) { 
     // Check if scrolling left 
     kEvent = KeyEvent.KEYCODE_DPAD_LEFT; 
    } else { 
     // Otherwise scrolling right 
     kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; 
    } 
    onKeyDown(kEvent, null); 

    return true; 
    } 

Viel Spaß!

3

Der einfache Weg folgt:

@Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     return super.onFling(e1, e2, 0, velocityY); 
    } 

Sie können hier überprüfen: Android Infinite Loop Gallery

+0

Dies funktioniert am besten für mich, weil es die Galerie nur eins nach dem anderen scrollt, egal wie schnell Sie wischen. Ich habe die KeyEvent-Lösung ausprobiert und wenn Sie zu schnell wischen, wird es wie zwei oder drei überspringen. –

1

Gott sei Dank !!! OMG, ich steckte das buchstäblich in einen Code und es funktionierte! ugh, 48-Stunden gerade und zu denken, dass ich nur die perfekte Google-Suche nach meiner Antwort machen musste. Buchstäblich, Plug-and-Play. Vielen Dank.

neuer Code

public class CustomGallery extends Gallery { 

public CustomGallery(Context context) { 
    super(context); 
} 

public CustomGallery(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomGallery(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ 
    return e2.getX() > e1.getX(); 
} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ 
    int kEvent; 
    if(isScrollingLeft(e1, e2)){ //Check if scrolling left 
    kEvent = KeyEvent.KEYCODE_DPAD_LEFT; 
    } 
    else{ //Otherwise scrolling right 
    kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; 
    } 
    onKeyDown(kEvent, null); 
    return true; 
} 
} 

alter Code: nur zu Vergleichszwecken

public class CustomGallery extends Gallery { 

public CustomGallery(Context context) { 
    super(context); 
} 

public CustomGallery(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomGallery(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
     float distanceY) { 
    //Do something specific here. 
    return super.onScroll(e1, e2, distanceX, distanceY); 
} 
} 
+0

Ich bin froh, dass dir das geholfen hat. Tatsächlich hat Google die ViewPager-Klasse veröffentlicht, die dasselbe Ziel erreicht, aber tatsächlich eine intermediäre Scroll-Animation ausführt, während Sie Ihren Finger streichen, im Gegensatz zum Scrollen, nachdem die Wischbewegung beendet ist. – Nadewad

2

keine Notwendigkeit, irgend etwas zu tun, einfach return false

private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ 
    return e2.getX() > e1.getX(); 
} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ 
    return false; 
} 

es funktioniert für mich

Verwandte Themen