দাবি অস্বীকার: এর পরে যা হয় তা মূলত প্রতিক্রিয়া নেটিভ ০.০৫ এ আমার নিজস্ব পরীক্ষার ফলাফল। ScrollViewডকুমেন্টেশন নিম্নোল্লিখিত আবৃত তথ্য অনেক অনুপস্থিত; উদাহরণস্বরূপ onScrollEndDragসম্পূর্ণরূপে নথিভুক্ত। যেহেতু এখানে সমস্ত কিছুই অননুমোদিত আচরণের উপর নির্ভর করে, তাই দুর্ভাগ্যক্রমে আমি কোন প্রতিশ্রুতি দিতে পারি না যে এই তথ্যটি এখন থেকে এক বছর বা এমনকি এক মাস পর্যন্ত সঠিক থাকবে।
এছাড়াও, নীচের সমস্ত কিছু খাঁটি উল্লম্ব স্ক্রোলভিউ ধরে নেয় যার ওয়াই অফসেটে আমরা আগ্রহী; এক্স অফসেটে অনুবাদ করা , যদি প্রয়োজন হয় তবে আশা করি পাঠকের পক্ষে একটি সহজ অনুশীলন।
বিভিন্ন ইভেন্ট হ্যান্ডলাররা একবার ScrollViewনেবেন eventএবং আপনাকে দিয়ে বর্তমান স্ক্রোলের অবস্থানটি পেতে দিন event.nativeEvent.contentOffset.y। এর মধ্যে কয়েকটি হ্যান্ডলারের অ্যান্ড্রয়েড এবং আইওএসের মধ্যে কিছুটা আলাদা আচরণ রয়েছে, যা নীচে বিস্তারিত রয়েছে।
অ্যান্ড্রয়েডে
ব্যবহারকারী যখন স্ক্রল করছে তখন প্রতিটি ফ্রেমে আগুন জ্বলছে, যখন স্ক্রোল ভিউটি প্রকাশের পরে চূড়ান্ত হয় যখন ব্যবহারকারীর এটি প্রকাশের পরে, চূড়ান্ত ফ্রেমে স্ক্রোল ভিউটি বিশ্রামে আসে এবং যখনই তার ফ্রেমের ফলস্বরূপ স্ক্রোল ভিউ'র অফসেট পরিবর্তন হয় পরিবর্তন হচ্ছে (যেমন ল্যান্ডস্কেপ থেকে প্রতিকৃতিতে ঘোরার কারণে)।
আইওএস-এ
যখন ব্যবহারকারী টেনে আনছে বা যখন স্ক্রোল ভিউ গ্লাইড হচ্ছে তখন অগ্নিকাণ্ডে scrollEventThrottleফ্রেম দ্বারা নির্ধারিত কিছু ফ্রিকোয়েন্সি এবং একবারে ফ্রেম প্রতি একবার scrollEventThrottle={16}। যদি গ্লাইডে পর্যাপ্ত গতি থাকতে পারে ব্যবহারকারী যদি স্ক্রোল ভিউটি ছেড়ে দেয় তবে onScrollগ্লাইডিংয়ের পরে বিশ্রাম নেওয়ার পরে হ্যান্ডলারটিও ফায়ার করবে। উপরন্তু ব্যবহারকারী drags এবং তারপর স্ক্রল দৃশ্য প্রকাশ যখন এটি নিশ্চল হয়, onScrollহয় না আগুন চূড়ান্ত অবস্থান জন্য যদি না নিশ্চিত scrollEventThrottleযেমন নির্ধারণ করা হয়েছে যে onScrollদাবানল স্ক্রলিং প্রতিটি ফ্রেম।
সেটিংয়ের জন্য একটি পারফরম্যান্স ব্যয় রয়েছে scrollEventThrottle={16}যা এটিকে বড় সংখ্যায় সেট করে কমিয়ে আনা যায়। যাইহোক, এর অর্থ এটি onScrollপ্রতিটি ফ্রেমগুলিকে চালিত করবে না।
গ্লাইডিংয়ের পরে যখন স্ক্রোল ভিউ বন্ধ হয়ে যায় তখন আগুন। যদি ব্যবহারকারী স্থির থাকে এমন স্থির হয় যাতে এটি গ্লাইড করে না তবে যদি ব্যবহারকারী স্ক্রোল ভিউটি প্রকাশ করে তবে একেবারেই জ্বলবে না।
onScrollEndDrag
ব্যবহারকারী যখন স্ক্রোল ভিউটি টানা বন্ধ করে দেয় তখন আগুন লাগে - নির্বিশেষে স্ক্রোল ভিউটি স্টেশনটি ছেড়ে যায় বা গ্লাইড শুরু হয় কিনা।
আচরণে এই পার্থক্যগুলি দেওয়া, অফসেটের ট্র্যাক রাখার সর্বোত্তম উপায়টি আপনার সুনির্দিষ্ট পরিস্থিতিতে নির্ভর করে। সবচেয়ে জটিল ক্ষেত্রে (আপনার ScrollViewঘূর্ণনের কারণে ফ্রেমের পরিবর্তনগুলি সামলানো সহ অ্যান্ড্রয়েড এবং আইওএস সমর্থন করা দরকার , এবং আপনি অ্যান্ড্রয়েডে scrollEventThrottle16 এ সেট করা থেকে পারফরম্যান্সের জরিমানা গ্রহণ করতে চান না ) এবং আপনাকে পরিচালনা করতে হবে স্ক্রোল ভিউতে থাকা সামগ্রীতেও পরিবর্তন ঘটে , তবে এটি একটি ডান অভিশাপ।
সবচেয়ে সহজ কেসটি হ'ল যদি আপনার কেবল অ্যান্ড্রয়েড হ্যান্ডেল করা প্রয়োজন; শুধু ব্যবহার করুন onScroll:
<ScrollView
onScroll={event => {
this.yOffset = event.nativeEvent.contentOffset.y
}}
>
আইওএসকে সমর্থন করার জন্য, আপনি যদিonScroll প্রতিটি ফ্রেম হ্যান্ডলারটি সরিয়ে ফেলাতে খুশি হন এবং এর কার্য সম্পাদনের প্রভাবগুলি গ্রহণ করে এবং যদি আপনার ফ্রেম পরিবর্তনগুলি হ্যান্ডেল করার প্রয়োজন না হয় তবে এটি কিছুটা জটিলতর:
<ScrollView
onScroll={event => {
this.yOffset = event.nativeEvent.contentOffset.y
}}
scrollEventThrottle={16}
>
আইওএসের উপরে ওভারহেডের পারফরম্যান্স হ্রাস করার জন্য এখনও এই গ্যারান্টি দিয়েছিলাম যে আমরা যে কোনও অবস্থান স্ক্রোল ভিউ স্থির করে রেকর্ড করেছি, আমরা বাড়াতে scrollEventThrottleএবং অতিরিক্তভাবে একটি onScrollEndDragহ্যান্ডলার সরবরাহ করতে পারি:
<ScrollView
onScroll={event => {
this.yOffset = event.nativeEvent.contentOffset.y
}}
onScrollEndDrag={event => {
this.yOffset = event.nativeEvent.contentOffset.y
}}
scrollEventThrottle={160}
>
কিন্তু আমরা যদি ফ্রেম পরিবর্তন এবং / অথবা বিষয়বস্তু পরিবর্তন হ্যান্ডেল করতে (যেমন, কারণ আমরা ডিভাইস আবর্তিত হবে, স্ক্রল দৃশ্য ফ্রেমের জন্য উপলব্ধ উচ্চতা পরিবর্তন অনুমতি) চান, তাহলে আমরা অতিরিক্ত উভয় বাস্তবায়ন করতে হবে onContentSizeChangeএবং onLayoutউভয় উচ্চতা ট্র্যাক রাখতে স্ক্রোল ভিউর ফ্রেম এবং এর বিষয়বস্তুগুলি এবং তারপরে ক্রমাগত সর্বাধিক সম্ভব অফসেট এবং ইনফারার গণনা করুন যখন কোনও ফ্রেম বা সামগ্রীর আকার পরিবর্তনের কারণে অফসেটটি স্বয়ংক্রিয়ভাবে হ্রাস পেয়েছে:
<ScrollView
onLayout={event => {
this.frameHeight = event.nativeEvent.layout.height;
const maxOffset = this.contentHeight - this.frameHeight;
if (maxOffset < this.yOffset) {
this.yOffset = maxOffset;
}
}}
onContentSizeChange={(contentWidth, contentHeight) => {
this.contentHeight = contentHeight;
const maxOffset = this.contentHeight - this.frameHeight;
if (maxOffset < this.yOffset) {
this.yOffset = maxOffset;
}
}}
onScroll={event => {
this.yOffset = event.nativeEvent.contentOffset.y;
}}
onScrollEndDrag={event => {
this.yOffset = event.nativeEvent.contentOffset.y;
}}
scrollEventThrottle={160}
>
হ্যাঁ, এটি বেশ ভয়াবহ। আমি এটিও 100% নিশ্চিত নই যে আপনি যেখানে স্ক্রোল ভিউর ফ্রেম এবং বিষয়বস্তু উভয়ই একই সাথে পরিবর্তন করতে পারেন সেখানে এটি সর্বদা সঠিকভাবে কাজ করবে । তবে এটি আমি সেরাটি নিয়ে আসতে পারি এবং যতক্ষণ না এই বৈশিষ্ট্যটি কাঠামোর মধ্যে যুক্ত হয় , আমি মনে করি যে এটি যে কেউই করতে পারেন এটি সেরা।