সঠিক মাল্টি টাচ আইডি ফিরিয়ে দিচ্ছে


9

আমি টিউটোরিয়ালগুলি পড়তে এবং এখান থেকে এবং স্ট্যাকওভারফ্লো সম্পর্কিত মাল্টি টাচ সম্পর্কিত প্রতিটি প্রশ্নের সন্ধানে অগণিত ঘন্টা ব্যয় করেছি। তবে সঠিকভাবে এটি কীভাবে করা যায় আমি ঠিক তা বুঝতে পারি না। আমি পেতে একটি লুপ ব্যবহার করি pointerId, আমি প্রচুর লোক এটি করতে দেখি না তবে এটি কেবল এটির কাজ করার জন্য এটিই একমাত্র উপায়।

আমার স্ক্রিনে আমার কাছে দুটি জয়স্টিক রয়েছে, একটি মুভিং স্পোয়েট ঘোরানো এবং মনস্টার শ্যুটারের মতো তিনি যে কোণটি অঙ্কুরিত করেছেন তা নিয়ন্ত্রণ করার জন্য একটি। এই দুটি কাজ ঠিক আছে।

আমার সমস্যা আমি যখন তোমার দর্শন লগ করা শুটিং একই সময়ে আমার পরী সরান, আমার যে touchingPointআমার আন্দোলনের জন্য সেট করা হয় touchingPointআমার শুটিং, যেহেতু xএবং yউপর বেশি touchingPoint(আমার শুটিং moving-stickপর্দার বাম দিকে, shooting-stickডান দিকে) , আমার স্প্রাইট গতি বাড়ায়, এটি আমার স্প্রাইটের গতিতে একটি অযাচিত পরিবর্তন তৈরি করে।

এইভাবে আমি আপনার সহায়তায় এটি সমাধান করেছি! এটি এমন যে কারও জন্য যা একই সমস্যা হতে পারে:

    public void update(MotionEvent event) {
    if (event == null && lastEvent == null) {
        return;
    } else if (event == null && lastEvent != null) {
        event = lastEvent;
    } else {
        lastEvent = event;
    }   

        int action = event.getAction();
        int actionCode = action & MotionEvent.ACTION_MASK;
        int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
        int x = (int) event.getX(pid);
        int y = (int) event.getY(pid); 
        int index = event.getActionIndex();
        int id = event.getPointerId(index);
        String actionString = null;


        switch (actionCode)
        {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_POINTER_DOWN:

                actionString = "DOWN";
                try{
                    if(x > 0 && x < steeringxMesh + (joystick.get_joystickBg().getWidth() * 2)
                            && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
                            movingPoint.x = x;
                            movingPoint.y = y;
                            dragging = true;
                            draggingId = id;

                        }
                    else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                            && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
                            shootingPoint.x = x;
                            shootingPoint.y = y;
                            shooting=true;
                            shootingId=id;
                        }
                    }catch(Exception e){

                    }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_OUTSIDE:            
                if(id == draggingId)
                    dragging = false;
                if(id ==  shootingId)
                    shooting = false;
                actionString = "UP";
                break;  
            case MotionEvent.ACTION_MOVE:           
                for(index=0; index<event.getPointerCount(); index++) {
                    id=event.getPointerId(index);
                    int xx = (int) event.getX(index); //pro naming of variable
                    int yy = (int) event.getY(index); 
                    if(dragging && id == draggingId) {
                        if(xx > 0 && xx < (steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
                            && yy > yMesh - (joystick.get_joystickBg().getHeight()) && yy < panel.getHeight()) {
                            movingPoint.x = xx;
                            movingPoint.y = yy;
                        }
                        else
                            dragging = false;
                        }
                    if(shooting && id == shootingId){
                        if(xx > shootingxMesh - (joystick.get_joystickBg().getWidth()) && xx < panel.getWidth()
                            && yy > yMesh - (joystick.get_joystickBg().getHeight()) && yy < panel.getHeight()) {
                            shootingPoint.x = xx;
                            shootingPoint.y = yy;                            
                        }
                        else
                            shooting = false;
                        }
                    }

                    actionString = "MOVE";
                    break;

        }
    Log.d(TAG, "actionsString: " + actionString + ", pid: " + pid + ", x: " + x + ", y: " + y);

আমি কী ভুল করছি তার নিখুঁত ক্ষতি না করতে চাইলে এই কোডটি খুব বেশি পোস্ট করতে চাই না। মাল্টিটোচিং কীভাবে কাজ করে তা আমি সহজেই বুঝতে পারি না।

basicly পর্যন্ত movingPointউভয় আমার প্রথম ও দ্বিতীয় আঙুল জন্য পরিবর্তন। আমি এটিকে একটি বাক্সে আবদ্ধ করি, তবে যতক্ষণ আমি এই বাক্সের মধ্যে একটি আঙুল ধরে থাকি, এটি আমার দ্বিতীয় আঙুলটি কোথায় স্পর্শ করে তার ভিত্তিতে এটির মান পরিবর্তন করে। এটি সঠিক দিকে চলে যায় এবং কিছুই ত্রুটি দেয় না, সমস্যাটি গতি-পরিবর্তন, প্রায় এটির মতোই এটি দুটি স্পর্শকারী পয়েন্টগুলিকে যুক্ত করে।

উত্তর:


4

আমি মনে করি এটি আপনার পক্ষে কাজ করবে।

আপনার করা একটি ভুল প্রতিটি ইভেন্টের জন্য সমস্ত পয়েন্টার ধরে পুনরাবৃত্তি হয়েছিল। এটি কেবল স্থানান্তর ইভেন্টের জন্য প্রয়োজনীয়।

দ্বিতীয়ত, আপনার আসলে সূচক মানটি getX এবং getY ফাংশনগুলিতে স্থাপন করা দরকার, তবে আপনার গেমের বিষয়গুলির রেফারেন্স হিসাবে ব্যবহার করার জন্য সেই সূচির সাথে সম্পর্কিত আইডি পাবেন get ডাউন ইভেন্টের সময় আপনি আপনার জয়স্টিকের জন্য একটি আইডি বরাদ্দ করেন এবং তারপরে আপনার পয়েন্টার সূচকগুলির মাধ্যমে পুনরাবৃত্তি করার সময়, সূচীটি পয়েন্টার আইডির সাথে যুক্ত কিনা যা ডাউন ইভেন্টের সময় আপনি জোস্টস্টিককে অর্পণ করেছিলেন check যদি তা হয় তবে এটি এখনও সীমানায় রয়েছে কিনা তা পরীক্ষা করুন এবং এটি আপডেট করুন বা এটি অক্ষম করুন।

আমি এই কোডটি পরীক্ষা করছি না, তবে আমি জানি এটি ধারণায় কাজ করে কারণ আমি নিজের কোডটিতে পদ্ধতিটি ব্যবহার করি। এটির সাথে যদি কোনও সমস্যা থাকে যা আপনি বের করতে পারবেন না তা আমাকে জানান।

প্রথমে, আপনার জোয়স্টিক ক্লাসে আপনাকে নিম্নলিখিতগুলি যুক্ত করতে হবে।

boolean dragging=false;
int draggingId;
boolean shooting=false;
int shootingId;

এটির জন্য আপনার অনপ্রযুক্তি পরিবর্তন করুন।

public boolean onTouchEvent(MotionEvent event) {


    int index = event.getActionIndex();
    int id = event.getPointerId(index);
    String actionString;

    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            try{
                    if(x > 0 && x < steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()
                        && !joystick.dragging) {
                            movingPoint.x = x;
                            movingPoint.y = y;
                            joystick.dragging = true;
                            joystick.draggingId = id;
                    }
                    else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()
                        && !joystick.shooting) { 
                            shootingPoint.x = x;
                            shootingPoint.y = y;
                            joystick.shooting=true;
                            joystick.shootingId=id;
                    }
              }
              catch(Exception e){

              }

            actionString = "DOWN";
            break;
        case MotionEvent.ACTION_UP:
            if(id == draggingID)
                joystick.dragging = false;
            if(id ==  shootingID)
                joystick.shooting = false;
            actionString = "UP";
            break;  
        case MotionEvent.ACTION_POINTER_DOWN:
            try{
                    if(x > 0 && x < steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()
                        && !joystick.dragging) {
                            movingPoint.x = x;
                            movingPoint.y = y;
                            joystick.dragging = true;
                            joystick.draggingId = id;
                    }
                    else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()
                        && !joystick.shooting) { 
                            shootingPoint.x = x;
                            shootingPoint.y = y;
                            joystick.shooting=true;
                            joystick.shootingId=id;
                    }
              }
              catch(Exception e){

              }

            actionString = "PNTR DOWN";
            break;
        case MotionEvent.ACTION_POINTER_UP:
            if(id == joystick.draggingID)
                joystick.dragging = false;
            if(id ==  joystick.shootingID)
                joystick.shooting = false;
            actionString = "PNTR UP";
            break;
        case MotionEvent.ACTION_CANCEL:
            if(id == joystick.draggingID)
                joystick.dragging = false;
            if(id ==  joystick.shootingID)
                joystick.shooting = false;
            actionString = "CANCEL";
            break;
        case MotionEvent.ACTION_MOVE:
            for(index=0; index<e.getPointerCount(); index++) {
                id=e.getPointerId(index);
                int x = (int) event.getX(index);
                int y = (int) event.getY(index); 
                if(joystick.dragging && id == joystick.draggingId) {
                    if(x > 0 && x < steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()) {
                        movingPoint.x = x;
                        movingPoint.y = y;
                    }
                    else
                        dragging = false;
                    }
                }
                else if(joystick.shooting && id == joystick.shootingId){
                    if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()) {
                        shootingPoint.x = x;
                        shootingPoint.y = y;                            
                    }
                    else
                        shooting = false;
                    }
                }
            }
            actionString = "MOVE";
            break;
        }
    }

আপনি স্যার, আমার নায়ক. আমি আমার প্রশ্নের সাথে আপডেট কোডটি যুক্ত করব যাতে আপনি দেখতে পান যে আমি কীভাবে এটি আপনার সহায়তায় সমাধান করেছি! এখন আমি শেষ পর্যন্ত আমার খেলাটি শেষ করতে পারি: ডি
গ্রিন_কউই

7

আপনি এটি প্রায় সঠিকভাবেই পেয়ে যাচ্ছেন তবে এক্স / ওয়াইয়ের পরিবর্তে অনুরোধ করার জন্য আপনার পয়েন্টার আইডিটি ব্যবহার করা উচিত i

    int id = event.getPointerId(i);
    int x = (int) event.getX(id);
    int y = (int) event.getY(id);

মোশনএভেন্ট ডকুমেন্টেশন থেকে:

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

event.getX/Yএকটি পয়েন্টার আইডি প্রয়োজন, না i, কারণ কোনও গ্যারান্টি নেই তারা একই ক্রমে থাকবে।

এছাড়াও, আরও একটি সূক্ষ্ম তবে গুরুত্বপূর্ণ সমস্যা রয়েছে। ফাংশনের getAction () পরিবার কীভাবে প্যারামিটার নেয় না তা লক্ষ্য করুন। এ রকম অদ্ভুত, তাই না? এক্স / ওয়াই পেতে পয়েন্টার আইডি প্রয়োজন, তবে ক্রিয়াটি সম্পাদন করা হয়নি? এটি কয়েকটি গুরুত্বপূর্ণ বিষয়কে ইঙ্গিত দিচ্ছে:

  • আপনি প্রতিটি পয়েন্টারের প্রতিটি ক্রিয়াকলাপের জন্য স্পর্শ হ্যান্ডলারের কল পান এবং সমস্ত পয়েন্টারের জন্য ফ্রেম প্রতি একক কল নয়
  • getX / Y এখনও পর্যন্ত পয়েন্টারের ট্রেসটি দেখে এবং সর্বশেষতম মানটি ফেরত দেয়, যখন getAction কেবলমাত্র বর্তমান ইভেন্ট সম্পর্কে অনুসন্ধান করে

সুতরাং এর অর্থ আপনি পয়েন্টার ক্রিয়া (ডাউন / মুভি / আপ) প্রতি আপনার টাচ হ্যান্ডলারের কাছে একটি কল পান । সুতরাং দুটি আঙ্গুলের চলন্ত = 2 কল। আপনার কোডের একটি বাজে পার্শ্ব প্রতিক্রিয়া হ'ল এটি সমস্ত পয়েন্টারে একটি ইভেন্টের ক্রিয়া প্রয়োগ করে ...

সুতরাং, ট্রেসগুলি লুপ করার পরিবর্তে কেবলমাত্র বর্তমান ইভেন্টের জন্য পিড / এক্স / ওয়াই / অ্যাকশনটি পান (একসাথে চলাফেরার জন্য, আপনি সামান্য পরে আপনার হ্যান্ডলারের কাছে আরেকটি কল পাবেন, যেমনটি আমি বলেছিলাম)

ইভেন্টগুলি পরিচালনা করার জন্য আমার কোডটি এখানে:

 public static boolean sendTouchToGameEngine (MotionEvent event)
 {
  int action = event.getAction();
  int actionCode = action & MotionEvent.ACTION_MASK;
  int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;

  [...]
  sendTouchToGameEngine(pid, actionCode, (int)event.getX(pid), (int)event.getY(pid));
  [...]

  return true;

}

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

int movePointerId = -1;
int shootingPointerId = -1;

void TouchEventHandler(MotionEvent event) {   
    // grab the pointer id 
    int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
    int x = (int) event.getX(pid);
    int y = (int) event.getY(pid); 
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    int actionIndex = event.getActionIndex();
    String actionString;


    switch (actionCode)
    {
        case MotionEvent.ACTION_DOWN:
        // on DOWN, figure out whether the player used the moving or shooting control, if any.
        // if so, kept track of which pointer was used, because all following call about that
        // finger touches will use the same pointer id. Also record the current point coordinates.
            actionString = "DOWN";
            try{
                if(x > 0 && x < steeringxMesh + (joystick.get_joystickBg().getWidth() * 2)
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
                        movingPoint.x = x;
                        movingPoint.y = y;
                        movePointerId = pid;
                    }
                else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
                        shootingPoint.x = x;
                        shootingPoint.y = y;
                        shootingPointerId = pid;
                    }
                }catch(Exception e){

                }
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_OUTSIDE:
        // whether the player lift the finger or moves it out of bounds
        // figure out which pointer that was and reset it. You can add additional
        // processing here as required
           if( pid == movePointerId )
              movePointerId = -1;
           else if( pid == shootingPointerId )
              shootingPointerId = -1;
            actionString = "UP";
            break;  
        case MotionEvent.ACTION_MOVE:
        // when the player move their finger, it is simply a matter of comparing the pid
        // to know which one it is
          if( pid == movePointerId ) {
                        movingPoint.x = x;
                        movingPoint.y = y;
          } else if( pid == shootingPointerId ) {
                        shootingPoint.x = x;
                        shootingPoint.y = y;
          }
                actionString = "MOVE";

    }
}

এই দুর্দান্ত উত্তরের জন্য ধন্যবাদ, সত্যিই বেশ কয়েকটি জিনিস সাফ করে। এই লাইনটি কী sendTouchToGameEngine(pid, actionCode, (int)event.getX(pid), (int)event.getY(pid));করে এবং আপনি যখন কল করেন তখন আপনি কেবল ব্যাখ্যা করতে পারেন?
সবুজ_কাউয়ে

এছাড়াও আমি যখন এই লাইনটি ব্যবহার করি: তখন int pid = action >> MotionEvent.ACTION_POINTER_ID_SHIFT;গ্রহটি আমাকে সুপারপ্রেসিং যোগ করতে বলে, এটা কি স্বাভাবিক? এই জাতীয় বিস্তারিত উত্তরের পরে সমস্ত প্রশ্নের জন্য দুঃখিত। মোশনইভেন্ট আমার কাছে খুব নতুন, এবং কোনও কারণে যুক্তি বুঝতে পারছেন না
গ্রিন_কউই

আপডেট করা কোড যুক্ত হয়েছে, আপনি দেখতে পাচ্ছেন আমি কী করতে হবে তা সত্যই জানি না pidএবং লুপটি এখনও রয়েছে, এটি ছাড়া কাজ করব না, যেহেতু আমার দরকার আছে i
সবুজ_কাউয়ে

@ ম্যাক্স: সেন্ডটোচটোগেমেনজাইন হ'ল পরের আপডেটের সময় প্রক্রিয়া করার জন্য আমার গেম ইঞ্জিন কাতারে এই ইভেন্টটি যুক্ত করার জন্য কেবল একটি কল। যদি আপনি নিজের ইনপুট ইভেন্টটি পোল করার জন্য কোনও সারি ব্যবহার না করেন, তবে আপনার কলিং ফাংশনটি অপ্রত্যাশিত উপায়ে গেম ইঞ্জিনের অবস্থার সাথে জড়িত হওয়ার ঝুঁকিটি চালান, যেহেতু টাচএভেন্ট ইউআই থ্রেড থেকে আসে এবং সম্ভবতঃ আপনার গেম ইঞ্জিন আপডেট ভিন্ন থ্রেডে চলে
এডিবি

@ ম্যাক্স: দুর্ভাগ্যক্রমে আমি সতর্কতার বিষয়ে জানিনা। এটি কোনটি বলতে পারেন?
এডিবি

0

এই কোডটি নিয়ে একটু অদ্ভুততা চলছে। আমি অ্যান্ড্রয়েড ব্যবহার করি না, তাই সম্ভবত আমি ভাবছি এটি এমন কিছু যা এটি নয়। তবে আমি লক্ষ্য করেছি যে আপনি দু'বার, দুটি ভিন্ন উপায়ে পজিশন পেয়েছেন:

আপনার pointerCountলুপের শুরুতে আপনি প্রথমে এটি পান :

(int) event.getX(i)

তারপরে, আপনার সুইচ স্টেটমেন্টের ভিতরে আপনি এটির মতো পান:

(int) event.getX(id)

লক্ষ্য করুন যে আপনি ব্যবহার থেকে স্যুইচ iকরছেন id

আমি ধরে নিচ্ছি এটি আগের পদ্ধতি বলে মনে করা হচ্ছে। আমি সমস্ত দৃষ্টান্তের প্রতিস্থাপন (int) event.getX(id)এবং xআপনি যে মান শুরুতে সেট করেছেন তা ব্যবহার করার পরামর্শ দিচ্ছি । অনুরূপভাবে সোয়াপিং (int) event.getY(id)করার জন্য y

এই অংশগুলি অদলবদল করার চেষ্টা করুন:

int pointerCount = event.getPointerCount(); 
for (int i = 0; i < pointerCount; i++)
{       
    int x = (int) event.getX(i);
    int y = (int) event.getY(i);

তারপরে আপনার সুইচের অভ্যন্তরে এটি ব্যবহার করুন:

    try{
        if(x > 0 && x < touchingBox &&
              y > touchingBox && y < view.getHeight()){
            movingPoint.x = x;
            movingPoint.y = y;
            dragging = true;
        }
        else if(x > touchingBox && x < view.getWidth() &&
                   y > touchingBox && y < view.getHeight()){
            shootingPoint.x = x;
            shootingPoint.y = y;
            shooting=true;
        }else{
            shooting=false;
            dragging=false;
        }

2
কেন এটি দরকারী এবং ডাউনটাউটের যোগ্য নয় সে সম্পর্কে মন্তব্য করার জন্য যত্নশীল? এটা করা ভদ্র জিনিস।
MichaelHouse

সম্মতি জানালেন, যদি আপনি ভোট-ডাউন করেন। কেন তাকে জানাবেন। আপনি আগের পদ্ধতি থেকে ঠিক বলেছেন। Ive প্রায় এক মিলিয়ন বিভিন্ন জিনিস চেষ্টা করেছিল তাই আমি এটিকে সরাতে ভুলে গেছি।
সবুজ_কউয়ে

এটি প্রতিফলিত করতে আপনি কি আপনার প্রশ্নের কোড আপডেট করতে পারবেন? আমি তোমাদের সেটিং মুছে ফেলা দেখতে xএবং y, কিন্তু আপনি এখনও দ্বারা অবস্থান পাচ্ছেন idপরে।
MichaelHouse

আঃ, আপনার উত্তরটি বুঝতে আমাকে কিছুক্ষণ সময় লাগল। কিন্তু কিভাবে এই কাজ করবে? যদি আমি একই ভেরিয়েবল ( x=event.getX(i)) ব্যবহার করি তবে xযখন 2 এর pointerCountচেয়ে বেশি হয় তখন 2 টি মান সংরক্ষণ করতে হবে ? এবং যে ডান সঠিক মনে।
সবুজ_কউয়ে

1
যা আমি বুঝতে পেরেছি eventতা সত্যিই ইভেন্টগুলির একটি তালিকা। আপনি করছেন এমন তালিকায় গিয়ে বিভিন্ন ইভেন্ট অ্যাক্সেস করতে পারেন। সুতরাং আপনি xযে দ্বিতীয় ইভেন্টটি ব্যবহার করেন তার অবস্থানটি অ্যাক্সেস করতে event.getX(1)(যেহেতু আমরা 0 থেকে শুরু করছি)। একাধিক xগুলি রয়েছে, আপনি কোনটি চান তা জানানোর জন্য আপনি প্যারামিটারটি ব্যবহার করছেন। আপনি আপনার forলুপের সাথে সমস্ত ইভেন্টের মধ্য দিয়ে ঘুরে বেড়াচ্ছেন , সুতরাং আপনার আগ্রহী বর্তমান ইভেন্ট হিসাবে সেই নম্বরটি ব্যবহার করুন my আমার কোড পরিবর্তনের পরামর্শ দেখুন।
MichaelHouse

0

হুয়াওয়ে U8150 এ একবার আমার একই সমস্যা হয়েছিল। একটি ডিভাইসটিতে দুটি আঙুলের মাল্টিট্যাচ সত্যিই খারাপ ছিল, একটি মাল্টিটুচ টেস্ট অ্যাপ্লিকেশন ব্যবহার করে (সম্ভবত এটি "ফোন টেস্টার" ছিল তবে আমি নিশ্চিত নই) আমি দেখতে পেলাম যে দ্বিতীয় আঙুলের সাহায্যে অনেক পিক্সেলের প্রথম স্পর্শ স্পটটি সরে গেছে । এটি যদি হার্ডওয়্যার সম্পর্কিত তুলনায় আপনার সমস্যা হয় এবং আমি মনে করি না আপনি এর জন্য অনেক কিছু করতে পারেন :(

আমার অদক্ষ ইংরেজির জন্য আমি দুঃখিত


সমস্যাটি নেই
সবুজ_কউই

ঠিক আছে, কেবল একটি চিন্তা ছিল
মার্কো মার্টিনেল্লি

0

আমি বিশ্বাস করি যে আপনার সমস্যাটি হ'ল আপনি ধরেই নিচ্ছেন যে আপডেটের মধ্যে পয়েন্টারগুলি যেভাবে সাজানো হয়েছে সেটি একই থাকে। সম্ভবত এটি ক্ষেত্রে হবে না।

এমন একটি পরিস্থিতিটি কল্পনা করুন যেখানে আপনি আঙুলের সাথে স্পর্শ করেন There আপনি একটি দ্বিতীয় আঙুল যুক্ত করে থাকেন, pointerCount (), 2 হবে সূচক 0 এ হবে, বি) সূচক 1. হতে হবে, আপনি আঙুল একটি বাড়াতে পারেন pointerCount (1 আবার হবে, এবং বি সূচক 0 এ হতে হবে । আপনি যদি আবার আঙুলের সাথে স্পর্শ করেন তবে A সূচক 1 এবং বি সূচক 0 এ থাকবে

এজন্য পয়েন্টার আইডি সরবরাহ করা হয়, যাতে আপনি আপডেটগুলির মধ্যে পৃথক ছোঁয়া ট্র্যাক করতে পারেন। সুতরাং আঙুলের বি এর প্রথম স্পর্শটি যদি আইডিকে 12 বরাদ্দ করা হয় তবে আঙুলের এ সরিয়ে পুনরায় যুক্ত করার পরেও তার সর্বদা সেই আইডি থাকবে।

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

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

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