2010-03-03 24 views
29

मैंने कुछ छवियों को एक गैलरी में लोड किया। अब मैं स्क्रॉल करने में सक्षम हूं लेकिन स्क्रॉलिंग शुरू करने के बाद एक बार रुक जाएगा नहीं। मैं गैलरी को अगली छवि पर स्क्रॉल करना चाहता हूं और फिर तब तक रुक जाऊंगा जब तक उपयोगकर्ता स्क्रॉल इशारा करता है।गैलरी विजेट में स्क्रॉलिंग को कैसे रोकें?

इस मेरी कोड

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; 
    } 
} 

}

और xmlLayout फ़ाइल

<?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

आपको उत्तर देने के लिए अपनी समस्या के बारे में कुछ और जानकारी प्रदान करनी चाहिए – Janusz

+0

ठीक है मेरे पास गैलरी में लोड की गई कई छवियां हैं, जब मैं दाईं ओर स्क्रॉल करता हूं तो यह कभी नहीं रुकता है, मैं प्रत्येक चित्र में एक स्टॉप चाहता हूं। –

+0

Janusz मुझे यकीन है कि आप इसे हल करने के बारे में जानते हैं! : डी –

उत्तर

2

सबसे आसान तरीका मैं पूरा करने के लिए इस गैलरी onFling अधिभावी कर रहा है मिल गया है है विधि, और अपना खुद का velocityX मूल्य प्रदान करना:

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

यह सही नहीं है, लेकिन यह काम करता है। आदर्श रूप से, आप संभवतः काम करने के लिए कुछ कस्टम लिखेंगे, जैसे आप इसे पसंद करते हैं।

49

मुझे लगता है कि मुझे गैलरी में एक समय में केवल स्क्रॉलिंग 1 दृश्य दोनों प्राप्त करने का तरीका मिला है और एनीमेशन ट्रिगर करने के लिए न्यूनतम स्वाइप लंबाई प्राप्त करने में सक्षम होना चाहिए।

अवहेलना गैलरी विजेट का onFling विधि और super.onFling कॉल करने के बजाय, यह देखने के लिए किया जाए या नहीं दाईं ओर स्वाइप करें या दाएँ से बाएँ और उचित dpad घटना कॉल करने के लिए बाएं से था जाँच के रूप में नीचे दिखाया गया है:

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

आप, महोदय, एक स्मार्ट लोमड़ी हैं। इस सुरुचिपूर्ण समाधान के लिए धन्यवाद - बिल्कुल मेरी गैलरी को प्रयोग करने योग्य बनाने के लिए मुझे क्या चाहिए। – sniurkst

+3

बिल्कुल वही जो मैं खोज रहा था। बस इस समाधान को स्पष्ट करने के लिए, मैं यह समझने में सक्षम नहीं था कि फ्लाइंग() इनलाइन कैसे सेट करें और इसके बजाय कस्टम गैलरी बनाने का सहारा लेना पड़ा। इस समाधान ने मुझे अंत तक मदद की: http://stackoverflow.com/questions/4582123/creating-a-custom-gallery-overriding- सरलता के लिए –

+0

+1, यह मेरे लिए काम करता है! –

2

मैंने पाया onFling पर निम्नलिखित ओवरराइड छोटे स्वाइप और एक पृष्ठ पृष्ठांकन के लिए पर्याप्त अच्छी तरह से काम किया:

@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); 
} 

velX + -500 मूल्य एक अच्छा पर्याप्त परिणाम प्रदान करने के लिए लगता है, लेकिन सूट करने के लिए समायोजित किया जा सकता अपने पसंद।

(नोट: इस @Nadewad's answer में प्रस्तुत isScrollingLeft विधि का उपयोग किया जाता है)

12

इस कोड है कि मेरे लिए काम किया है।

Nadewad के समाधान + कुछ एनीमेशन गति समायोजन:

वर्ग कि गैलरी फैली बनाएँ, और इस metods ओवरराइड:

@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; 
    } 

का आनंद लें!

3

आसान तरीका पीछा कर रहा है:

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

आप यहां देख सकते हैं: Android Infinite Loop Gallery

+0

यह मेरे लिए सबसे अच्छा काम करता है क्योंकि यह गैलरी स्क्रॉल को केवल एक समय में बनाता है इससे कोई फर्क नहीं पड़ता कि आप कितनी तेजी से स्वाइप करते हैं। मैंने KeyEvent समाधान की कोशिश की है और यदि आप बहुत तेजी से स्वाइप करते हैं, तो यह दो या तीन की तरह छोड़ देगा। –

1

धन्यवाद भगवान !!! ओएमजी, मैंने सचमुच इसे कुछ कोड में प्लग किया और यह काम किया! उह, 48-घंटे सीधे और सोचने के लिए मुझे केवल अपने उत्तर के लिए सही Google खोज करने की आवश्यकता है। सचमुच, प्लग और खेलो। बहुत बहुत धन्यवाद।

नए कोड

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; 
} 
} 

पुराने कोड: सिर्फ तुलना के प्रयोजन

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

मुझे खुशी है कि आपकी मदद की। असल में Google ने व्यूपेजर क्लास को जारी किया है जो एक ही लक्ष्य प्राप्त करता है लेकिन वास्तव में एक इंटरमीडिएट स्क्रॉलिंग एनीमेशन करता है जबकि स्वाइप गति समाप्त होने के बाद स्क्रॉलिंग के विपरीत आप अपनी अंगुली को स्वाइप कर रहे हैं। – Nadewad

2

किसी भी बात करने की कोई आवश्यकता के लिए बस वापसी झूठी

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; 
} 

इसके लिए काम किया मुझे

संबंधित मुद्दे