বাংলায় অ্যান্ড্রয়েড সহায়িকা - Bangla Android Guide

ফিজিক্যালি প্লজিবল (বিশ্বাসযোগ্য) মোশন তৈরী করা

টাচ স্ক্রিন নিয়ন্ত্রন করার জন্য গেশচার একটি শক্তিশালী উপায়, কিন্তু তারা কাউন্টারইনটুইটিভ (বিরূদ্ধ সজ্ঞামূলক) হতে পারে এবং মনে রাখা কঠিন হতে পারে যতক্ষন না তার ফিজিক্যালি প্লজিবল (বিশ্বাসযোগ্য) রেজাল্ট উৎপন্ন করছে। এটার একটি ভালো উদাহরণ হচ্ছে ফ্লিং গেশচার, যেখানে ইউজার দ্রুত স্ক্রিনে একটি আঙুল চালাতে পারে এবং তাদের উপরে তুলতে পারে। এই গেশচারের একিিট মানে থাকে যদি ইউজার ফ্লিংয়ের নির্দেশ মোতাবেক দ্রুতার সাথে ম্যুভ করার মাধ্যমে রেসপন্স করে, এরপর গতি কমায়, যেন ইউজার একটি একটি ফ্লাইহুইলে ধাক্কা দিচ্ছে এবং এটাকে ঘুরাচ্ছে।

কিন্তু ফ্লাইহুইলের ধারনাটি গতানুগতিক। একটি ফ্লাইহুইল মডেল কে সঠিকভাবে কাজ করাতে অনেক ধরনের ফিজিক্স এবং ম্যাথের প্রযোজন হবে। সৌভাগ্যবশত অ্যান্ড্রয়েড এটাকে এবং অন্য আচরণ তৈরী করতে হেল্পার ক্লাস প্রদান করে থাকে। Scroller ক্লাস হচ্ছে ফ্লাইহুইল-স্টাইল ফ্লিং গেশচার ব্যবস্থাপনের ভিত্তি।

একটি ফ্লিং শুরু করতে, শুরুর ভেলোসিটি (গতিবেগ) এবং ফ্লিংয়ের ন্যুনতম ও সর্বোচ্চ্ x এবং y ভ্যালু সহকারে fling()কল করুন। ভেলোসিটি (গতিবেগ) ভ্যালুর জন্য, আপনি GestureDetector দ্বারা গণনা করা ভ্যালু ব্যবহার করতে পারেন।

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
   mScroller.fling(currentX, currentY, velocityX / SCALE, velocityY / SCALE, minX, minY, maxX, maxY);
   postInvalidate();
}

নোট: যদিও GestureDetector দ্বারা গণনা করা ভেলোসিটি (গতিবেগ) ফিজিক্যালি সঠিক, অনেক ডেভেলপার অনুভব করেন যে এই ভ্যালু ব্যবহার করে ফ্লিং অ্যানিমেশন তৈরলে সেটা অনেক দ্রুত হয়। x এবং y ভেলোসিটি (গতিবেগ) কে ৪ এবং ৮ এর একটি ফ্যাক্টরে ভাগ করাটা একটি কমন বিষয়।

fling()এ করা কলটি ফ্লিং গেশচারের জন্য ফিজিক্যাল মডেল সেটআপ করে। পরবর্তী কালে, নিয়মিত বিরতিতে Scroller.computeScrollOffset() কল করার মাধ্যমে আপনার scroller আপডেট করা প্রয়োজন। বর্তমান সময় পাঠ করা মাধ্যমে এবং এই সময়ে x এবং y এর পজিশন গণনা করতে পিজিক্যাল মডেল ব্যবহার করার মাধ্যমে computeScrollOffset() টি Scroller অবজেক্টের ইন্টারনাল স্টেট আপডেট করে।

অধিকাংশ ভিউ সরাসরি scrollTo()এ অবজেক্টের x এবং y এর পজিশন পাস করে। পাইচার্টের উদাহরন একটি ভিন্ন: এটা চার্টের যৌক্তিক এঙ্গেল সেট করতে বর্তমান স্ক্রল y পজিশন ব্যবহার করে।

if (!mScroller.isFinished()) {
    mScroller.computeScrollOffset();
    setPieRotation(mScroller.getCurrY());
}

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

  • fling()কল করার পর postInvalidate()কল করুন, একটি রিড্র বাধ্য করার জন্য। এই কৌশল চায যে আপনি onDraw() এ স্ক্রল অফসেট গণনা করুন এবং যখনই স্ক্রল অফসেট পরিবর্তন হবে তার প্রতিটা সময়ই postInvalidate()কল করুন ।

  • ফ্লিংয়ের সময়কাল জন্য অ্যানিমেট করতে একটি ValueAnimator সেটআপ করুন, এবং addUpdateListener()কল করার মাধ্যমে অ্যানিমেশন আপডেট প্রসেস করতে একটি রিসেনার যোগ করুন।

পাইচার্ট নমুনা দ্বিতীয় পদ্ধতিটি গ্রহন করেছে। এই কৌশল সেটআপ করার জন্য একটি বেশি কঠিন, কিন্তু এটা অ্যানিমেশন সিস্টেমের খুব কাছাকাছি থেকে কাজ করে এবং সম্ভাব্য অপ্রোজনীয় ভিউ ইনভ্যালিডেশন দাবী করে না। ValueAnimator ঐ ড্রব্যাক API লেভেল ১১ এর পূর্বে পাওয়া যায় না, তাই এই কৌশল ৩.০ এর নিচের সংস্করনে রান করা ডিভাইসে কাজ করা যাবে না ।

নোট: ValueAnimator API লেভেল ১১ এর পূর্বের সংস্করনে পাওয়া যায় না, কিন্তু আপনি এটা এখনও অ্যাপলিবেশনে ব্যবহার করতে পারেন যা নিচের API লেভেলকে টার্গেট করেছে। আপনাকে শুধু নিশ্চিত করতে হবে যে রান টাইমে বর্তমান অচও লেভেল চেক করা, এবং যদি এই লেভেল ১১ এর নীচে হয় তাহলে ভিউ অ্যানিমেশন সিস্টেমে কল করা বাদ দিন।

   mScroller = new Scroller(getContext(), null, true);
   mScrollAnimator = ValueAnimator.ofFloat(0,1);
   mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
       @Override
       public void onAnimationUpdate(ValueAnimator valueAnimator) {
           if (!mScroller.isFinished()) {
               mScroller.computeScrollOffset();
               setPieRotation(mScroller.getCurrY());
           } else {
               mScrollAnimator.cancel();
               onScrollFinished();
           }
       }
   });