স্ক্রোলভিউ স্ক্রোল অবস্থানগুলি সিঙ্ক্রোনাইজ করুন - অ্যান্ড্রয়েড


96

আমার অ্যান্ড্রয়েড বিন্যাসে আমার কাছে 2 স্ক্রোলভিউ রয়েছে। আমি কীভাবে তাদের স্ক্রোল অবস্থানগুলি সিঙ্ক্রোনাইজ করতে পারি?

উত্তর:


290

স্ক্রোলভিউতে একটি পদ্ধতি রয়েছে ...

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

}

স্ক্রোলটো () কোডটি আমাদের জন্য যে কোনও লুপ অবস্থার যত্ন নেয়, তাই আমাদের এটি নিয়ে চিন্তা করার দরকার নেই। একমাত্র সতর্কতা হ'ল এই সমাধানটি অ্যান্ড্রয়েডের ভবিষ্যতের সংস্করণগুলিতে কাজ করার গ্যারান্টিযুক্ত নয়, কারণ আমরা একটি সুরক্ষিত পদ্ধতি উপস্থাপন করছি।


হাই অ্যান্ডি এই উত্তরটি তুলে ধরতে সময় দেওয়ার জন্য ধন্যবাদ - আমাকে এগিয়ে নিয়ে গেছে। আবার ধন্যবাদ. টিম
টিম

-আর আমি কোডটিও ব্যবহার করছি তবে এটি আমাকে নাল পয়েন্টার
এক্সপেকশন

@hemant আপনি দয়া করে কোন লাইনে নালপয়েন্টার নিক্ষেপ করা হয়েছে এবং আপনি কোন অ্যান্ড্রয়েড সংস্করণে কাজ করছেন তা চিহ্নিত করতে পারেন?
সুলাই

দিনের নায়ক: আমার জীবন বাঁচাল! = ডি
পেদ্রো

হাই অ্যান্ডি, কোডটির জন্য ধন্যবাদ। এটি দুর্দান্ত কাজ করে I আমি একটি জিনিস জানতে চাই [যদি আপনার বা কোনও 1 এর উত্তর থাকে তবে)। এটিতে] - যখন আমি আমার স্ক্রোলভিউটি ঝাপটায়, স্ক্রোলভিউ চলার সময় অনস্ক্রোলজ পদ্ধতিটি সমস্ত এক্স এবং ওয়াই সমন্বয়কে নিবন্ধভুক্ত করে না। এটি কেবল আমাকে সূচনা এবং শেষ অবস্থান দেয়। প্রাক্তন হিসাবে বলুন- আমি Y = 10 থেকে ঝাঁকুনি শুরু করি এবং Y = 30 এ ছেড়ে চলেছি এবং তারপরে বেগটি বেগটি Y = 50 এ নিয়ে যায় এবং তারপরে বন্ধ হয়ে যায়। সুতরাং অনস্ক্রোল কেবলমাত্র 10, 11, 12..30 এবং তারপরে 49, 50 নিবন্ধন করুন। আমি কীভাবে এটি সমস্ত মধ্যবর্তী অবস্থানগুলিতে নিবন্ধন করতে পারি এবং 10 থেকে 50 এর মধ্যে সমস্ত স্থানাঙ্ক পেতে পারি ??
আলকেমিস্ট

12

অ্যান্ডির সমাধানের উন্নতি: তার কোডে তিনি স্ক্রোলটো ব্যবহার করেন, সমস্যাটি হল, আপনি যদি একটি স্ক্রোলভিউ এক দিকে চালিয়ে যান এবং অন্য দিকে অন্য দিকে ঝাঁপিয়ে পড়েন তবে আপনি লক্ষ্য করবেন যে প্রথমটি তার আগের ঝাঁকুনি থামায় না আন্দোলন

এটি স্ক্রোলভিউ অঙ্গভঙ্গিগুলি ঝাঁকুনির জন্য কমপ্লেস্ক্রোল () ব্যবহার করে এবং এটি স্ক্রোলটোর সাথে বিরোধে প্রবেশ করে 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);
}

4
কি সুন্দর ধর, ছেলে!
ফ্রান্সিসকোউউজা

5

শুধু OnTouchListenerআপনার ক্রিয়াকলাপে কেন প্রয়োগ হয় না । তারপরে অন টাচ পদ্ধতিটি ওভাররাইড করুন, তারপরে প্রথমটির স্ক্রোল পোস্টেশন ScrollViewOne.getScrollY()এবং আপডেট করুনScrollViewTwo.scrollTo(0, ScrollViewOne.getScrollY());

আর একটি ধারণা ... :)


7
এটি কাজ করতে পারে তবে আপনি যখন স্পর্শ করেন এবং যাওয়ার সময় স্ক্রোল ভিউ কিছুটা স্ক্রোল করতে পারে যা যাওয়ার পরে আপনি যা ক্যাপচার করেন না।
ধনী

জাভাতে আমি এই ক্ষেত্রে কীভাবে স্ক্রোলভিউ স্ক্রোলভিউঅনলিকে পুনরায় উল্লেখ / রেফারেন্স পেতে পারি?
বনি খরগোশ

এছাড়া (উদাহরণস্বরূপ onTrackballEvent ()) স্ক্রল করার অন্যান্য উপায় আছে
surfealokesea

এটি একটি খুব ভাল ধারণা তবে স্ক্রোল ওয়াই অবস্থানটি পাওয়ার ও সেট করার পরিবর্তে স্পর্শ ইভেন্টটিকে দ্বিতীয় স্ক্রোলভিউতে প্রেরণ করা আরও সহজ। এটি "ঝাঁকুনি" দ্বিতীয় স্ক্রোলভিউতেও যেতে থাকবে। মোশনইভেন্ট newEvent = মোশনইভেন্ট.ওব্যাটেন (ইভেন্ট); ডকুমেন্টসস্ক্রোলভিউ.ডিস্প্যাচ টাচইভেন্ট (নিউইভেন্ট);
এডওয়ার্ড মোসিনকফ

3

অ্যান্ড্রয়েড সমর্থন-ভি 4 প্যাকেজে অ্যান্ড্রয়েড নামের একটি নতুন শ্রেণি সরবরাহ করে NestedScrollView

আমরা <ScrollView>নোডটি <android.support.v4.widget.NestedScrollView>লেআউট এক্সএমএল এর সাথে প্রতিস্থাপন করতে পারি NestedScrollView.OnScrollChangeListenerএবং স্ক্রোলিংটি পরিচালনা করতে জাভাতে এটি প্রয়োগ করি ।

এটি জিনিসগুলিকে সহজ করে তোলে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.