#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)
{
}
были вызваны.