मुख्य सामग्री पर जाएँ
CrossFly 100% ओपन सोर्सGitHub पर फ़ॉलो करें
CrossFlyCrossFly
शुरू करें

यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।

किसी Component को स्क्रॉल-योग्य कैसे बनाएँ और overscroll समायोजित करें

उद्देश्य. कोई भी Component एक स्क्रॉल-योग्य कंटेनर बन सकता है: बस दिशा को setScrollable(ScrollDirection) से घोषित करें। यदि सामग्री (चाइल्ड की ऊँचाइयों का योग) दृश्यमान क्षेत्र से अधिक हो जाए, तो ScrollEngine pan, momentum, fling और overscroll (सीमा से आगे खींचने पर लचीला प्रभाव) को संभालता है।

उपयोग की गई APIs

  • Component.setScrollable(ScrollDirection dir, ScrollEngine... engine) — स्क्रॉल सक्षम करता है। engine वैकल्पिक है (default: नया ScrollEngine)। अक्षम करने के लिए dir के रूप में null पास करें।
  • UIConstants.ScrollDirection — enum जिसमें तीन मान हैं: HORIZONTAL, VERTICAL, BOTH।
  • Component.isScrollable() — क्या कंपोनेंट स्क्रॉल-योग्य है।
  • Component.scrollable() — Scrollable ऑब्जेक्ट (.engine के साथ) लौटाता है, या null।
  • Component.setShowScrollPosition(boolean) — स्क्रॉल स्थिति संकेतक दिखाता/छिपाता है।
  • ScrollEngine.setOverscroll(boolean x, boolean y) — प्रति अक्ष लचीला प्रभाव चालू/बंद करता है। Default: दोनों true।
  • ScrollEngine.setupOverscroll(float distance, float speedMin, float speedMax) — overscroll की दूरी और वापसी गति समायोजित करता है।
  • ScrollEngine.setScrollListener(ScrollListener listener) — प्रत्येक ऑफसेट परिवर्तन पर callback (vx, vy प्राप्त करता है)।
  • ScrollEngine.scrollTo(float x, float y) / scrollToStartSmooth() / scrollToEndSmooth() — स्क्रॉल को पुनर्स्थापित करता है।
  • ScrollEngine.setOverscrollEffect(OverscrollEffect effect) — स्थैतिक: वैश्विक ग्रे किनारा वक्र को परिभाषित/निष्क्रिय (null) करता है; new OverscrollEffect().setColor(...).setMaxAlpha(...).setMaxArcHeight(...) के जरिए अनुकूलन योग्य।

पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)

package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Component painel = new Component();
      painel.setLayout(new GridLayout(Position.CENTER, Position.START));
      for (int i = 0; i < 60; i++)
         painel.add(.95f, new Label("Linha " + i));

      painel.setScrollable(ScrollDirection.VERTICAL);   // Y अक्ष पर स्क्रॉल करता है

      // scroll engine में वैकल्पिक समायोजन:
      painel.scrollable().engine.setOverscroll(true, false);   // इलास्टिक केवल ऊर्ध्वाधर में
      painel.setShowScrollPosition(true);                       // स्थिति सूचक
      painel.scrollable().engine.setScrollListener((vx, vy) ->
         Debug.log("scrollY = " + vy));                         // scroll पर प्रतिक्रिया देता है

      add(LAY_FILL, painel);
   }
}

नीचे का अंश केवल मुख्य भाग दिखाता है। इसे चलाने के लिए, इसे ऊपर दिए MainWindow ढाँचे में रखें।

न्यूनतम अंश

// स्रोत में सत्यापित: Component.setScrollable (पंक्ति ~1027) + ScrollEngine.java
Component painel = new Component();
painel.setLayout(new GridLayout(Position.CENTER, Position.START));
for (int i = 0; i < 60; i++)
   painel.add(.95f, new Label("Linha " + i));

painel.setScrollable(ScrollDirection.VERTICAL);   // Y अक्ष पर स्क्रॉल करता है

// scroll engine में वैकल्पिक समायोजन:
painel.scrollable().engine.setOverscroll(true, false);   // इलास्टिक केवल ऊर्ध्वाधर में
painel.setShowScrollPosition(true);                       // स्थिति सूचक
painel.scrollable().engine.setScrollListener((vx, vy) ->
   Debug.log("scrollY = " + vy));                         // scroll पर प्रतिक्रिया देता है

layout.add(1f, painel);

कोड द्वारा पुनर्स्थापन:

painel.scrollable().engine.scrollToStartSmooth();   // एनिमेशन के साथ ऊपर लौटता है
painel.scrollable().engine.scrollTo(0, 500);        // offset y=500 px पर कूदता है

ईमानदार नोट: कोई तैयार pull-to-refresh नहीं है

फ्रेमवर्क तैयार “pull-to-refresh” (खींचकर-ताज़ा-करें) विजेट नहीं देता। जो मौजूद है वह overscroll प्रभाव है (सीमा से आगे खींचने पर लचीला वक्र), जो पूरी तरह दृश्य/भौतिक है — यह “X पिक्सेल खींचने के बाद छोड़ा” का कोई callback आपको refresh ट्रिगर करने के लिए उजागर नहीं करता। यदि आपको यह व्यवहार चाहिए, तो आपको इसे मैन्युअल रूप से बनाना होगा, ऑफसेट को setScrollListener के जरिए मॉनिटर करके और किसी सीमा से आगे के overscroll का पता लगाकर। डेटा पुनर्भार वाली बड़ी सूचियों के लिए, किसी बटन या अपने स्वयं के जेस्चर द्वारा ट्रिगर किए गए VirtualListView.reloadData() को प्राथमिकता दें।

और गहराई में जाएँ

  • विशाल सूचियाँ पहले से डिफ़ॉल्ट रूप से स्क्रॉल-योग्य होती हैं (VirtualListView आंतरिक रूप से setScrollable(VERTICAL) कॉल करता है): देखें lista-virtual-grande.md।
क्या यह पृष्ठ उपयोगी था?