Проблемы с ScaleGestureDetector.IOnScaleGestureListener C # Xamarin

#android #.net #xamarin #xamarin.android

#Android #.net #xamarin #xamarin.android

Вопрос:

Я создаю приложение, которое позволяет пользователю перемещать 2 текстовых представления в Xamarin android .net. Все работает так, как должно, за исключением onScale (жест зажима). Отладка показывает, что функции IOnScaleGestureListener никогда не вызываются (вот почему я оставил их пустыми). Кто-нибудь знает, что мне нужно сделать, чтобы вызвать их? основная деятельность

     public class MainActivity : AppCompatActivity, IOnTouchListener, IOnGestureListener, ScaleGestureDetector.IOnScaleGestureListener 
    {
        int position = 0;
        private List<TextView> txtGestureView = new List<TextView>();
        private GestureDetector gestureDetector;
        private ScaleGestureDetector scaleDetector;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            SetContentView(Resource.Layout.activity_main);
            RelativeLayout.LayoutParams lps = new RelativeLayout.LayoutParams(400, 400);
            txtGestureView.Add(FindViewById<TextView>(Resource.Id.imageView));
            txtGestureView.Add(FindViewById<TextView>(Resource.Id.imageView2));
            RelativeLayout relativeLayout = FindViewById<RelativeLayout>(Resource.Id.relativeLayout1);
            gestureDetector = new GestureDetector(this);
            scaleDetector = new ScaleGestureDetector(this, this);
            txtGestureView[0].SetOnTouchListener(this);
            txtGestureView[0].Tag = "0";
            txtGestureView[1].SetOnTouchListener(this);
            txtGestureView[1].Tag = "1";
        }
        public bool OnTouch(View v, MotionEvent e)
        {
            position = int.Parse(v.Tag.ToString(), 0);
            return gestureDetector.OnTouchEvent(e);
        }
        public bool OnScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
        {
            float diffY = e2.GetY() - e1.GetY();
            float diffX = e2.GetX() - e1.GetX();
            txtGestureView[position].SetX(txtGestureView[position].GetX()   diffX);
            txtGestureView[position].SetY(txtGestureView[position].GetY()   diffY);
            return true;
        }
        public bool OnDown(MotionEvent e) { return true; }
        public bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return true; }
        public void OnLongPress(MotionEvent e) { }
        public void OnShowPress(MotionEvent e) { }
        public bool OnSingleTapUp(MotionEvent e) { return true; }

        public bool OnScale(ScaleGestureDetector detector)
        {
            return true;
        }

        public bool OnScaleBegin(ScaleGestureDetector detector)
        {
            return true;
        }

        public void OnScaleEnd(ScaleGestureDetector detector)
        {

        }
    }
  

xml-файл

 <?xml version="1.0" encoding="utf-8"?>    
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
                xmlns:app="http://schemas.android.com/apk/res-auto"    
                xmlns:tools="http://schemas.android.com/tools"    
                android:layout_width="match_parent"  
                android:layout_height="match_parent"    
                tools:showIn="@layout/activity_main"
    android:id="@ id/relativeLayout1">    
    
                 <TextView    
                android:id="@ id/imageView"    
                android:layout_width="200dp"    
                android:text="imageView"    
        android:layout_centerHorizontal="true"
                android:textSize="35dp"    
        android:layout_marginTop="100dp"
                android:gravity="center"      
                android:background="@android:color/black"    
                android:textColor="@android:color/white"    
                android:layout_height="50dp"/>   
    
                 <TextView    
                android:id="@ id/imageView2"    
                android:layout_width="200dp"    
                android:text="imageView2"    
                android:textSize="35dp"    
                android:gravity="center"    
                android:layout_centerInParent="true"    
                android:textColor="@android:color/white"    
                android:background="@android:color/black"    
                android:layout_height="50dp"/>
    
</RelativeLayout>   
  

Комментарии:

1. Что вы хотите сделать с IOnScaleGestureListener ? Это событие срабатывает, когда пользователь масштабирует представление с помощью жестов. Пожалуйста, проверьте это.

2. Я хочу масштабировать эти текстовые представления с помощью жестов. Я думал, что они будут вызываться, когда я касаюсь экрана двумя пальцами, и в результате дают мне некоторое значение масштабирования в одной из этих функций.

3. Вы имеете в виду, что когда вы касаетесь экрана двумя пальцами, он не будет регистрировать OnScale метод? Но это файлы OnScroll ? Я бы проверил это еще раз.

4. Точно, и я хочу запустить метод onScale при использовании двух пальцев.

5. Даже когда я отключаю GestureDetector от activity, функции из ScaleGestureDetector не запускаются.

Ответ №1:

Проблема заключалась в OnTouch() том, что я возвращался return gestureDetector.OnTouchEvent(e); вместо return scaleDetector.OnTouchEvent(e);

почему это не работает:

         public bool OnScale(ScaleGestureDetector detector)
        {
            return true;
        }

        public bool OnScaleBegin(ScaleGestureDetector detector)
        {
            return true;
        }

        public void OnScaleEnd(ScaleGestureDetector detector)
        {

        }
  

были вызваны.