進階篇-安卓系統:2.多點觸控的交互處理

1.android 觸摸事件偵聽

安卓的用戶交互方式包括兩種,一種是點擊交互,一種是觸摸交互。點擊交互就是手指按下抬起一個動作組。而觸摸交互分為按下(down),移動(move),抬起(up)。

觸摸事件偵聽代碼:輸出觸摸事件的三個動作:

我們用一個framlayout布局進行操作

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;public class MainActivity extends AppCompatActivity {private FrameLayout container;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE:System.out.println("action:move");break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}
}

注意:記得把onTouch方法的返回值改成true。

運行結果:

07-13 14:35:19.883 11720-11720/bhu.com.myapplication I/System.out: action:down
07-13 14:35:19.924 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.954 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.964 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.984 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.984 11720-11720/bhu.com.myapplication I/System.out: action:up

2.獲取觸摸的當前坐標

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;public class MainActivity extends AppCompatActivity {private FrameLayout container;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE:System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}
}

輸出結果:

07-13 14:39:50.442 11720-11720/bhu.com.myapplication I/System.out: (366.251312,682.000000)
07-13 14:39:50.452 11720-11720/bhu.com.myapplication I/System.out: (367.076874,682.000000)
07-13 14:39:50.472 11720-11720/bhu.com.myapplication I/System.out: (367.000000,680.500000)
07-13 14:39:50.482 11720-11720/bhu.com.myapplication I/System.out: (368.067780,681.000000)
07-13 14:39:50.512 11720-11720/bhu.com.myapplication I/System.out: (369.000000,681.000000)
07-13 14:39:50.532 11720-11720/bhu.com.myapplication I/System.out: (370.142609,681.000000)
07-13 14:39:50.542 11720-11720/bhu.com.myapplication I/System.out: (371.500000,681.000000)
07-13 14:39:50.582 11720-11720/bhu.com.myapplication I/System.out: (373.497681,681.000000)
07-13 14:39:50.592 11720-11720/bhu.com.myapplication I/System.out: (374.960114,681.000000)
07-13 14:39:50.612 11720-11720/bhu.com.myapplication I/System.out: (376.413116,681.000000)

3.實現拖動控件

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;public class MainActivity extends AppCompatActivity {private FrameLayout container;private ImageView imv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);imv = (ImageView) findViewById(R.id.imv);container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE://System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();lp.leftMargin = (int) motionEvent.getX();lp.topMargin = (int) motionEvent.getY();imv.setLayoutParams(lp);break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}
}

運行結果:

該圖片無法顯示!

4.獲取多個觸控點的坐標

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;public class MainActivity extends AppCompatActivity {private FrameLayout container;private ImageView imv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);imv = (ImageView) findViewById(R.id.imv);container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE://System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));System.out.println("pointers count:"+motionEvent.getPointerCount());  //get the number of pointers
System.out.println(String.format("point1:(%f,%f)  point2:(%f,%f)",motionEvent.getX(0),motionEvent.getY(0),motionEvent.getX(1),motionEvent.getY(1)));//when you put just one finger on the screen,there will be a exception,because there is not a getX(1).break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}

輸出結果:

07-13 14:54:52.855 5804-5804/bhu.com.myapplication I/System.out: point1:(245.296295,718.407410)  point2:(456.000000,389.000000)
07-13 14:54:52.865 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.865 5804-5804/bhu.com.myapplication I/System.out: point1:(244.000000,721.000000)  point2:(455.000000,392.000000)
07-13 14:54:52.885 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.885 5804-5804/bhu.com.myapplication I/System.out: point1:(242.387100,722.612915)  point2:(454.000000,394.000000)
07-13 14:54:52.895 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.905 5804-5804/bhu.com.myapplication I/System.out: point1:(242.000000,724.000000)  point2:(453.000000,396.000000)
07-13 14:54:52.915 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.915 5804-5804/bhu.com.myapplication I/System.out: point1:(241.000000,724.000000)  point2:(452.000000,397.000000)
07-13 14:54:52.935 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.935 5804-5804/bhu.com.myapplication I/System.out: point1:(241.000000,725.000000)  point2:(452.000000,397.000000)

5.根據手勢動作實現圖片的縮放(兩點觸控)<并且可以拖動>

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;public class MainActivity extends AppCompatActivity {private FrameLayout container;private ImageView imv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);container = (FrameLayout) findViewById(R.id.container);imv = (ImageView) findViewById(R.id.imv);container.setOnTouchListener(new View.OnTouchListener() {float cureentDistance;float lastDistance = -1; //the distance of two point can not be a minus,when the distance is -1 ,it means it's a initial value.
@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()) {case MotionEvent.ACTION_DOWN:System.out.println("action:down");break;case MotionEvent.ACTION_MOVE:if (motionEvent.getPointerCount() >= 2) {//there must be two finger on the screenfloat offsetX = motionEvent.getX(0) - motionEvent.getX(1);float offsetY = motionEvent.getY(1) - motionEvent.getY(1);cureentDistance = (float) Math.sqrt(offsetX * offsetX + offsetY * offsetY);if (lastDistance < 0) {lastDistance = cureentDistance;} else {if (cureentDistance - lastDistance > 5) {System.out.println("Zoom in");FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();lp.width = (int) (1.1f*imv.getWidth());lp.height = (int) (1.1f*imv.getHeight());imv.setLayoutParams(lp);lastDistance = cureentDistance;} else if (lastDistance - cureentDistance > 5) {System.out.println("Zoom out");FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();lp.width = (int) (0.9f*imv.getWidth());lp.height = (int) (0.9f*imv.getHeight());imv.setLayoutParams(lp);lastDistance = cureentDistance;}}}else{FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();lp.leftMargin = (int) (motionEvent.getX()-(imv.getWidth()/2));lp.topMargin = (int) (motionEvent.getY()-(imv.getHeight()/2));imv.setLayoutParams(lp);}break;case MotionEvent.ACTION_UP:System.out.println("action:up");break;}return true;   //remember to change this return to ture
            }});}}

?

轉載于:https://www.cnblogs.com/androidNot/p/5667051.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271372.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271372.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271372.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡:網絡設備知識筆記

網絡設備是實現計算機網絡實現用戶通信和交互信息的硬件基礎。常用的網絡設備有中繼器、網橋、路由器、集線器等。 1、網絡傳輸介質互聯設備 網絡線路和用戶節點具體銜接時&#xff0c;需要網絡傳輸介質的互聯設備。比如T型頭&#xff08;同軸電纜連接器&#xff09;、收發器、…

執行git命令時提示秘鑰權限太開放‘Permissions 0644 for ‘/Users/liuml/.ssh/id_rsa_tz‘ are too open.’

執行git命令時提示秘鑰權限太開放‘Permissions 0644 for /Users/liuml/.ssh/id_rsa_tz are too open.’ 報錯如下 這個問題是由于 權限的問題&#xff0c;需要文件設置權限&#xff1a; chmod 600 *

eclipse折疊if語句塊_Python學習日志01判斷 if 語句

1.條件判斷語句&#xff08;if語句&#xff09;在python中&#xff0c;if語句就是用來進行判斷的&#xff0c;語法如下&#xff1a;語法&#xff1a;If 條件表達式&#xff1a;代碼塊執行的流程&#xff1a;if語句在執行時&#xff0c;會先對條件表達式進行求值判斷&#xff1b…

mysql怎么可視化連接_IDEA連接MySQL可視化工具連接操作

IDEA連接MySQL可視化工具連接操作入下所示&#xff1a;填寫完成后&#xff0c;點擊測試連接&#xff0c;連接成功如圖所示點擊OK即可報告錯誤(如圖所示)&#xff1a;[08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. java.ne…

Windows下圖文詳解PHP三種運行方式(php_mod、cgi、fastcgi)

PHP能不能成功的在Apache服務器上運行&#xff0c;就看我們如何去配置PHP的運行方式。PHP運行目前為止主要有三種方式&#xff1a; a、以模塊加載的方式運行&#xff0c;初學者可能不容易理解&#xff0c;其實就是將PHP集成到Apache服務器&#xff0c;以同一個進程運行。 b、以…

計算機網絡基礎:ISO/OSI網絡體系結構知識筆記?

??作者主頁&#xff1a;IT技術分享社區 ??作者簡介&#xff1a;大家好,我是IT技術分享社區的博主&#xff0c;從事C#、Java開發九年&#xff0c;對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽&#xff1a; 數據庫領域優質創作者&#x1f3c6;&#x…

mac下安裝redis

官網地址&#xff1a;https://redis.io/ 二、下載完成后解壓安裝 解壓命令 tar zxvf redis-6.0.6.tar.gz 切換到redis目錄下 cd redis-6.0.6 編譯測試 sudo make test 編譯安裝 sudo make install sudo make test sudo make install

mysql having和where_淺談Mysql中where和having的區別

一、誤區&#xff1a;不要錯誤的認為having和group by 必須配合使用.二、where和having用法解析&#xff1a;1、 where和having都可以使用的場景&#xff1a;select goods_price,goods_name from goods where goods_price > 100select goods_price,goods_name from goods ha…

ds證據理論python實現_ALI模型理論以及Python實現

https://openreview.net/forum?idB1ElR4cgg模型結構和明天要發BiGAN模型一模一樣&#xff0c;但是兩篇論文的作者都是獨立完成自己的內容的。而且從寫作的風格來看emmm完全不一樣ALI跟BiGAN的設計一模一樣&#xff0c;但是就是沒有加Latent regressor。雖然在ALI中也簡要地談到…

IO操作總結

1&#xff0c;讀取文件將文件轉換為二進制流 1 InputStream in new FileInputStream("C:/test.png"); 2 byte[] photo new byte[in.available()]; 3 in.read(photo); 4 in.close(); View Code2&#xff0c;寫文件 1 Outpu…

計算機網絡基礎:網絡標準相關知識介紹

1、常見的制定網絡標準的機構 國際標準化組織、國際電信聯盟、電子工業協會、電氣和電子工程協會、因特網活動委員會 2、常見的網絡標準 2.1 電信標準 國際電信聯盟&#xff08;ITU&#xff09;1947年成為聯合國的一個組織&#xff0c;包括ITU-R、ITU-T、ITU-D組成。 ITU-R:無線…

Long類型轉為String類型

如果java返回給前端的字段有Long類型的&#xff0c;比如主鍵id&#xff0c;那么就要把這個Long類型轉為String類型才可以&#xff0c;不然前端拿到這個字段再傳回給你后端用的時候會導致精度缺失&#xff0c;也就是這個字段的值會改變&#xff0c;原因是java的Long類型是18位&a…

1-5Tomcat 目錄結構 和 web項目目錄結構

對應我的安裝路徑&#xff1a; web項目目錄結構 轉載于:https://www.cnblogs.com/huiziz/p/5671612.html

execjs執行js出現window對象未定義時的解決_10個常見的JS語言錯誤總匯

1、 Uncaught TypeError: Cannot Read Property這是 JavaScript 開發人員最常遇到的錯誤。當你讀取一個屬性或調用一個未定義對象的方法時&#xff0c;Chrome 中就會報出這樣的錯誤。導致這個錯誤發生的原因有很多&#xff0c;常見的一種情況是在渲染 UI 組件時&#xff0c;不正…

安卓logcat工具apk_backdoorapk 安卓APK后門捆綁腳本

項目地址https://github.com/dana-at-cp/backdoor-apk項目介紹backdoor-apk是一個bash寫的腳本&#xff0c;通過msfvenom生成一個android的payload&#xff0c;然后再使用apktools將payload捆綁到正常的apk文件中。使用方法rootkali:~/Android/evol-lab/BaiduBrowserRat# ./bac…

java8 supplier 接口

Supplier 接口 Supplier 接口是一個供給型的接口&#xff0c;其實&#xff0c;說白了就是一個容器&#xff0c;可以用來存儲數據&#xff0c;然后可以供其他方法使用的這么一個接口 *** Supplier接口測試&#xff0c;supplier相當一個容器或者變量&#xff0c;可以存儲值*/Tes…

mantis apache mysql_軟件測試(軟件安裝:php+mysql+apache+mantis過程遇到的問題以及解決方法)...

實驗環境&#xff1a; Windows 7 64位操作系統瀏覽器版本: Mozilla Firefox 41.0.0.5378一&#xff0e;PHP的安裝① 版本: php-5.4.45-Win32-VC9-x86安裝步驟&#xff1a;安裝將PHP安裝到 D:\PHP下(目錄可以自行更改)配置找到PHP目錄里的類似 php.ini-dist &#xff0c;…

c#程序中使用like“查詢access數據庫查詢為空的問題

今天&#xff0c;在開發的過程中發現了一個特別奇怪的問題&#xff1a;access中like查詢時候&#xff0c;在Access數據庫中執行&#xff0c;發現可以查詢出結果&#xff0c;這是在數據庫上執行&#xff0c;select * from KPProj where KpName like *測試*&#xff0c;但是同樣的…

html登錄界面_使用數據庫制作一套注冊登錄系統

經過了那么多個星期的學習&#xff0c;終于到了使用數據庫的階段了&#xff0c;最基本的也就是制作注冊登錄與數據庫連接。首先要制作一個注冊窗口先是html界面<效果如圖&#xff1a;&#xff08;樣子怎么樣不重要&#xff0c;重要的是測試&#xff09;這主要是將form數值發…

java8中Predicate用法

Predicate是個斷言式接口其參數是<T,boolean>&#xff0c;也就是給一個參數T&#xff0c;返回boolean類型的結果。跟Function一樣&#xff0c;Predicate的具體實現也是根據傳入的lambda表達式來決定的。 Testpublic void predicate(){/*** Predicate謂詞測試&#xff0c…