android - গ্রিড বিন্যাসে অঙ্গভঙ্গি সনাক্তকরণ fling




listener gesture-recognition (12)

আমি আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশন কাজ অঙ্গভঙ্গি সনাক্তকরণ fling পেতে চান।

আমার কাছে একটি GridLayout রয়েছে যা 9 GridLayout রয়েছে। উৎস এখানে পাওয়া যাবে: রোমেন গাইস এর গ্রিড লেআউট

আমি যে ফাইলটি গ্রহণ করি তা হল রোমেন গাই এর ফটোস্ট্রিম অ্যাপ্লিকেশন থেকে এবং কেবলমাত্র সামান্যই অভিযোজিত হয়েছে।

সহজ ক্লিকের পরিস্থিতির জন্য আমি কেবলমাত্র প্রতিটি onClickListener জন্য onClickListener সেট করতে চাই যা আমি দেখি প্রধান activity যা View.OnClickListener প্রয়োগ View.OnClickListener । এটি একটি fling স্বীকৃতি যে কিছু বাস্তবায়ন অসীম আরও জটিল বলে মনে হয়। আমি এটা অনুমান করতে পারে কারণ এই অনুমান?

  • যদি আমার কার্যকলাপ OnGestureListener প্রয়োগ করে OnGestureListener আমি OnGestureListener Grid জন্য অঙ্গভঙ্গি শ্রোতা বা আমি যুক্ত করা Image দৃশ্য হিসাবে সেট করতে জানি না।

    public class SelectFilterActivity extends Activity implements
       View.OnClickListener, OnGestureListener { ...
  • যদি আমার কার্যকলাপ OnTouchListener প্রয়োগ OnTouchListener তবে আমার onFling করার জন্য কোনও onFling পদ্ধতি নেই (এটি দুটি ইভেন্ট যা প্যারামিটারটি উল্লেখযোগ্য ছিল কিনা তা নির্ধারণ করতে আমাকে মঞ্জুরি দেয়)।

    public class SelectFilterActivity extends Activity implements
        View.OnClickListener, OnTouchListener { ...
  • যদি আমি একটি কাস্টম View , যেমন GestureImageView যে GestureImageView View প্রসারিত করে তবে আমি দেখতে পারছি না যে ভিউ থেকে fling ঘটেছে এমন কার্যকলাপটি কিভাবে বলব। যে কোন ক্ষেত্রে, আমি এটি চেষ্টা করেছিলাম এবং যখন আমি স্ক্রীনটি স্পর্শ করি তখন পদ্ধতিগুলি বলা হয় নি।

আমি সত্যিই এই মতামত জুড়ে কাজ একটি কংক্রিট উদাহরণ প্রয়োজন। কি, কখন এবং কিভাবে আমি এই listener সংযুক্ত করা উচিত? আমি একক ক্লিক সনাক্ত করতে সক্ষম হতে হবে।

// Gesture detection
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        int dx = (int) (e2.getX() - e1.getX());
        // don't accept the fling if it's too short
        // as it may conflict with a button push
        if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.absvelocityY)) {
            if (velocityX > 0) {
                moveRight();
            } else {
                moveLeft();
            }
            return true;
        } else {
            return false;
        }
    }
});

Flings ক্যাপচার আমার পর্দার শীর্ষে একটি স্বচ্ছ দৃশ্য রাখা সম্ভব?

যদি আমি এক্সএমএল থেকে আমার সন্তানের চিত্রের দৃষ্টিভঙ্গি না ImageView তুলতে পছন্দ করি তবে আমি কি ImageView একটি নতুন সাব্ল্যাশে একটি কনস্ট্রাক্টর প্যারামিটার হিসাবে ImageView করতে পারি?

এই সহজ কাজটি আমি ফ্লোটিং সনাক্তকরণের জন্য কাজ করার চেষ্টা করছি: সিলেক্টফিল্টার অ্যাক্টিভিটি (ফটোস্ট্রিম থেকে অ্যাডাপ্টেড)

আমি এই উত্সগুলি দেখছি:

এ পর্যন্ত আমার জন্য কিছুই কাজ করেনি এবং আমি কিছু পয়েন্টার আশা ছিল।


ViewConfiguration ব্যবহার করার জন্য ওয়েবে (এবং এই পৃষ্ঠা) কিছু প্রস্তাব রয়েছে। SWIPE_MIN_DISTANCE এর জন্য একটি ডিভাইস-স্কেল মান আছে পেতে getScaledTouchSlop ()

getScaledTouchSlop() " স্ক্রোলিং থ্রেশহোল্ড" দূরত্বের জন্য নয়, সোয়াইপ নয়। স্ক্রোলিং থ্রেশহোল্ড দূরত্বটি "পৃষ্ঠার মধ্যে সুইং" থ্রেশহোল্ড দূরত্বের চেয়ে ছোট হতে হবে। উদাহরণস্বরূপ, এই ফাংশনটি আমার স্যামসাং GS2 এ 12 পিক্সেল প্রদান করে এবং এই পৃষ্ঠায় উদ্ধৃত উদাহরণ প্রায় 100 পিক্সেল।

API লেভেল 8 (Android 2.2, Froyo) এর সাথে, আপনি getScaledPagingTouchSlop() পেয়েছেন, যা পৃষ্ঠাটির সোয়াইপের উদ্দেশ্যে তৈরি। আমার ডিভাইসে, এটি 24 (পিক্সেল) প্রদান করে। সুতরাং যদি আপনি API লেভেল <8 তে থাকেন তবে আমি মনে করি "2 * getScaledTouchSlop() " "মানক" সোয়াইপ থ্রেশহোল্ড হওয়া উচিত। কিন্তু ছোট পর্দাগুলির সাথে আমার অ্যাপ্লিকেশনের ব্যবহারকারীরা আমাকে বলেছিল যে এটি খুব কম ছিল ... আমার অ্যাপ্লিকেশন অনুসারে, আপনি উল্লম্বভাবে স্ক্রোল করতে এবং অনুভূমিকভাবে পৃষ্ঠা পরিবর্তন করতে পারেন। প্রস্তাবিত মান দিয়ে, তারা কখনও কখনও স্ক্রোল করার পরিবর্তে পৃষ্ঠা পরিবর্তন করে।


আপনি flings, ক্লিক, দীর্ঘ ক্লিক, এবং কাস্টম ইভেন্ট পরিচালনা করতে droidQuery লাইব্রেরি ব্যবহার করতে পারেন। বাস্তবায়ন নীচের আমার পূর্ববর্তী উত্তর উপর নির্মিত হয়, কিন্তু droidQuery একটি slick, সহজ সিনট্যাক্স প্রদান করে:

//global variables    private boolean isSwiping = false;
private SwipeDetector.Direction swipeDirection = null;
private View v;//must be instantiated before next call.

//swipe-handling code
$.with(v).swipe(new Function() {
    @Override
    public void invoke($ droidQuery, Object... params) {
        if (params[0] == SwipeDetector.Direction.START)
            isSwiping = true;
        else if (params[0] == SwipeDetector.Direction.STOP) {
            if (isSwiping) {                    isSwiping = false;
                if (swipeDirection != null) {
                    switch(swipeDirection) {
                        case DOWN :                                //TODO: Down swipe complete, so do something
                            break;
                        case UP :
                            //TODO: Up swipe complete, so do something
                            break;
                        case LEFT :
                            //TODO: Left swipe complete, so do something
                            break;
                        case RIGHT :
                            //TODO: Right swipe complete, so do something
                            break;
                        default :                                break;
                    }
                }                }
        }
        else {
            swipeDirection = (SwipeDetector.Direction) params[0];
        }
    }
});

মূল উত্তর

এই উত্তর এখানে অন্যান্য উত্তর থেকে উপাদান সমন্বয় ব্যবহার করে। এতে SwipeDetector ক্লাস রয়েছে, যা ইভেন্টগুলির জন্য শোনার জন্য একটি অভ্যন্তরীণ ইন্টারফেস রয়েছে। আমি উভয় সোয়াইপ ইভেন্ট এবং অন্যান্য সনাক্ত ইভেন্ট (যেমন ক্লিক বা দীর্ঘ ক্লিক) মঞ্জুরি দেওয়ার জন্য একটি View এর onTouch পদ্ধতি ওভাররাইড কিভাবে দেখানোর জন্য একটি RelativeLayout onTouch

SwipeDetector

package self.philbrown;

import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;

/**
 * Detect Swipes on a per-view basis. Based on original code by Thomas Fankhauser on .com,
 * with adaptations by other authors (see link).
 * @author Phil Brown
 * @see <a href="http://.com/questions/937313/android-basic-gesture-detection">android-basic-gesture-detection</a>
 */
public class SwipeDetector implements View.OnTouchListener
{
    /**
     * The minimum distance a finger must travel in order to register a swipe event.
     */
    private int minSwipeDistance;

    /** Maintains a reference to the first detected down touch event. */
    private float downX, downY;

    /** Maintains a reference to the first detected up touch event. */
    private float upX, upY;

    /** provides access to size and dimension contants */
    private ViewConfiguration config;

    /**
     * provides callbacks to a listener class for various swipe gestures.
     */
    private SwipeListener listener;

    public SwipeDetector(SwipeListener listener)
    {
        this.listener = listener;
    }


    /**
     * {@inheritDoc}
     */
    public boolean onTouch(View v, MotionEvent event)
    {
        if (config == null)
        {
                config = ViewConfiguration.get(v.getContext());
                minSwipeDistance = config.getScaledTouchSlop();
        }

        switch(event.getAction())
        {
        case MotionEvent.ACTION_DOWN:
            downX = event.getX();
            downY = event.getY();
            return true;
        case MotionEvent.ACTION_UP:
            upX = event.getX();
            upY = event.getY();

            float deltaX = downX - upX;
            float deltaY = downY - upY;

            // swipe horizontal?
            if(Math.abs(deltaX) > minSwipeDistance)
            {
                // left or right
                if (deltaX < 0)
                {
                        if (listener != null)
                        {
                                listener.onRightSwipe(v);
                                return true;
                        }
                }
                if (deltaX > 0)
                {
                        if (listener != null)
                        {
                                listener.onLeftSwipe(v);
                                return true;
                        }
                }
            }

            // swipe vertical?
            if(Math.abs(deltaY) > minSwipeDistance)
            {
                // top or down
                if (deltaY < 0)
                {
                        if (listener != null)
                        {
                                listener.onDownSwipe(v);
                                return true;
                        }
                }
                if (deltaY > 0)
                {
                        if (listener != null)
                        {
                                listener.onUpSwipe(v);
                                return true;
                        }
                }
            }
        }
        return false;
    }

    /**
     * Provides callbacks to a registered listener for swipe events in {@link SwipeDetector}
     * @author Phil Brown
     */
    public interface SwipeListener
    {
        /** Callback for registering a new swipe motion from the bottom of the view toward its top. */
        public void onUpSwipe(View v);
        /** Callback for registering a new swipe motion from the left of the view toward its right. */
        public void onRightSwipe(View v);
        /** Callback for registering a new swipe motion from the right of the view toward its left. */
        public void onLeftSwipe(View v);
        /** Callback for registering a new swipe motion from the top of the view toward its bottom. */
        public void onDownSwipe(View v);
    }
}

Swipe Interceptor দেখুন

package self.philbrown;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

import com.npeinc.module_NPECore.model.SwipeDetector;
import com.npeinc.module_NPECore.model.SwipeDetector.SwipeListener;

/**
 * View subclass used for handling all touches (swipes and others)
 * @author Phil Brown
 */
public class SwipeInterceptorView extends RelativeLayout
{
    private SwipeDetector swiper = null;

    public void setSwipeListener(SwipeListener listener)
    {
        if (swiper == null)
            swiper = new SwipeDetector(listener);
    }

    public SwipeInterceptorView(Context context) {
        super(context);
    }

    public SwipeInterceptorView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SwipeInterceptorView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e)
    {
        boolean swipe = false, touch = false;
        if (swiper != null)
            swipe = swiper.onTouch(this, e);
        touch = super.onTouchEvent(e);
        return swipe || touch;
    }
}

আমি সামান্য পরিবর্তন এবং থমাস Fankhauser থেকে সমাধান মেরামত

সম্পূর্ণ সিস্টেম দুটি ফাইল, SwipeInterface এবং কার্যকলাপ SwipeDetector থেকে গঠিত

SwipeInterface.java

import android.view.View;

public interface SwipeInterface {

    public void bottom2top(View v);

    public void left2right(View v);

    public void right2left(View v);

    public void top2bottom(View v);

}

আবিষ্কারক

import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class ActivitySwipeDetector implements View.OnTouchListener {

    static final String logTag = "ActivitySwipeDetector";
    private SwipeInterface activity;
    static final int MIN_DISTANCE = 100;
    private float downX, downY, upX, upY;

    public ActivitySwipeDetector(SwipeInterface activity){
        this.activity = activity;
    }

    public void onRightToLeftSwipe(View v){
        Log.i(logTag, "RightToLeftSwipe!");
        activity.right2left(v);
    }

    public void onLeftToRightSwipe(View v){
        Log.i(logTag, "LeftToRightSwipe!");
        activity.left2right(v);
    }

    public void onTopToBottomSwipe(View v){
        Log.i(logTag, "onTopToBottomSwipe!");
        activity.top2bottom(v);
    }

    public void onBottomToTopSwipe(View v){
        Log.i(logTag, "onBottomToTopSwipe!");
        activity.bottom2top(v);
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()){
        case MotionEvent.ACTION_DOWN: {
            downX = event.getX();
            downY = event.getY();
            return true;
        }
        case MotionEvent.ACTION_UP: {
            upX = event.getX();
            upY = event.getY();

            float deltaX = downX - upX;
            float deltaY = downY - upY;

            // swipe horizontal?
            if(Math.abs(deltaX) > MIN_DISTANCE){
                // left or right
                if(deltaX < 0) { this.onLeftToRightSwipe(v); return true; }
                if(deltaX > 0) { this.onRightToLeftSwipe(v); return true; }
            }
            else {
                Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
            }

            // swipe vertical?
            if(Math.abs(deltaY) > MIN_DISTANCE){
                // top or down
                if(deltaY < 0) { this.onTopToBottomSwipe(v); return true; }
                if(deltaY > 0) { this.onBottomToTopSwipe(v); return true; }
            }
            else {
                Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
                v.performClick();
            }
        }
        }
        return false;
    }

}

এটা এই মত ব্যবহার করা হয়:

ActivitySwipeDetector swipe = new ActivitySwipeDetector(this);
LinearLayout swipe_layout = (LinearLayout) findViewById(R.id.swipe_layout);
swipe_layout.setOnTouchListener(swipe);

এবং Activity বাস্তবায়নের জন্য আপনাকে SwipeInterface থেকে পদ্ধতিগুলি বাস্তবায়ন করতে হবে এবং আপনি এটি দেখতে পাবেন যে সোয়াইপ ইভেন্টটি দেখুন।

@Override
public void left2right(View v) {
    switch(v.getId()){
        case R.id.swipe_layout:
            // do your stuff here
        break;
    }       
}

উপরে সোয়াইপ অঙ্গভঙ্গি আবিষ্কারক কোড খুব দরকারী! তবে আপনি পরম (REL_SWIPE) পরিবর্তে নিম্নোক্ত আপেক্ষিক মানগুলি (REL_SWIPE) ব্যবহার করে এই সমাধান ঘনত্বের অজ্ঞাতসারে তৈরি করতে চান।

DisplayMetrics dm = getResources().getDisplayMetrics();

int REL_SWIPE_MIN_DISTANCE = (int)(SWIPE_MIN_DISTANCE * dm.densityDpi / 160.0f);
int REL_SWIPE_MAX_OFF_PATH = (int)(SWIPE_MAX_OFF_PATH * dm.densityDpi / 160.0f);
int REL_SWIPE_THRESHOLD_VELOCITY = (int)(SWIPE_THRESHOLD_VELOCITY * dm.densityDpi / 160.0f);

এই প্রশ্নটি পুরানো এবং জুলাই ২011-এ গুগল সামঞ্জস্য প্যাকেজ, রিভিশন 3 প্রকাশ করেছে ) যার মধ্যে রয়েছে ViewPager যা অ্যান্ড্রয়েড 1.6 এর উপরে কাজ করে। এই প্রশ্নের জন্য পোস্ট করা GestureListener উত্তর Android এ খুব মার্জিত মনে হয় না। যদি আপনি অ্যান্ড্রয়েড গ্যালারীতে ফটোগুলির মধ্যে স্যুইচিংয়ের জন্য ব্যবহৃত বা নতুন Play মার্কেট অ্যাপ্লিকেশনে ভিউ স্যুইচ করার জন্য কোডটি সন্ধান করেন তবে এটি স্পষ্টভাবে ViewPager

আরও তথ্যের জন্য এখানে কিছু লিঙ্ক রয়েছে:


একটি অন্তর্নির্মিত ইন্টারফেস রয়েছে যা আপনি সমস্ত অঙ্গভঙ্গির জন্য সরাসরি ব্যবহার করতে পারেন:
এখানে একটি মৌলিক স্তরের ব্যবহারকারীর জন্য একটি ব্যাখ্যা রয়েছে: দুটি আমদানি দ্বিধান্বিত নির্বাচন করে সাবধান হতে হবে


এছাড়াও একটি ছোটখাট বৃদ্ধি হিসাবে।

Try / catch block এর প্রধান কারণ হল প্রাথমিক আন্দোলনের জন্য E1 অস্পষ্ট হতে পারে। চেষ্টা / ধরা ছাড়াও, নল এবং ফিরতি জন্য একটি পরীক্ষা অন্তর্ভুক্ত করুন। নিম্নলিখিত অনুরূপ

if (e1 == null || e2 == null) return false;
try {
...
} catch (Exception e) {}
return false;

কেউ যদি কাজ সম্পাদন চায় তবে শীর্ষে দুটি উত্তরগুলির একটি মিলিত উত্তর।

package com.yourapplication;

import android.content.Context;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;

public abstract class OnSwipeListener implements View.OnTouchListener {

    private final GestureDetector gestureDetector;

    public OnSwipeListener(Context context){
        gestureDetector = new GestureDetector(context, new OnSwipeGestureListener(context));
        gestureDetector.setIsLongpressEnabled(false);
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    private final class OnSwipeGestureListener extends GestureDetector.SimpleOnGestureListener {

        private final int minSwipeDelta;
        private final int minSwipeVelocity;
        private final int maxSwipeVelocity;

        private OnSwipeGestureListener(Context context) {
            ViewConfiguration configuration = ViewConfiguration.get(context);
            // We think a swipe scrolls a full page.
            //minSwipeDelta = configuration.getScaledTouchSlop();
            minSwipeDelta = configuration.getScaledPagingTouchSlop();
            minSwipeVelocity = configuration.getScaledMinimumFlingVelocity();
            maxSwipeVelocity = configuration.getScaledMaximumFlingVelocity();
        }

        @Override
        public boolean onDown(MotionEvent event) {
            // Return true because we want system to report subsequent events to us.
            return true;
        }

        // NOTE: see http://.com/questions/937313/android-basic-gesture-detection
        @Override
        public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX,
                               float velocityY) {

            boolean result = false;
            try {
                float deltaX = event2.getX() - event1.getX();
                float deltaY = event2.getY() - event1.getY();
                float absVelocityX = Math.abs(velocityX);
                float absVelocityY = Math.abs(velocityY);
                float absDeltaX = Math.abs(deltaX);
                float absDeltaY = Math.abs(deltaY);
                if (absDeltaX > absDeltaY) {
                    if (absDeltaX > minSwipeDelta && absVelocityX > minSwipeVelocity
                            && absVelocityX < maxSwipeVelocity) {
                        if (deltaX < 0) {
                            onSwipeLeft();
                        } else {
                            onSwipeRight();
                        }
                    }
                    result = true;
                } else if (absDeltaY > minSwipeDelta && absVelocityY > minSwipeVelocity
                        && absVelocityY < maxSwipeVelocity) {
                    if (deltaY < 0) {
                        onSwipeTop();
                    } else {
                        onSwipeBottom();
                    }
                }
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    }

    public void onSwipeLeft() {}

    public void onSwipeRight() {}

    public void onSwipeTop() {}

    public void onSwipeBottom() {}
}

থমাস ফ্যানহাউসার এবং মারে সেবারার প্রস্তাবিত সমাধানটির আমার সংস্করণ (উল্লম্ব swipes পরিচালনা করে না):

SwipeInterface.java

import android.view.View;

public interface SwipeInterface {

    public void onLeftToRight(View v);

    public void onRightToLeft(View v);
}

ActivitySwipeDetector.java

import android.content.Context;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;

public class ActivitySwipeDetector implements View.OnTouchListener {

    static final String logTag = "ActivitySwipeDetector";
    private SwipeInterface activity;
    private float downX, downY;
    private long timeDown;
    private final float MIN_DISTANCE;
    private final int VELOCITY;
    private final float MAX_OFF_PATH;

    public ActivitySwipeDetector(Context context, SwipeInterface activity){
        this.activity = activity;
        final ViewConfiguration vc = ViewConfiguration.get(context);
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        MIN_DISTANCE = vc.getScaledPagingTouchSlop() * dm.density;
        VELOCITY = vc.getScaledMinimumFlingVelocity();
        MAX_OFF_PATH = MIN_DISTANCE * 2;            
    }

    public void onRightToLeftSwipe(View v){
        Log.i(logTag, "RightToLeftSwipe!");
        activity.onRightToLeft(v);
    }

    public void onLeftToRightSwipe(View v){
        Log.i(logTag, "LeftToRightSwipe!");
        activity.onLeftToRight(v);
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()){
        case MotionEvent.ACTION_DOWN: {
            Log.d("onTouch", "ACTION_DOWN");
            timeDown = System.currentTimeMillis();
            downX = event.getX();
            downY = event.getY();
            return true;
        }
        case MotionEvent.ACTION_UP: {
            Log.d("onTouch", "ACTION_UP");
            long timeUp = System.currentTimeMillis();
            float upX = event.getX();
            float upY = event.getY();

            float deltaX = downX - upX;
            float absDeltaX = Math.abs(deltaX); 
            float deltaY = downY - upY;
            float absDeltaY = Math.abs(deltaY);

            long time = timeUp - timeDown;

            if (absDeltaY > MAX_OFF_PATH) {
                Log.i(logTag, String.format("absDeltaY=%.2f, MAX_OFF_PATH=%.2f", absDeltaY, MAX_OFF_PATH));
                return v.performClick();
            }

            final long M_SEC = 1000;
            if (absDeltaX > MIN_DISTANCE && absDeltaX > time * VELOCITY / M_SEC) {
                if(deltaX < 0) { this.onLeftToRightSwipe(v); return true; }
                if(deltaX > 0) { this.onRightToLeftSwipe(v); return true; }
            } else {
                Log.i(logTag, String.format("absDeltaX=%.2f, MIN_DISTANCE=%.2f, absDeltaX > MIN_DISTANCE=%b", absDeltaX, MIN_DISTANCE, (absDeltaX > MIN_DISTANCE)));
                Log.i(logTag, String.format("absDeltaX=%.2f, time=%d, VELOCITY=%d, time*VELOCITY/M_SEC=%d, absDeltaX > time * VELOCITY / M_SEC=%b", absDeltaX, time, VELOCITY, time * VELOCITY / M_SEC, (absDeltaX > time * VELOCITY / M_SEC)));
            }

        }
        }
        return false;
    }

}

অঙ্গভঙ্গি স্পর্শ পর্দা এবং ব্যবহারকারীর মধ্যে মিথস্ক্রিয়া ট্রিগার করতে যারা সূক্ষ্ম গতি। শেষ আঙুলটি পৃষ্ঠ ছেড়ে গেলে পর্দায় প্রথম স্পর্শের সময় এটি স্থায়ী হয়।

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

আমাদের কার্যকলাপ ক্লাসকে অঙ্গভঙ্গি ডেটেক্টর.অনডাবল ট্যাপলিস্টার (ডাবল ট্যাপ অঙ্গভঙ্গি সনাক্তকরণের জন্য) এবং অঙ্গভঙ্গি আবিষ্কারক.অনজেসারলিস্টার ইন্টারফেসগুলি বাস্তবায়ন করুন এবং সমস্ত বিমূর্ত পদ্ধতি বাস্তবায়ন করুন। আরও তথ্যের জন্য। আপনি https://developer.android.com/training/gestures/detector.htmlCourtesy

ডেমো পরীক্ষার জন্য। GestureDetectorDemo


আমি আরো জেনেরিক ক্লাস নedd করেছিলাম, আমি টমাসের ক্লাসটি নিয়েছি এবং একটি ইন্টারফেস যোগ করেছি যা আপনার ক্রিয়াকলাপ বা ফ্যাগমেন্টে ইভেন্ট প্রেরণ করে। এটি কনস্ট্রাক্টারের শ্রোতাকে নিবন্ধন করবে তাই নিশ্চিত করুন যে আপনি ইন্টারফেসটি বাস্তবায়ন করছেন অথবা ClassCastException টিরন করা হবে। ইন্টারফেস ক্লাসে সংজ্ঞায়িত চার চূড়ান্ত int মধ্যে একটি ফেরত দেয় এবং এটি সক্রিয় করা হয়েছে, যা ভিউ ফিরে আসবে।

import android.app.Activity;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class SwipeDetector implements View.OnTouchListener{

    static final int MIN_DISTANCE = 100;
    private float downX, downY, upX, upY;
    public final static int RIGHT_TO_LEFT=1;
    public final static int LEFT_TO_RIGHT=2;
    public final static int TOP_TO_BOTTOM=3;
    public final static int BOTTOM_TO_TOP=4;
    private View v;

    private onSwipeEvent swipeEventListener;


    public SwipeDetector(Activity activity,View v){
        try{
            swipeEventListener=(onSwipeEvent)activity;
        }
        catch(ClassCastException e)
        {
            Log.e("ClassCastException",activity.toString()+" must implement SwipeDetector.onSwipeEvent");
        } 
        this.v=v;
    }
    public SwipeDetector(Fragment fragment,View v){
        try{
            swipeEventListener=(onSwipeEvent)fragment;
        }
        catch(ClassCastException e)
        {
            Log.e("ClassCastException",fragment.toString()+" must implement SwipeDetector.onSwipeEvent");
        } 
        this.v=v;
    }


    public void onRightToLeftSwipe(){   
        swipeEventListener.SwipeEventDetected(v,RIGHT_TO_LEFT);
    }

    public void onLeftToRightSwipe(){   
        swipeEventListener.SwipeEventDetected(v,LEFT_TO_RIGHT);
    }

    public void onTopToBottomSwipe(){   
        swipeEventListener.SwipeEventDetected(v,TOP_TO_BOTTOM);
    }

    public void onBottomToTopSwipe(){
        swipeEventListener.SwipeEventDetected(v,BOTTOM_TO_TOP);
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()){
        case MotionEvent.ACTION_DOWN: {
            downX = event.getX();
            downY = event.getY();
            return true;
        }
        case MotionEvent.ACTION_UP: {
            upX = event.getX();
            upY = event.getY();

            float deltaX = downX - upX;
            float deltaY = downY - upY;

            //HORIZONTAL SCROLL
            if(Math.abs(deltaX) > Math.abs(deltaY))
            {
                if(Math.abs(deltaX) > MIN_DISTANCE){
                    // left or right
                    if(deltaX < 0) 
                    {
                        this.onLeftToRightSwipe();
                        return true;
                    }
                    if(deltaX > 0) {
                        this.onRightToLeftSwipe();
                        return true; 
                    }
                }
                else {
                    //not long enough swipe...
                    return false; 
                }
            }
            //VERTICAL SCROLL
            else 
            {
                if(Math.abs(deltaY) > MIN_DISTANCE){
                    // top or down
                    if(deltaY < 0) 
                    { this.onTopToBottomSwipe();
                    return true; 
                    }
                    if(deltaY > 0)
                    { this.onBottomToTopSwipe(); 
                    return true;
                    }
                }
                else {
                    //not long enough swipe...
                    return false;
                }
            }

            return true;
        }
        }
        return false;
    }
    public interface onSwipeEvent
    {
        public void SwipeEventDetected(View v , int SwipeType);
    }

}

আমি উত্তর দেওয়ার জন্য খুব দেরিতে জানি কিন্তু এখনও আমি ListView এর জন্য সোয়াইপ ডিটেকশন পোস্ট করছি, ListView আইটেমটিতে সোয়াইপ টাচ শোনার ব্যবহার করতে হবে ।

রেফারেন্স: Exterminator13 (এই পৃষ্ঠায় উত্তরের একটি)

একটি ActivitySwipeDetector.class করুন

package com.example.wocketapp;

import android.content.Context;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;

public class ActivitySwipeDetector implements View.OnTouchListener 
{
    static final String logTag = "SwipeDetector";
    private SwipeInterface activity;
    private float downX, downY;
    private long timeDown;
    private final float MIN_DISTANCE;
    private final int VELOCITY;
    private final float MAX_OFF_PATH;

    public ActivitySwipeDetector(Context context, SwipeInterface activity)
    {
        this.activity = activity;
        final ViewConfiguration vc = ViewConfiguration.get(context);
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        MIN_DISTANCE = vc.getScaledPagingTouchSlop() * dm.density;
        VELOCITY = vc.getScaledMinimumFlingVelocity();
        MAX_OFF_PATH = MIN_DISTANCE * 2;
    }

    public void onRightToLeftSwipe(View v) 
    {
        Log.i(logTag, "RightToLeftSwipe!");
        activity.onRightToLeft(v);
    }

    public void onLeftToRightSwipe(View v) 
    {
        Log.i(logTag, "LeftToRightSwipe!");
        activity.onLeftToRight(v);
    }

    public boolean onTouch(View v, MotionEvent event) 
    {
        switch (event.getAction()) 
        {
            case MotionEvent.ACTION_DOWN:
            {
                Log.d("onTouch", "ACTION_DOWN");
                timeDown = System.currentTimeMillis();
                downX = event.getX();
                downY = event.getY();
                v.getParent().requestDisallowInterceptTouchEvent(false);
                return true;
            }

        case MotionEvent.ACTION_MOVE:
            {
                float y_up = event.getY();
                float deltaY = y_up - downY;
                float absDeltaYMove = Math.abs(deltaY);

                if (absDeltaYMove > 60) 
                {
                    v.getParent().requestDisallowInterceptTouchEvent(false);
                } 
                else
                {
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                }
            }

            break;

            case MotionEvent.ACTION_UP: 
            {
                Log.d("onTouch", "ACTION_UP");
                long timeUp = System.currentTimeMillis();
                float upX = event.getX();
                float upY = event.getY();

                float deltaX = downX - upX;
                float absDeltaX = Math.abs(deltaX);
                float deltaY = downY - upY;
                float absDeltaY = Math.abs(deltaY);

                long time = timeUp - timeDown;

                if (absDeltaY > MAX_OFF_PATH) 
                {
                    Log.e(logTag, String.format(
                            "absDeltaY=%.2f, MAX_OFF_PATH=%.2f", absDeltaY,
                            MAX_OFF_PATH));
                    return v.performClick();
                }

                final long M_SEC = 1000;
                if (absDeltaX > MIN_DISTANCE && absDeltaX > time * VELOCITY / M_SEC) 
                {
                     v.getParent().requestDisallowInterceptTouchEvent(true);
                    if (deltaX < 0) 
                    {
                        this.onLeftToRightSwipe(v);
                        return true;
                    }
                    if (deltaX > 0) 
                    {
                        this.onRightToLeftSwipe(v);
                        return true;
                    }
                }
                else 
                {
                    Log.i(logTag,
                            String.format(
                                    "absDeltaX=%.2f, MIN_DISTANCE=%.2f, absDeltaX > MIN_DISTANCE=%b",
                                    absDeltaX, MIN_DISTANCE,
                                    (absDeltaX > MIN_DISTANCE)));
                    Log.i(logTag,
                            String.format(
                                    "absDeltaX=%.2f, time=%d, VELOCITY=%d, time*VELOCITY/M_SEC=%d, absDeltaX > time * VELOCITY / M_SEC=%b",
                                    absDeltaX, time, VELOCITY, time * VELOCITY
                                            / M_SEC, (absDeltaX > time * VELOCITY
                                            / M_SEC)));
                }

                 v.getParent().requestDisallowInterceptTouchEvent(false);

            }
        }
        return false;
    }
    public interface SwipeInterface 
    {

        public void onLeftToRight(View v);

        public void onRightToLeft(View v);
    }

}

এটির মতো আপনার কার্যকলাপের ক্লাস থেকে এটি কল করুন:

yourLayout.setOnTouchListener(new ActivitySwipeDetector(this, your_activity.this));

এবং SwipeInterface বাস্তবায়ন করতে ভুলবেন না যা আপনাকে দুটি @override পদ্ধতি দেবে:

    @Override
    public void onLeftToRight(View v) 
    {
        Log.e("TAG", "L to R");
    }

    @Override
    public void onRightToLeft(View v) 
    {
        Log.e("TAG", "R to L");
    }




gesture-recognition