TouchListener PK OnTouchEvent + berbilang sentuhan


Pengenalan kepada bahagian ini:

Seperti yang dinyatakan dalam tajuk, bahagian ini membawakan anda perbandingan antara TouchListener dan OnTouchEvent, juga kerana lebih banyak mata Sentuh mata pengetahuan! TouchListener adalah berdasarkan mendengar, manakala OnTouchEvent berdasarkan panggilan balik! Mari kita gunakan dua contoh mudah untuk mendalami Kefahaman semua orang!

1. TouchListener berdasarkan pendengaran

Contoh kod:

Perenderan pelaksanaan:

1.jpg

Kod pelaksanaan: main.xml

<RelativeLayout xmlns:android="http:// schemas .android.com/apk/res/android"
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:padding Bottom="@ dimen/activity_vertical_margin"
tools:context=".MyActivity">

<ImageView
android:layout_width="wrap_content"
android:layout_height="w rap_content"
android :id="@+id/imgtouch"
android:background="../style/images/touch"/>
</RelativeLayout>

MainAcitivity.java

kelas awam MyActivity melanjutkan ActionBarActivity {  
  
    peribadi Paparan Imej imgtouch;  
  
    @Override  
    dilindungi void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_my);  
  
        imgtouch = (ImageView)findViewById(R.id.imgtouch);  
imgtouch.setontouchListener (New View.onTouchListener () {
@Override
public boolean OnTouch (Lihat V, MotionEvent Event) {
Toast.MakeText (getApplicationContext (), "你 监听器 监听器 监听器 监听器 监听器 监听器 监听器:OnTouchListener摸了伦家~",Toast.LENGTH_LONG).show();  
                return true;  
            }  
                return true;  
            }  <🎜 >   });  
    }  
}
<🎜>

Analisis kod:

Ia hanyalah untuk menetapkan ImageView, kemudian setOnTouchListener, dan menulis semula kaedah onTouch, sebenarnya, ini sudah ada bahagian susun atur bingkai Terdapat contoh Adakah anda masih ingat gadis comel yang bergerak dengan jarinya?

Kaedah dan sifat berkaitan OnTouchListener:

onTouch(Lihat v, peristiwa MotionEvent): Parameter di sini ialah komponen yang mencetuskan peristiwa sentuhan ., acara acara sentuh Merangkumkan maklumat terperinci tentang peristiwa pencetus, termasuk jenis peristiwa, masa pencetus dan maklumat lain. Contohnya, event.getX(), event.getY()
Kita juga boleh menilai jenis tindakan sentuh dan menggunakan event.getAction() untuk menilai semula seperti:
event.getAction == MotionEvent. ACTION_DOWN: acara akhbar
event.getAction == MotionEvent.ACTION_MOVE: pindahkan acara
event.getAction == MotionEvent.ACTION_UP: pop- up acara


2 kaedah onTouchEvent() berasaskan panggilan balik

juga merupakan acara sentuh, tetapi onTouchEvent lebih kepada paparan tersuai, jadi Kaedah ini mempunyai telah ditindih dalam kelas paparan, dan peristiwa sentuh ini adalah berdasarkan panggilan balik, iaitu: jika nilai yang kami pulangkan adalah palsu, maka peristiwa itu akan terus merebak ke luar dan diproses oleh bekas atau Aktiviti luaran!Sudah tentu ia juga melibatkan gerak isyarat, yang akan kami terangkan secara terperinci kemudiannya onTouchEvent sebenarnya serupa dengan onTouchListener, kecuali mekanisme pemprosesan tidak digunakan adalah panggilan balik dan yang terakhir dalam mod mendengar!

Contoh kod: Tentukan pandangan mudah dan lukis bulatan biru kecil yang boleh bergerak dengan jari anda

Kod pelaksanaan:MyView .java

kelas awam MyView melanjutkan Paparan{  
    terapung awam X = 50;  
    terapung awam Y = 50;  
  
    //创建画笔   
    Cat cat = new Paint();  
  
    Pandangan Saya awam (Konteks konteks, Set Atribut set)  
    {  
        super(konteks, set);  
    }  
  
    @Override  
     public void onDraw(Kanvas kanvas) {  
        super.onDraw(kanvas);  
        paint.setColor(Color.BLUE);  
        canvas.drawCircle(X,Y,30,paint);  
    }  
  
    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        ini.X = event.get  
        ini.Y = event.getY();  
        //通知组件进行重绘  
        this.invalidate();  
        kembali benar;  
    }  
}

main.xml:

<RelativeLayout xmlns:android="http://schemas. android.com/apk/res/android"  
    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>

Penyampaian pelaksanaan:

2.jpg

Gunakan jari anda untuk menyentuh untuk bergerak~


3 .Berbilang sentuhan

Prinsip perkara:

Apa yang dipanggil berbilang sentuhan bermaksud berbilang jari yang beroperasi pada skrin yang paling biasa digunakan mungkin adalah fungsi zum, seperti Banyak pelayar imej menyokong zum! Secara teorinya, sistem Android itu sendiri boleh mengendalikan sentuhan sehingga 256 jari, sudah tentu, ini bergantung pada sokongan perkakasan telefon mudah alih bagaimanapun, telefon mudah alih yang menyokong multi-sentuh biasanya menyokong 2-4 mata, dan sudah tentu; ada yang mempunyai lebih! Kami mendapati bahawa MotionEvent digunakan dalam dua mata pertama, dan MotionEvent mewakili acara sentuh, kami boleh menilai jenis operasinya berdasarkan event.getAction() & MotionEvent.ACTION_MASK, sebagai tambahan kepada tiga yang diperkenalkan di atas Selain operasi satu titik, terdapat dua operasi khusus berbilang titik:

  • MotionEvent.ACTION_POINTER_DOWN: Apabila titik pada skrin sudah ditekan, tekan ia sekali lagi pada masa ini Dicetuskan pada titik lain.
  • MotionEvent.ACTION_POINTER_UP: Dicetuskan apabila berbilang titik pada skrin ditekan dan salah satu titik dilepaskan (iaitu, apabila titik bukan terakhir dilepaskan).

Proses mudah mungkin seperti ini:

  • Apabila kita menyentuh skrin dengan jari -> mencetuskan acara ACTION_DOWN
  • Kemudian jari lain turut menyentuh skrin——> Peristiwa ACTION_POINTER_DOWN dicetuskan . Jika jari terus keluar, teruskan Trigger
  • Apabila jari terakhir meninggalkan skrin——> Trigger ACTION_UP acara
  • Dan semasa keseluruhan proses, acara ACTION_MOVE akan dicetuskan secara berterusan
  • Kita boleh mendapatkan kedudukan titik sentuh yang berbeza melalui acara.
getX

(int) atau acara.getY(int): Sebagai contoh, event.getX(0) boleh mendapatkan koordinat X bagi titik hubungan pertama, event.getX(1) boleh mendapatkan koordinat X bagi titik hubungan kedua seperti ini... Di samping itu, kita juga boleh menentukan bilangan jari yang sedang disentuh dengan memanggil kaedah getPointerCount() objek MotionEvent~

Contoh kod:

Okay , Mari tulis contoh yang paling biasa untuk menyeret imej dengan satu jari dan mengezum imej dengan dua jari:

Perenderan pelaksanaan:

3.gifPelaksanaan Kod:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/ android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Paparan Imej
        android:        android <:id="🎜>+id android:layout_width="match_parent"
        android:layout_height="match_parent"
         android:scaleType="matrix"
          android:src="@drawable/g1;><🎜 ;/RelativeLayout>

MainActivity.java

pakej com.jay.example.edittextdemo;

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;

Aktiviti Utama Kelas Awam Memanjangkan Aktiviti IMPLEMECHLIISTENENER Img_test;

// Kawalan zum
Matriks Persendirian = Matriks baharu private Matrix savedMatrix = new Matrix();

// Perwakilan keadaan berbeza:
private statik int int NONE = 0;
private statik final int DRAG = 1;
private statik final int ZOOM = 2;
mod int peribadi = TIADA;

// Tentukan titik pertama yang ditekan, fokus dua titik sentuhan dan punca kemalangan Jarak antara dua jari yang menekan:
private PointF startPoint = new PointF();
private PointF midPoint = new PointF();
private float oriDis = 1f;

/*
* (bukan Javadoc)
* *
* @lihat android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState ) {
super. onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_test = (ImageView) this.findViewById(R.id.img_test);
im g_test.setOnTouchListener( this);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
suis (event.getAction () & MotionEvent.ACTION_MASK) {
// Jari tunggal
        kes MotionEvent.ACTION_DOWN:
            matriks.set(view.getImageMatrix());
            savedMatrix.set(matriks);
                                         start Point mod = jarak(acara);
            jika (oriDis > 10f) {
savedMatrix.set(matriks);
                midPoint = tengah(acara);
                mod = ZOOM;
                                                                                                                                                                                   // 手指放开
        kes MotionEvent.ACTION_UP:
        kes MotionEvent.ACTION_POINTER_UP:
             mod = TIADA;
            rehat;
                    mod = TIADA;
            rehat;
          /            /            /              /            /             /       kes MotionEvent.ACTION_MOVE:
             jika (mod == SERET) {
// 是一个手指拖动
                matriks.set(savedMatrix);
                matriks.postTranslate(event.getX. int. - , event.getX.int. - , mulakan Posisi 🎜>            } lain jika (mod == ZOOM) {
                 // 两个手指滑动
float newDist = jarak(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oriDis;
matrix.postScale(skala, skala, midPoint.x, midPoint.y);
                                                                                                                                                                                    < matriks 🎜>
// Kira jarak antara dua titik sentuh
jarak apungan persendirian (Acara MotionEvent) {
float x = event.getX(0) - event.getX( 1);
float y = event.getY(0) - event.getY(1);
return FloatMath .sqrt(x * x + y * y);
}

// Kira titik tengah dua titik sentuh
PointF tengah persendirian(Acara MotionEvent) {
apungan x = peristiwa. getX(0) + event.getX(1);
float y = event.getY (0) + event.getY(1);
kembalikan PointF(x / 2, y / 2) baharu);
}

}



Ringkasan bahagian ini:

Baiklah,
Itu sahaja untuk TouchListener
dan OnTouchEvent
dan pelbagai sentuhan~