TouchListener PK OnTouchEvent + 멀티터치
이 섹션 소개:
제목에서 알 수 있듯이 이 섹션에서는 TouchListener와 OnTouchEvent 간의 비교와 멀티 터치에 대한 지식 포인트를 제공합니다! TouchListener는 청취를 기반으로 하는 반면 OnTouchEvent는 콜백을 기반으로 합니다! 두 가지 간단한 예를 사용하여 다들 이해해!
1. 청취 기반 TouchListener
코드 예:
구현 렌더링:
구현 코드: main.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_mar gin"
도구:context= " .MyActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imgtouch"
android:Background="../style/ 이미지 /터치"/>
</RelativeLayout>
MainAcitivity.java
private ImageView imgtouch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
imgtouch = (ImageView)findViewById(R.id.imgtouch);
imgtouch.setOnTouchListener(new View.OnTouchListener() {
@Override
공개 부울 onTouch(View v, MotionEvent event) {
Toast.makeText(getApplicationContext(),"你通过监听器模式:OnTouchListener摸了伦가족~" ,Toast.LENGTH_LONG).show();
return true;
}
})
}
}
코드 분석:
간단하게 ImageView를 설정한 다음 onTouchListener를 설정하고 onTouch 메서드를 다시 작성하면 됩니다. 실제로 프레임 레이아웃 섹션에 이에 대한 예가 있습니다. 그 손가락?
OnTouchListener 관련 메소드 및 속성:
onTouch(View v, MotionEvent 이벤트): 여기의 매개변수는 터치 이벤트를 트리거하는 구성요소와 터치 이벤트 이벤트입니다. 이벤트 유형, 트리거 시간 및 기타 정보를 포함하여 트리거 이벤트에 대한 자세한 정보를 캡슐화합니다. 예를 들어, event.getX(), event.getY()
터치 동작 유형을 판단하고 event.getAction()을 사용하여 다음과 같이 다시 판단할 수도 있습니다.
event.getAction == MotionEvent.ACTION_DOWN: 누르기 이벤트
event.getAction == MotionEvent.ACTION_MOVE: 이동 이벤트
event.getAction == MotionEvent.ACTION_UP: 팝업 이벤트
2. 콜백 기반 onTouchEvent() 메소드
도 있습니다. 터치 이벤트이지만 onTouchEvent는 사용자 정의 뷰에 더 적합합니다. 이 메서드는 모든 뷰 클래스에서 재정의되며 이 터치 이벤트는 콜백을 기반으로 합니다. 즉, 반환하는 값이 false이면 이벤트가 계속 전파됩니다. 물론 제스처도 포함되는데 이에 대해서는 나중에 자세히 설명하겠습니다. onTouchEvent는 실제로 onTouchListener와 유사하지만 처리 메커니즘은 사용되지 않습니다. 후자는 청취 모드입니다!
코드 예: 간단한 뷰를 정의하고 손가락으로 이동할 수 있는 작은 파란색 원을 그립니다.
구현 코드: MyView.java
public float X = 50;
공개 부동 소수점 Y = 50;
//创建画笔
페인트 페인트 = 새 페인트();
public MyView(Context context,AttributeSet set)
{
super(context,set);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setColor(Color.BLUE);
canvas.drawCircle(X,Y,30,paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.X = event.getX();
this.Y = event.getY();
//통지명件进行중합
this.invalidate();
true를 반환합니다.
}
}
main.xml:
xmlns:tools="http:// schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyActivity">
<example.jay.com.touch2.MyView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
구현 렌더링:
손가락으로 터치하여 이동하세요~
3. 멀티 터치
원리:
멀티 터치는 화면에 여러 손가락을 대고 조작하는 것을 의미합니다. 가장 일반적으로 사용되는 것은 아마도 확대/축소 기능일 것입니다. 예를 들어, 많은 이미지 브라우저는 확대/축소를 지원합니다! 이론적으로 Android 시스템 자체는 최대 256개 손가락의 터치를 처리할 수 있습니다. 물론 이는 휴대폰 하드웨어 지원에 따라 다르지만 멀티 터치를 지원하는 휴대폰은 일반적으로 2~4개 지점을 지원합니다. 일부는 더 많은 것을 가지고 있습니다! MotionEvent는 처음 두 지점에서 사용되었으며 MotionEvent는 터치 이벤트를 나타냅니다. 먼저 3개의 단일 이벤트 외에도 event.getAction() 및 MotionEvent.ACTION_MASK를 기반으로 어떤 종류의 작업인지 판단할 수 있습니다. 위에 소개된 포인트 작업과 두 개의 다중 포인트 전용 작업이 있습니다:
- MotionEvent.ACTION_POINTER_DOWN: 화면의 한 포인트가 이미 눌려지고 다른 포인트가 눌려지면 트리거됩니다.
- MotionEvent.ACTION_POINTER_UP: 화면의 여러 지점을 누르고 지점 중 하나를 놓았을 때(즉, 마지막 지점이 아닌 지점을 놓았을 때) 트리거됩니다.
간단한 프로세스는 다음과 같습니다.
- 한 손가락으로 화면을 터치하면 -> ACTION_DOWN 이벤트가 발생합니다.
- 그런 다음 다른 손가락도 화면을 터치하면 -> ACTION_POINTER_DOWN 이벤트가 발생합니다. 다른 손가락 터치시 계속 트리거
- 손가락이 화면을 떠나면——> ACTION_POINTER_UP 이벤트가 발생하고, 손가락이 계속 나가면 계속 트리거됩니다.
- 마지막 손가락이 화면을 벗어나면——> ACTION_UP 이벤트가 발생합니다
- 그리고 프로세스 전반에 걸쳐 ACTION_MOVE 이벤트가 지속적으로 트리거됩니다
이벤트를 통해 다양한 터치 포인트의 위치를 얻을 수 있습니다.getX(int) 또는 event.getY(int): 예를 들어 event.getX(0)는 첫 번째 접점의 X 좌표를 얻을 수 있고, event.getX(1)은 두 번째 접점의 X 좌표를 다음과 같이 얻을 수 있습니다. 또한 MotionEvent 개체의 getPointerCount() 메서드를 호출하여 현재 터치하고 있는 손가락 수를 확인할 수도 있습니다~
코드 예:
자, 가장 일반적인 한 손가락 드래그 이미지인 두- 손가락 드래그 그림 확대 예 참조:
구현 렌더링:

구현 코드:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width ="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/img_test"
android:layout_width="match_parent"
android:layout_height="match_parent"
안드로이드: scaleType="matrix"
android:src="@drawable/pic1" />
</RelativeLayout>
MainActivity.java
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util. FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public 클래스 MainActivity는 Activity를 확장하여 OnTouchListener를 구현합니다. {
privateImageView img_test ;
// 확대/축소 제어
private Matrix Matrix = new Matrix();
private Matrix selectedMatrix = new Matrix();
// 다양한 상태 표현:
private static final int NONE = 0
private static final int; DRAG = 1;
private static final int ZOOM = 2;
private int mode = NONE;
// 처음 누른 지점, 두 접촉점의 초점, 사고를 일으킨 두 손가락 사이의 거리를 정의합니다. :
private PointF startPoint = new PointF();
private PointF midPoint = new PointF();
private float oriDis = 1f;
* @see android.app.Activity #onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main) ;
img_test = (ImageView) findViewById(R.id.img_test);
img_test.setOnTouchListener (this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (I mageView) v;
스위치 (event.getAction () & MotionEvent.ACTION_MASK) {
~ 사례 MotionEvent.ACTION_DOWN:
matrix.set(view.getImageMatrix());
savedMatrix.set(matrix);
startPoint.set(event.getX(), event.getY());
모드 = 드래그;
휴식 ;
// 双指
case MotionEvent.ACTION_POINTER_DOWN:
oriDis = distance(event);
if (oriDis > 10f) {
savedMatrix.set(matrix);
midPoint = middle(event);
mode = ZOOM; ㅋㅋㅋ 모드 드래그) {
//是一个手指拖动
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - startPoint.x, 심지어 t.getY() - startPoint.y);
} 그렇지 않으면 ( 모드 == ZOOM) {
// 两个手指滑动
float newDist = 거리(이벤트);
if (newDist > 10f) {
Matrix.set(savedMatrix);
float scale = newD ist / oriDis;
Matrix.postScale(scale, scale, midPoint.x, midPoint.y ) ;
}
true 반환 ;
true를 반환합니다. 이벤트) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1 );
float * y);
}
// 두 터치 포인트의 중간점 계산
private PointF middle(MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event .getY(0) + event.getY(1);
Return new PointF(x / 2, y / 2);
}
}
이 섹션 요약:
알겠습니다.
정보 TouchListener
와 멀티터치까지~