Android入門之onTouchEvent觸碰事件的示例詳解
簡介
平時包括之前的例子大量是基于TouchListener如:onClick這種一類的事件。
今天給大家?guī)淼氖荰ouchListener與OnTouchEvent的比較,以及多點觸碰的知識點! TouchListener是基于監(jiān)聽的,而OnTouchEvent則是基于回調(diào)的!
因此我們通過一個小例子,來擅述同樣是觸碰事件的ouTouchEvent是什么樣的。
onTouchEvent應(yīng)用場景
onTouchEvent更多的是用于自定義的view,所有的view類中都重寫了該方法,而這種觸摸事件是基于回調(diào)的,也就是說:如果我們返回的值是false的話,那么事件會繼續(xù)向外傳播,由外面的容器或者Activity進行處理!當(dāng)然還涉及到了手勢(Gesture),這個我們會在后面進行詳細的講解!onTouchEvent其實和onTouchListener是類似的,只是處理機制不用,前者是回調(diào),后者是監(jiān)聽模式!
樣例說明
代碼示例: 定義一個簡單的view,繪制一個藍色的小圓,可以跟隨手指進行移動
實現(xiàn)代碼: CircleView.java。
全代碼
前端
CircleView.java
對,你沒看錯!
這個不是.xml文件。它長下面這個樣
package org.mk.android.demo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class CircleView extends View { public float X = 50; public float Y = 50; //創(chuàng)建畫筆 Paint paint = new Paint(); public CircleView(Context context, AttributeSet set) { super(context,set); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setColor(Color.RED); canvas.drawCircle(X,Y,50,paint); } @Override public boolean onTouchEvent(MotionEvent event) { this.X = event.getX(); this.Y = event.getY(); //通知組件進行重繪 this.invalidate(); return true; } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <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=".MainActivity"> <org.mk.android.demo.CircleView android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
我們把這個java在activity_main.xml文件中如上這樣引用。此時設(shè)計器已經(jīng)顯示出來效果了。
后端
package org.mk.android.demo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
哈哈哈,是一個光板。
因為所有的邏輯、觸碰事件都已經(jīng)在CircleView.java里實現(xiàn)了。
運行起來后,你的界面上就會有一個小紅圓圈,請你用鼠標(biāo)拖著這個小紅圓圈不要放到處拖,這個小紅圓圈也會跟隨著你的鼠標(biāo)到處亂跑。
自己請動一下手試試看吧。
后續(xù)
對于單指、雙指縮放等手勢,其實也很簡單,就是我們的onTouchEvent(MotionEvent event)里的這個MotionEvent,它還有額外幾個事件
- MotionEvent.ACTION_POINTER_DOWN:當(dāng)屏幕上已經(jīng)有一個點被按住,此時再按下其他點時觸發(fā)。
- MotionEvent.ACTION_POINTER_UP:當(dāng)屏幕上有多個點被按住,松開其中一個點時觸發(fā)(即非最后一個點被放開時)。
因此我留下一個回家作業(yè),即:在Android上實現(xiàn)以下這兩個功能讓大家去自己試試
- 單指點擊一個圖片拖動;
- 雙指對著一個圖片進行“縮放”,便得相應(yīng)的圖片的大小也跟著你的雙指的縮放作“伸縮”;
真心很簡單,提示:提供以下原理性代碼供你去實現(xiàn)這個小作業(yè)。
switch (event.getAction() & MotionEvent.ACTION_MASK) { // 單指 case MotionEvent.ACTION_DOWN: break; // 雙指 case MotionEvent.ACTION_POINTER_DOWN:
到此這篇關(guān)于Android入門之onTouchEvent觸碰事件的示例詳解的文章就介紹到這了,更多相關(guān)Android onTouchEvent觸碰事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 中ListView和GridView賦值錯位
這篇文章主要介紹了Android 中ListView和GridView賦值錯位的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10Android自定義recyclerView實現(xiàn)時光軸效果
這篇文章主要介紹了Android自定義recyclerView實現(xiàn)時光軸效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Android 自定義View實現(xiàn)芝麻分曲線圖效果
這篇文章主要介紹了Android 自定義View實現(xiàn)芝麻分曲線圖效果的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-11-11Android UI設(shè)計系列之自定義TextView屬性實現(xiàn)帶下劃線的文本框(4)
這篇文章主要介紹了Android UI設(shè)計系列之自定義TextView屬性實現(xiàn)帶下劃線的文本框,具有一定的實用性和參考價值,感興趣的小伙伴們可以參考一下2016-06-06Android-Service實現(xiàn)手機壁紙自動更換
這篇文章主要為大家詳細介紹了Android-Service實現(xiàn)手機壁紙自動更換,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11Android自定義ScrollView實現(xiàn)放大回彈效果
這篇文章主要為大家詳細介紹了Android自定義ScrollView實現(xiàn)放大回彈效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05