আমার অ্যান্ড্রয়েড বিন্যাসে আমার কাছে 2 স্ক্রোলভিউ রয়েছে। আমি কীভাবে তাদের স্ক্রোল অবস্থানগুলি সিঙ্ক্রোনাইজ করতে পারি?
উত্তর:
স্ক্রোলভিউতে একটি পদ্ধতি রয়েছে ...
protected void onScrollChanged(int x, int y, int oldx, int oldy)
দুর্ভাগ্যক্রমে গুগল কখনও ভাবেন নি যে আমাদের এটি অ্যাক্সেস করার দরকার হবে, এ কারণেই তারা এটিকে সুরক্ষিত করেছে এবং "সেটঅনস্ক্রোলচ্যাঞ্জডলিস্টার" হুক যোগ করেনি didn't সুতরাং আমাদের নিজের জন্য এটি করতে হবে।
প্রথমে আমাদের একটি ইন্টারফেস দরকার।
package com.test;
public interface ScrollViewListener {
void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
}
তারপরে আমাদের স্ক্রোলভিউ ক্লাসটি ওভাররাইড করা দরকার, স্ক্রোলভিউলিস্টনার হুক সরবরাহ করতে।
package com.test;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
public class ObservableScrollView extends ScrollView {
private ScrollViewListener scrollViewListener = null;
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if(scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
}
এবং বিদ্যমান স্ক্রোলভিউ ট্যাগগুলির পরিবর্তে লেআউটটিতে আমাদের এই নতুন পর্যবেক্ষণযোগ্য স্ক্রোলভিউ ক্লাসটি নির্দিষ্ট করা উচিত।
<com.test.ObservableScrollView
android:id="@+id/scrollview1"
... >
...
</com.test.ObservableScrollView>
অবশেষে, আমরা এগুলি সমস্ত লেআউট শ্রেণিতে একসাথে রেখেছি।
package com.test;
import android.app.Activity;
import android.os.Bundle;
public class Q3948934 extends Activity implements ScrollViewListener {
private ObservableScrollView scrollView1 = null;
private ObservableScrollView scrollView2 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.q3948934);
scrollView1 = (ObservableScrollView) findViewById(R.id.scrollview1);
scrollView1.setScrollViewListener(this);
scrollView2 = (ObservableScrollView) findViewById(R.id.scrollview2);
scrollView2.setScrollViewListener(this);
}
public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
if(scrollView == scrollView1) {
scrollView2.scrollTo(x, y);
} else if(scrollView == scrollView2) {
scrollView1.scrollTo(x, y);
}
}
}
স্ক্রোলটো () কোডটি আমাদের জন্য যে কোনও লুপ অবস্থার যত্ন নেয়, তাই আমাদের এটি নিয়ে চিন্তা করার দরকার নেই। একমাত্র সতর্কতা হ'ল এই সমাধানটি অ্যান্ড্রয়েডের ভবিষ্যতের সংস্করণগুলিতে কাজ করার গ্যারান্টিযুক্ত নয়, কারণ আমরা একটি সুরক্ষিত পদ্ধতি উপস্থাপন করছি।
অ্যান্ডির সমাধানের উন্নতি: তার কোডে তিনি স্ক্রোলটো ব্যবহার করেন, সমস্যাটি হল, আপনি যদি একটি স্ক্রোলভিউ এক দিকে চালিয়ে যান এবং অন্য দিকে অন্য দিকে ঝাঁপিয়ে পড়েন তবে আপনি লক্ষ্য করবেন যে প্রথমটি তার আগের ঝাঁকুনি থামায় না আন্দোলন
এটি স্ক্রোলভিউ অঙ্গভঙ্গিগুলি ঝাঁকুনির জন্য কমপ্লেস্ক্রোল () ব্যবহার করে এবং এটি স্ক্রোলটোর সাথে বিরোধে প্রবেশ করে the
এটি রোধ করার জন্য, কেবলমাত্র এইভাবে অনস্ক্রোলচেনাড প্রোগ্রাম করুন:
public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
if(interceptScroll){
interceptScroll=false;
if(scrollView == scrollView1) {
scrollView2.onOverScrolled(x,y,true,true);
} else if(scrollView == scrollView2) {
scrollView1.onOverScrolled(x,y,true,true);
}
interceptScroll=true;
}
}
ইন্টারসেপ্টস্ক্রোল সহ একটি স্ট্যাটিক বুলিয়ান সত্য থেকে আরম্ভ করা হয়েছে। (এটি স্ক্রোলচ্যাঞ্জে থাকা অসীম লুপগুলি এড়াতে সহায়তা করে)
অন ওভারস্ক্রোলড হ'ল একমাত্র ফাংশন যা আমি দেখতে পেলাম যে স্ক্রোলভিউকে ঝাঁকুনি দেওয়া থেকে বিরত রাখতে ব্যবহার করা যেতে পারে (তবে এমন কিছু অন্যান্যও থাকতে পারে যা আমি মিস করেছি!)
এই ফাংশনটি অ্যাক্সেস করার জন্য (যা সুরক্ষিত) আপনার এটিকে আপনার পর্যবেক্ষণযোগ্য স্ক্রোলভিউয়ারে যুক্ত করতে হবে
public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
}
শুধু OnTouchListener
আপনার ক্রিয়াকলাপে কেন প্রয়োগ হয় না । তারপরে অন টাচ পদ্ধতিটি ওভাররাইড করুন, তারপরে প্রথমটির স্ক্রোল পোস্টেশন ScrollViewOne.getScrollY()
এবং আপডেট করুনScrollViewTwo.scrollTo(0, ScrollViewOne.getScrollY());
আর একটি ধারণা ... :)
অ্যান্ড্রয়েড সমর্থন-ভি 4 প্যাকেজে অ্যান্ড্রয়েড নামের একটি নতুন শ্রেণি সরবরাহ করে NestedScrollView
।
আমরা <ScrollView>
নোডটি <android.support.v4.widget.NestedScrollView>
লেআউট এক্সএমএল এর সাথে প্রতিস্থাপন করতে পারি NestedScrollView.OnScrollChangeListener
এবং স্ক্রোলিংটি পরিচালনা করতে জাভাতে এটি প্রয়োগ করি ।
এটি জিনিসগুলিকে সহজ করে তোলে।