অনক্লিকলিস্টনার - x, ইভেন্টের অবস্থান?


85

আমার ভিউ থেকে প্রাপ্ত একটি কাস্টম ভিউ রয়েছে। ভিউটি ক্লিক করা হলে এবং যেখানে ক্লিক হয়েছিল সেখানে x, y এর অবস্থান সম্পর্কে আমি জানাতে চাই। দীর্ঘ-ক্লিকের জন্য একই।

দেখে মনে হচ্ছে এটি করার জন্য আমার ওভাররাইড করা দরকার onTouchEvent()। এর OnClickListenerপরিবর্তে কোনও ইভেন্টের x, y অবস্থান পাওয়ার কোনও উপায় নেই ?

যদি তা না হয় তবে কোনও মোশন ইভেন্ট 'রিয়েল' ক্লিক বনাম দীর্ঘ-ক্লিক ইত্যাদির যদি বলার ভাল উপায় কী? onTouchEventদ্রুত পারম্পর্য ইত্যাদি অনেক ঘটনা উত্পন্ন

উত্তর:


92

ধন্যবাদ. আমি ঠিক তাই খুঁজছিলাম। আমার কোডটি এখন:

imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
                textView.setText("Touch coordinates : " +
                        String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
            }
            return true;
        }
    });

যা মার্ক যা চেয়েছিল তা অবিকল ...


4
এই সমন্বয়গুলি কি দেখার জন্য স্থানীয়?
নাইজেল

7
অন ​​টাচ হ্যান্ডলারটি কী ফিরে আসা উচিত নয় falseযাতে এটি স্পর্শ ইভেন্টগুলিকে অবরুদ্ধ করে না? (শ্রোতা শ্রোতা ইভেন্টটি গ্রাস করেছেন, অন্যথায় যদি তা মিথ্যা হয়ে থাকে তবে View.OnTouchListener.onTouch সত্য প্রত্যাবর্তন করে))
এয়ারটওয়েল

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

আমি ক্লিক করা সমবায়গুলিতে পাঠ্য লেখার চেষ্টা করছি। আমি সমবায়গুলিতে পাঠ্য লেখার চেষ্টা করেছি (event.getX(), event.getY()) তবে এটি সঠিক অবস্থানে লেখা হচ্ছে না।
প্রিন্স

এখানে আমার প্রশ্ন: স্ট্যাকওভারফ্লো.com
প্রিন্স

26

পুরো উদাহরণ

অন্যান্য উত্তরগুলিতে কিছু বিশদ অনুপস্থিত। এখানে একটি সম্পূর্ণ উদাহরণ।

public class MainActivity extends AppCompatActivity {

    // class member variable to save the X,Y coordinates
    private float[] lastTouchDownXY = new float[2];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // add both a touch listener and a click listener
        View myView = findViewById(R.id.my_view);
        myView.setOnTouchListener(touchListener);
        myView.setOnClickListener(clickListener);
    }

    // the purpose of the touch listener is just to store the touch X,Y coordinates
    View.OnTouchListener touchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            // save the X,Y coordinates
            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                lastTouchDownXY[0] = event.getX();
                lastTouchDownXY[1] = event.getY();
            }

            // let the touch event pass on to whoever needs it
            return false;
        }
    };

    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // retrieve the stored coordinates
            float x = lastTouchDownXY[0];
            float y = lastTouchDownXY[1];

            // use the coordinates for whatever
            Log.i("TAG", "onLongClick: x = " + x + ", y = " + y);
        }
    };
}

সারসংক্ষেপ

  • স্থানাঙ্কগুলি সঞ্চয় করতে একটি শ্রেণি ভেরিয়েবল যুক্ত করুন
  • এক্স, ওয়াই স্থানাংকগুলি একটি ব্যবহার করে সংরক্ষণ করুন OnTouchListener
  • এক্স, ওয়াই স্থানাঙ্কিতে অ্যাক্সেস করুন OnClickListener

4
2 স্পেসের ভাসমান অ্যারের পরিবর্তে একটি পয়েন্ট () ব্যবহার করা যেতে পারে।
চিড়িয়াখানা

বিন্দুতে এক্স এবং ওয়াই টাইপ পূর্ণসংখ্যা রয়েছে। স্থানাঙ্কগুলি হ'ল ভাসমান মান। আমি যদি পয়েন্ট শ্রেণি ব্যবহার করি তবে আমার মনে হয় আমি যথার্থতা হারাতে চাই .... আমি অ্যান্ড্রয়েডে খুব নতুন এবং সম্ভবত আমি কিছু মিস করেছি।
এমবাডা

@ এমবাডা, আপনি ঠিক বলেছেন। পয়েন্টএফ ভাল হবে।
সুরগাচ

অন ​​টাচলিস্টনার এড়াতে এবং কেবলমাত্র ক্লিকলিস্টার ব্যবহার করার উপায় থাকতে হবে। একরকম, ContextMenu এর দরকার নেই। কোনও আইটেমটি ক্লিক করার পরে এবং অ্যাঙ্কর হিসাবে ভিউ সহ মেনুটি প্রদর্শন করার পরে, এটি স্পর্শের অবস্থানের নিকটে, এটি কোথায় রাখা উচিত তা জানে। এখানে দেখুন: stackoverflow.com/q/57290574/878126 । আপনি কি জানেন কীভাবে এটি সম্ভব? যদি তা হয় তবে দয়া করে সেখানে উত্তর দেওয়ার বিষয়ে বিবেচনা করুন।
অ্যান্ড্রয়েড বিকাশকারী

3

ওভাররাইড অন টাচএভেন্ট (মোশনইভেন্ট ইভ)

তারপরে আপনি এটি করতে পারেন:

ev.getXLocation()

বা এমন কিছু। একটি কসাই আছে।


4
হাই টম, হ্যাঁ আমরা টাচএভেন্টটি ব্যবহার করতে পারি, তবে তারপরে আমাদের ক্লিক এবং লং ক্লিকগুলির মধ্যে বিচ্ছিন্নতা নিজেরাই পরিচালনা করতে হবে, তাই না? এটি কোনও অর্থ দেয় না যে তারা আপনাকে জানার কোনও উপায় প্রদান করবে না যে ক্লিক বা দীর্ঘ ক্লিকটি অনক্লিকলিস্টার ইত্যাদিতে কোথায় ঘটেছে? ধন্যবাদ
চিহ্নিত করুন

21
আপনাকে যা করতে হবে তা হ'ল সর্বশেষ ACTION_UP বা ACTION_MOVE ইভেন্টের এক্স & ওয়াই অবস্থান রেকর্ড করতে হবে এবং আপনার অনক্লিকলিস্টারে এই মানগুলি ব্যবহার করতে হবে।
রোমেন গাই

@ রোমেনগুই তবে একটি ক্লিক নির্ধারণ করতে আপনাকে অবশ্যই দুটি পয়েন্টের মধ্যকার দূরত্ব গণনা করতে হবে। আপনি যদি (0,0) এ অ্যাকশন_ডাউন ইভেন্ট এবং তারপরে ACTION_UP ইভেন্ট (100,100) পান তবে এটি অবশ্যই ক্লিক নয়।
TheRealChx101

@ chx101, রোমেনগুইয়ের অর্থ (আমি মনে করি) তা হ'ল আপনি যদি কেবলমাত্র অ্যাক্টিভেন্টের শেষ ক্রিয়াকলাপ রেকর্ডিংয়ে রেকর্ড করেন তবে সেগুলি হ'ল স্থানাঙ্কগুলি যা আপনি অনক্লিকটিতে ব্যবহার করতে পারেন। তবে আমি মনে করি যে অনুশীলনে ভিউ সাবক্লাসিংয়ের প্রয়োজন হবে, বা অনক্লিক ডাকা হবে না। আপনি
স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসাগুলি /

0

আপনি কোটলিনে এটির মতো একটি এক্সটেনশন ফাংশন করতে পারেন:

fun View.setOnClickListenerWithPoint(action: (Point) -> Unit) {
    val coordinates = Point()
    val screenPosition = IntArray(2)
    setOnTouchListener { v, event ->
        if (event.action == MotionEvent.ACTION_DOWN) {
            v.getLocationOnScreen(screenPosition)
            coordinates.set(event.x.toInt() + screenPosition[0], event.y.toInt() + screenPosition[1])
        }
        false
    }
    setOnClickListener {
        action.invoke(coordinates)
    }
}

আপনার যদি দীর্ঘ ক্লিকের প্রয়োজন হয় - কেবল প্রতিস্থাপন করুন setOnClickListener

আমি ব্যবহার করি getLocationOnScreen()কারণ আমার পুনর্ব্যবহারযোগ্য ভিউহোল্ডারটির জন্য স্থানাঙ্ক প্রয়োজন

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