Android 터치

iOS와 마찬가지로 Android는 화면과 사용자의 물리적 상호 작용에 대한 데이터(개체)를 보유하는 개체를 Android.View.MotionEvent 만듭니다. 이 개체는 수행되는 동작, 터치가 발생한 위치, 적용된 압력의 양 등과 같은 데이터를 보유합니다. 개체는 MotionEvent 이동을 다음 값으로 구분합니다.

  • 초기 터치, 화면을 가로질러 이동하는 터치 또는 터치 끝과 같은 동작 유형을 설명하는 작업 코드입니다.

  • 터치가 수행되는 위치, 터치가 발생한 시기 및 사용된 압력 양과 같은 기타 이동 속성의 위치 MotionEvent 및 기타 이동 속성을 설명하는 축 값 집합입니다. 축 값은 디바이스에 따라 다를 수 있으므로 이전 목록에서 모든 축 값을 설명하지는 않습니다.

개체는 MotionEvent 애플리케이션의 적절한 메서드에 전달됩니다. Xamarin.Android 애플리케이션이 터치 이벤트에 응답하는 세 가지 방법이 있습니다.

  • 이벤트 처리기를 할당합니다 View.Touch . 클래스에는 Android.Views.ViewEventHandler<View.TouchEventArgs> 처리기를 할당할 수 있는 애플리케이션이 있습니다. 일반적인 .NET 동작입니다.

  • View.IOnTouchListener 구현 - 이 인터페이스의 인스턴스는 뷰를 사용하여 뷰 개체에 할당될 수 있습니다. SetOnListener 메서드. 이는 이벤트 처리기를 View.Touch 이벤트에 할당하는 것과 기능적으로 동일합니다. 여러 보기가 터치될 때 필요할 수 있는 공통 또는 공유 논리가 있는 경우 각 뷰에 자체 이벤트 처리기를 할당하는 것보다 클래스를 만들고 이 메서드를 구현하는 것이 더 효율적입니다.

  • 재정 View.OnTouchEvent 의 - Android 하위 클래스의 모든 보기.Android.Views.View 뷰를 터치하면 Android에서 해당 뷰를 OnTouchEvent 호출하여 개체를 MotionEvent 매개 변수로 전달합니다.

참고 항목

모든 Android 디바이스가 터치 스크린을 지원하는 것은 아닙니다.

매니페스트 파일에 다음 태그를 추가하면 Google Play에서 터치가 사용하도록 설정된 디바이스에만 앱을 표시합니다.

<uses-configuration android:reqTouchScreen="finger" />

제스처

제스처는 터치 스크린에서 손으로 그린 모양입니다. 제스처는 하나 이상의 스트로크를 가질 수 있으며, 각 스트로크는 화면과의 다른 접촉 지점에서 만든 점 시퀀스로 구성됩니다. Android는 화면을 가로지르는 간단한 날뛰기부터 멀티 터치를 포함하는 복잡한 제스처에 이르기까지 다양한 유형의 제스처를 지원할 수 있습니다.

Android는 Android.Gestures 제스처를 관리하고 응답하기 위해 특별히 네임스페이스를 제공합니다. 모든 제스처의 중심에는 라는 Android.Gestures.GestureDetector특수 클래스가 있습니다. 이름에서 알 수 있듯이 이 클래스는 운영 체제에서 MotionEvents 제공하는 제스처 및 이벤트를 수신 대기합니다.

제스처 감지기를 구현하려면 작업은 다음 코드 조각에 설명된 대로 클래스를 GestureDetector 인스턴스화하고 인스턴스 IOnGestureListener를 제공해야 합니다.

GestureOverlayView.IOnGestureListener myListener = new MyGestureListener();
_gestureDetector = new GestureDetector(this, myListener);

또한 활동은 OnTouchEvent를 구현하고 동작 감지기에 MotionEvent를 전달해야 합니다. 다음 코드 조각은 이 예제를 보여줍니다.

public override bool OnTouchEvent(MotionEvent e)
{
    // This method is in an Activity
    return _gestureDetector.OnTouchEvent(e);
}

인스턴스 GestureDetector 가 관심 있는 제스처를 식별하는 경우 이벤트를 발생시키거나 제공된 콜백을 통해 활동 또는 애플리케이션에 GestureDetector.IOnGestureListener알립니다. 이 인터페이스는 다양한 제스처에 대한 6가지 메서드를 제공합니다.

  • OnDown - 탭이 발생하지만 해제되지 않은 경우 호출됩니다.

  • OnFling - fling이 발생할 때 호출되며 이벤트를 트리거한 시작 및 끝 터치에 대한 데이터를 제공합니다.

  • OnLongPress - 긴 누름이 발생할 때 호출됩니다.

  • OnScroll - 스크롤 이벤트가 발생할 때 호출됩니다.

  • OnShowPress - OnDown이 발생하고 이동 또는 위로 이벤트가 수행되지 않은 후 호출됩니다.

  • OnSingleTapUp - 한 번의 탭이 발생할 때 호출됩니다.

대부분의 경우 애플리케이션은 제스처의 하위 집합에만 관심이 있을 수 있습니다. 이 경우 애플리케이션은 GestureDetector.SimpleOnGestureListener 클래스를 확장하고 관심 있는 이벤트에 해당하는 메서드를 재정의해야 합니다.

사용자 지정 제스처

제스처는 사용자가 애플리케이션과 상호 작용하는 좋은 방법입니다. 지금까지 본 API는 간단한 제스처에 충분하지만 더 복잡한 제스처에는 다소 번거로울 수 있습니다. 더 복잡한 제스처를 돕기 위해 Android는 Android.Gestures 네임스페이스에 다른 API 집합을 제공하여 사용자 지정 제스처와 관련된 부담을 덜어줍니다.

사용자 지정 제스처 만들기

Android 1.6부터 Android SDK는 제스처 작성기라는 에뮬레이터에 미리 설치된 애플리케이션과 함께 제공됩니다. 이 애플리케이션을 사용하면 개발자가 애플리케이션에 포함할 수 있는 미리 정의된 제스처를 만들 수 있습니다. 다음 스크린샷은 제스처 작성기의 예를 보여 줍니다.

예제 제스처가 있는 제스처 작성기의 스크린샷

제스처 도구라는이 응용 프로그램의 개선 된 버전은 Google Play를 찾을 수 있습니다. 제스처 도구는 제스처를 만든 후 테스트할 수 있다는 점을 제외하면 제스처 작성기와 매우 비슷합니다. 다음 스크린샷은 제스처 작성기:

예제 제스처가 있는 제스처 도구의 스크린샷

제스처 도구는 제스처를 만들 때 테스트할 수 있고 Google Play를 통해 쉽게 사용할 수 있으므로 사용자 지정 제스처를 만드는 데 좀 더 유용합니다.

제스처 도구를 사용하면 화면에 그림을 그리고 이름을 할당하여 제스처를 만들 수 있습니다. 제스처를 만든 후 디바이스의 SD 카드 이진 파일에 저장됩니다. 이 파일을 디바이스에서 검색한 다음 /Resources/raw 폴더의 애플리케이션과 함께 패키지해야 합니다. 이 파일은 Android 디버그 브리지를 사용하여 에뮬레이터에서 검색할 수 있습니다. 다음 예제에서는 Galaxy Nexus에서 애플리케이션의 리소스 디렉터리로 파일을 복사하는 방법을 보여줍니다.

$ adb pull /storage/sdcard0/gestures <projectdirectory>/Resources/raw

파일을 검색한 후에는 /Resources/raw 디렉터리 내에서 애플리케이션과 함께 패키지해야 합니다. 이 제스처 파일을 사용하는 가장 쉬운 방법은 다음 코드 조각과 같이 파일을 GestureLibrary에 로드하는 것입니다.

GestureLibrary myGestures = GestureLibraries.FromRawResources(this, Resource.Raw.gestures);
if (!myGestures.Load())
{
    // The library didn't load, so close the activity.
    Finish();
}

사용자 지정 제스처 사용

활동에서 사용자 지정 제스처를 인식하려면 Android.Gesture.GestureOverlay 개체가 레이아웃에 추가되어야 합니다. 다음 코드 조각은 프로그래밍 방식으로 동작에 GestureOverlayView를 추가하는 방법을 보여 줍니다.

GestureOverlayView gestureOverlayView = new GestureOverlayView(this);
gestureOverlayView.AddOnGesturePerformedListener(this);
SetContentView(gestureOverlayView);

다음 XML 코드 조각은 GestureOverlayView를 선언적으로 추가하는 방법을 보여줍니다.

<android.gesture.GestureOverlayView
    android:id="@+id/gestures"
    android:layout_width="match_parent "
    android:layout_height="match_parent" />

제스처 GestureOverlayView 를 그리는 동안 발생할 여러 이벤트가 있습니다. 가장 흥미로운 이벤트는 GesturePerformed. 이 이벤트는 사용자가 제스처 그리기를 완료했을 때 발생합니다.

이 이벤트가 발생하면 활동은 사용자가 제스처 도구에서 GestureLibrary 만든 제스처 중 하나와 일치하는 제스처를 시도하고 일치하도록 요청합니다. GestureLibrary 은 예측 개체 목록을 반환합니다.

각 예측 개체는 에 있는 GestureLibrary제스처 중 하나의 점수와 이름을 보유합니다. 점수가 높을수록 예측에서 명명된 제스처가 사용자가 그린 제스처와 일치할 가능성이 높습니다. 일반적으로 1.0보다 낮은 점수는 좋지 않은 경기로 간주됩니다.

다음 코드는 제스처를 일치시키는 예제를 보여줍니다.

private void GestureOverlayViewOnGesturePerformed(object sender, GestureOverlayView.GesturePerformedEventArgs gesturePerformedEventArgs)
{
    // In this example _gestureLibrary was instantiated in OnCreate
    IEnumerable<Prediction> predictions = from p in _gestureLibrary.Recognize(gesturePerformedEventArgs.Gesture)
    orderby p.Score descending
    where p.Score > 1.0
    select p;
    Prediction prediction = predictions.FirstOrDefault();

    if (prediction == null)
    {
        Log.Debug(GetType().FullName, "Nothing matched the user's gesture.");
        return;
    }

    Toast.MakeText(this, prediction.Name, ToastLength.Short).Show();
}

이렇게 하면 Xamarin.Android 애플리케이션에서 터치 및 제스처를 사용하는 방법을 이해해야 합니다. 이제 연습으로 이동하여 작업 샘플 애플리케이션의 모든 개념을 살펴보겠습니다.