2011-10-08 8 views
47

संपादित करें: आसान उपायएंड्रॉयड - कई देखे जाने योग्य वस्तुओं की क्षैतिज स्क्रॉल

महत्वपूर्ण के लिए अपने खुद के जवाब देखें: बाउंटी ViewPager संशोधित करने के लिए परिदृश्य नीचे उल्लिखित को पूरा करने के स्पष्ट रास्ता के लिए की पेशकश की है। कृपया HorizontalScrollView नहीं करते हैं - मैं पूर्ण टुकड़ा जीवन चक्र परिदृश्य कवर

मैं Fragments आधारित दृश्य, जिसमें एक आइटम केंद्र और दाएँ/बाएँ करने के लिए आइटम में है आंशिक रूप से या पूरी तरह से दिखाई दे रहे हैं की क्षैतिज स्क्रॉल लागू करने की आवश्यकता की जरूरत है। ViewPager कार्य के लिए उपयुक्त बीमार है क्योंकि यह हर समय एक आइटम प्रदर्शित करने पर केंद्रित है।

नीचे समझना आसान बनाने के लिए एक त्वरित स्केच है जिसमें आइटम 1, 5 और 6 देखने योग्य क्षेत्र के बाहर हैं। और और इस दृश्यमान संख्या को कॉन्फ़िगर करने योग्य बनाना चाहते हैं, उदाहरण के लिए पोर्ट्रेट व्यू में मैं केवल 2 (या संभवतः केवल एक) आइटम दिखाऊंगा।

मैं स्क्रीन पर 3 आइटम फिट करने की कोशिश नहीं कर रहा हूं, जब तक कि केंद्रीय वस्तु को अन्य लोगों को दिखाया जा सके। छोटी स्क्रीन पर 1 केंद्रीय आइटम होना ठीक है और जैसे ही स्क्रीन आकार में बढ़ता है (फसल ठीक है) आइटम

मुझे समझ में आता है कि यह एक गैलरी की तरह दिखता है लेकिन फिर आइटम साधारण छवियां नहीं हैं लेकिन Fragments के साथ प्रत्येक खंड में एक लंबवत स्क्रॉल करने योग्य सूची

पीएस इस ब्लॉगपोस्ट को @ कॉमन्सवेयर द्वारा मिला है कि list 3 different approaches। मेरी जरूरत के लिए मुझे पसंद है # 3

enter image description here

+2

इस कड़ी की मदद से आप [HorizontalListView] (http://www.dev-smart.com/archives/34) – surendra

+0

मैं के साथ टुकड़े की क्षैतिज स्क्रॉल करने की जरूरत है:

निम्नलिखित स्निपेट देखें प्रत्येक में एक लंबवत ListView – Bostone

+0

है मेरे पास एक बहुत ही समान आवश्यकता है। गैलरी आइटम दृश्यों में ListView जोड़ने के बाद मैं गैलरी का उपयोग कर रहा था जब तक कि यह ऑब्जेक्ट्स को लीक नहीं कर लेता। वर्तमान में गैलरी को ठीक करने के बारे में सोच रहे हैं क्योंकि ViewPager को ठीक करने की कोशिश करने से सीम आसान है। –

उत्तर

24

इस में आश्चर्यजनक रूप से आसान जवाब है, मुझे यह भी यकीन नहीं है कि इसे तुरंत क्यों पोस्ट नहीं किया गया था। सटीक प्रभाव प्राप्त करने के लिए मुझे बस इतना करना था कि PagerAdapter#getPageWidth विधि को ओवरराइड करना था। डिफ़ॉल्ट रूप से यह 1 लौटाता है लेकिन यदि आप इसे 0.5 पर सेट करते हैं तो आपको 2 पेज मिलेंगे, 0.33 आपको 3, आदि देगा। पेजर आइटम्स के बीच विभाजक की चौड़ाई के आधार पर आपको मूल्य को थोड़ा कम करना पड़ सकता है।

@Override 
    public float getPageWidth(final int position) { 
     // this will have 3 pages in a single view 
     return 0.32f; 
    } 
0

मैं दो तरीकों से संभवतः इस लागू करने के लिए के बारे में सोच सकते हैं।

  1. ViewSwitcher द्वारा। यहां एक उत्कृष्ट YouTube video दिखा रहा है कि यह onGestureListener के साथ कैसे काम करता है। हालांकि, मुझे यकीन नहीं है कि यह आपके चित्र शो जैसे कई विचारों के साथ काम करेगा या नहीं।

  2. एक विकल्प के रूप में, आप HorizontalScrollView का उपयोग कर सकते हैं। हालांकि, यदि आपके पास एक दूसरे के अंदर एक स्क्रॉलव्यू है, तो यह अक्सर समस्याएं पैदा करता है, लेकिन यह एक शॉट के लायक हो सकता है!

मुझे बताएं कि यह कैसे चलता है, शुभकामनाएँ!

+0

कृपया बक्षीस नोट – Bostone

0

MrZander का दूसरा जवाब के अलावा इस https://stackoverflow.com/a/2655740/935075

+0

को भी न बंद करें। मुझे "जगह पर स्नैप" या क्षैतिज संकेतों का पता लगाने की आवश्यकता नहीं है। उन सभी को ViewPager द्वारा ख्याल रखा जाता है। कृपया एक बक्षीस नोट – Bostone

0

कैसे कुछ इसी तरह प्राप्त करने के लिए एक कस्टम क्षैतिज स्क्रॉल दृश्य लिखने के लिए पर Check out this blog post पर एक नज़र डालें। उदाहरण में एक समय में केवल एक स्क्रीन दिखाई दे रही है, लेकिन आप इसे अपनी आवश्यकताओं के लिए आसानी से संशोधित करने में सक्षम होना चाहिए।

+0

पढ़ें मेरे पास ViewPager के आधार पर कार्यान्वयन है जो उस समय एक स्क्रीन करता है। मैं विशेष रूप से बकाया – Bostone

+0

में एकाधिक/आंशिक विचारों के लिए कॉल करता हूं, उस उदाहरण में कोड ठीक वही नहीं करेगा जो आप चाहते हैं, लेकिन यह शुरू करने के लिए एक शानदार जगह है। उदाहरण में, आंतरिक दृश्य बाहरी दृश्य (क्षैतिज स्क्रॉल व्यू) के समान चौड़ाई हैं, इसलिए स्वाभाविक रूप से, उनमें से केवल एक ही समय में दिखाई देता है। आप कोड को ट्वीक कर सकते हैं ताकि आपके आंतरिक विचार बाहरी स्क्रॉल व्यू से कम हो जाएं। यह एक ही समय में उनमें से एक से अधिक दिखाई देने की अनुमति देगा।यदि आप ऐसा करते हैं, तो आपको "स्क्रॉल टू" मान को ट्विक करने की भी आवश्यकता होगी ताकि "स्नैप" होने पर मध्य दृश्य ठीक से केंद्रित हो। – Joel

+0

मैं ViewPager के साथ ऐसा करने के लिए देख रहा हूँ। मैं तब से क्षैतिज स्क्रॉलव्यू मार्ग नहीं जाना चाहता हूं, इसलिए मैं ViewPager – Bostone

2

एक बार जब मैंने टेम्पलेट के समान कुछ लिखा था। मेरे उदाहरण में मैं बटन ऊपर और नीचे बटन के साथ स्क्रॉल कर सकते हैं। आप अपनी आवश्यकताओं को पूरा करने के लिए इसे थोड़ा सा संशोधित कर सकते हैं।


यह इस तरह दिखता है: मेरे उदाहरण में मैं 4 दृश्य इस तरह की व्यवस्था की है।

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
     <LinearLayout 
     android:layout_height="350sp" 
     android:layout_width="320sp"> 
     <LinearLayout 
      android:id="@+id/viewContainer" 
      android:background="#CCCCCC" 
      android:layout_width="640sp" 
      android:layout_height="700sp"> 
     </LinearLayout> 
    </LinearLayout> 
     <TableLayout 
      android:id="@+id/tableLayout" 
      android:layout_width="320sp" 
      android:layout_height="fill_parent" 
      android:stretchColumns="1" 
      android:gravity="bottom" 
      android:layout_alignParentBottom="true"> 
      <TableRow 
      android:background="#333333" 
      android:gravity="bottom">  
      <Button 
       android:id="@+id/btnUp" 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:text="Lift U" 
       /> 
      <Button 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:visibility="invisible" 
      /> 
      <Button 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:visibility="invisible" 
      /> 
      <Button 
       android:id="@+id/btnScreenUp" 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:layout_gravity="right" 
       android:text="Scrn U" 
       /> 
      </TableRow> 
      <TableRow 
       android:background="#444444" 
       android:layout_gravity="right"> 
       <Button 
       android:id="@+id/btnDown" 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:text="Lift D" 
       /> 
       <Button 
       android:id="@+id/btnEnter" 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:text="Enter" 
       /> 
       <Button 
       android:id="@+id/btnScreenLeft" 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:layout_gravity="right" 
       android:text="Scrn L" 
       /> 
       <Button 
       android:id="@+id/btnScreenDown" 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:layout_gravity="right" 
       android:text="Scrn D" 
       /> 
       <Button 
       android:id="@+id/btnScreenRight" 
       android:layout_width="60sp" 
       android:layout_height="50sp" 
       android:layout_gravity="right" 
       android:text="Scrn R" 
       /> 
      </TableRow> 
    </TableLayout> 
</FrameLayout> 

और इस जावा कोड:

import android.app.Activity; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.view.Gravity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class ViewSwitcherTest extends Activity { 

    private TextView view1, view2, view3, view4; 
    private Button btnUp, btnEnter, btnDown, btnScreenDown, btnScreenUp, btnScreenLeft, btnScreenRight; 
    private LinearLayout viewContainer; 
// private TableLayout tableLayout; 
    private LinearLayout.LayoutParams layoutParams; 
    private DisplayMetrics metrics = new DisplayMetrics(); 
    private int top = 0, left = 0; 
    private float density = 1.0f; 
// private ViewSwitcher switcher; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     density = metrics.density; 
     setContentView(R.layout.main); 
//  Buttons 
     btnEnter = (Button)findViewById(R.id.btnEnter); 
     btnUp = (Button)findViewById(R.id.btnUp); 
     btnDown = (Button)findViewById(R.id.btnDown); 
     btnScreenDown = (Button)findViewById(R.id.btnScreenDown); 
     btnScreenUp = (Button)findViewById(R.id.btnScreenUp); 
     btnScreenLeft = (Button)findViewById(R.id.btnScreenLeft); 
     btnScreenRight = (Button)findViewById(R.id.btnScreenRight); 
//  -------- 
//  tableLayout = (TableLayout)findViewById(R.id.tableLayout); 
     view1 = new TextView(this); 
     view1.setBackgroundResource(R.drawable.view1); 
     view1.setHeight((int)(350*density)); 
     view1.setWidth((int)(320*density)); 
     view1.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL); 
     layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     layoutParams.setMargins(left, top, 0, 0); 
     viewContainer = (LinearLayout)findViewById(R.id.viewContainer); 
     viewContainer.addView(view1, layoutParams); 
     //Add 2nd view 
     view2 = new TextView(this); 
     view2.setBackgroundResource(R.drawable.view2); 
     view2.setHeight((int)(350*density)); 
     view2.setWidth((int)(320*density)); 
     view2.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL); 
     layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     layoutParams.setMargins(left, top, 0, 0); 
     viewContainer.addView(view2, layoutParams); 
     //Add 3rd view 
     view3 = new TextView(this); 
     view3.setBackgroundResource(R.drawable.view3); 
     view3.setHeight((int)(350*density)); 
     view3.setWidth((int)(320*density)); 
     view3.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL); 
     top += 350*density; 
     left += 640*density*(-1); 
     layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     layoutParams.setMargins(left, top, 0, 0); 
     viewContainer.addView(view3, layoutParams);  
     //add 4th view 
     view4 = new TextView(this); 
     view4.setBackgroundResource(R.drawable.view4); 
     view4.setHeight((int)(350*density)); 
     view4.setWidth((int)(320*density)); 
     view4.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL); 
     top += 0; 
     left += 640*density; 
     layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     layoutParams.setMargins(left, top, 0, 0); 
     viewContainer.addView(view4, layoutParams);  
     btnEnter.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Quit the application for now 
       finish(); 
      } 
     }); 
     btnScreenLeft.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       viewContainer.scrollBy(-10,0); 
      } 
     }); 
     btnScreenRight.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       viewContainer.scrollBy(10,0); 
      } 
     }); 
     btnScreenUp.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       viewContainer.scrollBy(0,-10); 
      } 
     }); 
     btnScreenDown.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       viewContainer.scrollBy(0,10); 
      } 
     }); 
//  view1.setOnKeyListener(new OnKeyListener() {    
//   @Override 
//   public boolean onKey(View v, int keyCode, KeyEvent event) { 
//    if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) 
//     viewContainer.scrollBy(0,10); 
//    return true; 
//   } 
//  }); 
    } 
} 

Android View Scrolling

कोड इस एक्सएमएल से मिलकर बनता है: चित्र पर मैं देखने के लिए 2 सही करने के लिए दृश्य 1 से स्क्रॉल प्रत्येक स्क्रीन पर बड़ी संख्या काले रंग की छवियां हैं जिन पर चित्रित संख्याएं हैं। (मैंने इसे यहां पोस्ट नहीं किया क्योंकि आप शायद कोड को संशोधित करेंगे)।

+0

संख्या के बहुत से टुकड़े से संबंधित कार्यक्षमता खो दूंगा, नहीं, इस मार्ग पर नहीं जा सकता। मेरे पास बहुत जटिल सेटअप है जहां मैं Fragments जीवन चक्र का ख्याल रखने के लिए ViewPager और FragmentStatePagerAdapter का उपयोग कर रहा हूं। इस बिंदु पर मैं व्यूपेजर को संशोधित करने के विचार पर बहुत अधिक सेट कर रहा हूं और – Bostone

0

यदि आप व्यूपेजर को विस्तारित करना चाहते हैं तो ड्रॉ विधि को ओवरराइड करें, और setOffscreenPageLimit (int सीमा) सेट करें। लेकिन, अगर आप अपने टुकड़े स्वयं जटिल हैं तो FragmentPageAdapter का उपयोग करने की सलाह देते हैं।

आप स्रोत कोड here जांच कर सकते हैं या आप इसे here कर सकते हैं आप समर्थन पैकेज में एक जांच करने के लिए चाहते हैं।

+0

को संशोधित/विस्तारित करने के लिए मुझे किस भाग पर आवश्यकता है, इस पर एक संकेत की तलाश है कि मैं FragmentStatePagerAdapter का उपयोग कर रहा हूं लेकिन यह एक एकल टुकड़े का ख्याल रखता है और मुझे रास्ता पुन: व्यवस्थित करने की आवश्यकता है सूची में एकाधिक टुकड़ों के साथ स्क्रीन पर स्थित है। मुझे कोड स्रोत के बारे में पता है, धन्यवाद – Bostone

+0

यदि मुख्य व्यक्ति से अलग टुकड़े सक्रिय होने की आवश्यकता नहीं है, तो बस ज़ूम के साथ केंद्रीय को छोटा करें, और एक छवि को किसी भी तरफ जोड़ें जो घटक/खंड का प्रतिनिधित्व करता है। छवि को एक बार बनाएं, फिर उस क्षेत्र को स्क्रॉल करते समय खींचें। –

+0

यह करता है। विशेष रूप से यदि आप टैबलेट में हैं और साइड टुकड़े पूरी तरह से दिखाई दे रहे हैं – Bostone

1

हम GalleryFragments के साथ BaseAdapter के साथ एक गैलरी एडाप्टर का उपयोग करके वर्णन कर रहे हैं जैसे कुछ बहुत कुछ कर रहे हैं। मैं आपके लक्ष्य को प्राप्त करने के लिए एक गैलरी के साथ जाने की अनुशंसा करता हूं (हम उस दृश्य के लिए ViewPager का भी उपयोग करते हैं जहां हमें अन्य टुकड़े देखने की आवश्यकता नहीं है)।