螢幕觸控及手勢辨別 靜宜大學資管系 楊子青.

Slides:



Advertisements
Similar presentations
Android ADT + Android SDK Eclipse Eclipse 編輯器 JAVA JAVA 開發工具.
Advertisements

JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖.
第 5 章 流程控制 (一): 條件分支.
第二章 JAVA语言基础.
ArrayAdapter & Spinner
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
實驗四:單位轉換程式.
第2章 建立Android應用程式 2-1 Java語言、XML文件與Android 2-2 建立第一個Android應用程式
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
實驗十三:顯示目前經緯度位置.
Ch06 再談選單元件 物件導向系統實務.
使用Android控制Arduino 史先强
C++Primer 3rd edition 中文版 Chap 5
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
Android介面設計 Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
Working with Databases (II) 靜宜大學資管系 楊子青
Chapter 6 進階UI設計.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
CH7 佈局、按鈕與文字編輯元件.
Android + Service 建國科技大學 資管系 饒瑞佶.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
實驗十四:顯示與控制地圖.
第6章 建立Android使用介面 6-1 介面元件的基礎 6-2 Android的事件處理 6-3 按鈕元件 6-4 文字元件
Android 專案建立、編譯與執行.
第一單元 建立java 程式.
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
Chapter 5 Basic UI Design.
實驗九:延續實驗八, 製作一個完整音樂播放器
Location Based Services - LBS
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
補間動畫 (Tween Animation) 靜宜大學資管系 楊子青
事件處理 靜宜大學資管系 楊子青.
第二章 Java基本语法 讲师:复凡.
HelloPurr_Extend 靜宜大學資管系 楊子青
第二章 Java语法基础.
CustomView(自定義視圖) 、 畫布、顏色及多點觸控 靜宜大學資管系 楊子青
Video 影像 (VideoPlayer 影像播放器、Camcorder 錄影機) 靜宜大學資管系 楊子青
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
RecyclerView and CardView
反覆迴圈、陣列、副程式 靜宜大學資管系 楊子青
反覆迴圈、陣列、副程式 靜宜大學資管系 楊子青
實驗十:影片播放.
硬幣遊戲解題詳解 王豐緒 銘傳大學資訊工程學系.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
Android Speech To Text(STT)
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
第2章 Java语言基础.
讀取網路資料及JSON開放資料 靜宜大學資管系 楊子青
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
加速感測器 靜宜大學資管系 楊子青.
SQLite資料庫 靜宜大學資管系 楊子青.
控制UI界面 本讲大纲: 1、使用XML布局文件控制UI界面 2、在代码中控制UI界面 3、使用XML和Java代码混合控制UI界面
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Presentation transcript:

螢幕觸控及手勢辨別 靜宜大學資管系 楊子青

專案:PU 選擇Empty Activity drawable資源,放入pu0~pu3圖檔 版面配置:改為LinearLayout (方向vertical) TextView:id為@+id/txv,text靜宜之美,24sp ImageView:id為@+id/img,圖檔選擇Project下的pu0

1. View與ViewGroup View ViewGroup 具體可見的視覺元件,如TextView、EditText、 Button等,其內不能再置入其他的元件 ViewGroup 不可見的容器元件,如Layout,用來設定容器內的View和ViewGroup的排列規則

public class View extends Object java.lang.Object ↳ android.view.View https://developer.android.com/reference/android/view/View.html extends Object java.lang.Object ↳ android.view.View A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for widgets, which are used to create interactive UI components .

public abstract class ViewGroup https://developer.android.com/reference/android/view/ViewGroup extends View java.lang.Object ↳ android.view.View ↳android.view.ViewGroup the base class for layouts, which are invisible containers that hold other Views (or other ViewGroups).

onTouchEvent Implement this method to handle touch screen motion events. boolean onTouchEvent (MotionEvent event)

程式碼 public class MainActivity extends AppCompatActivity { TextView txv; ImageView img; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txv = (TextView) findViewById(R.id.txv); img = (ImageView) findViewById(R.id.img); }

程式碼 public boolean onTouchEvent (MotionEvent event){ txv.setText("onTouchEvent"); return true; } Touch螢幕 (文字,圖片 或空白處 都可以) 模擬測試看看

2. public class GestureDetector https://developer.android.com/reference/android/view/GestureDetector.html extends Object java.lang.Object ↳ android.view.GestureDetector Detects various gestures and events using the supplied MotionEvents. In the onTouchEvent(MotionEvent) method ensure you call onTouchEvent(MotionEvent). The methods defined in your callback will be executed when the events occur.

GestureDetector.OnGestureListener 需實做的方法 (可運用的手勢) https://developer.android.com/reference/android/view/GestureDetector.OnGestureListener.html boolean onDown(MotionEvent e): 每次點擊時發生(發生時機相當於ACTION_DOWN) boolean onSingleTapUp(MotionEvent e): 單擊放開且短時間時發生 void onShowPress(MotionEvent e): 使用者點擊後,停留較長一點時間,沒有滑動也還沒放開時發生 void onLongPress(MotionEvent e): 點擊並且停留長時間時發生 boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY): 當滑動時會持續發生 boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY): 當滑動了一段距離後,放開時發生的事件

建立手勢偵測步驟 1.建立自己的手勢類別並繼承類別GestureDetector.OnGestureListener 3.幫你要偵測手勢的View元件加入onTouchEvent()或onTouch()方法。 4.在onTouchEvent()或onTouch()內呼叫GestureDetector.onTouchEvent()方法,並傳入系統傳來的MotionEvent物件。 在onTouchEvent()或onTouch()方法內必須回傳true,否則部分手勢將無法被偵測到。

程式碼 (Step 1) public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { TextView txv; ImageView img; GestureDetector gd;

程式碼 (Step 2) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txv = (TextView) findViewById(R.id.txv); img = (ImageView) findViewById(R.id.img); gd = new GestureDetector(this, this); } Listener(目前的監聽事件) Context(目前的應用系統)

程式碼 (Step 3) public boolean onTouchEvent (MotionEvent event){ //txv.setText("onTouchEvent"); gd.onTouchEvent(event); return true; }

程式碼 (Step 4-1) @Override public boolean onDown(MotionEvent e) { txv.setText("觸控螢幕開始"); return false; } public void onShowPress(MotionEvent e) { txv.setText("觸控後無後續動作");

程式碼 (Step 4-2) @Override public boolean onSingleTapUp(MotionEvent e) { txv.setText("短按螢幕"); return false; } public void onLongPress(MotionEvent e) { txv.setText("長按螢幕");

程式碼 (Step 4-3) @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { txv.setText("持續移動\nx1y1:" + String.valueOf(e1.getX()) + ", " + String.valueOf(e1.getY()) + "\nx2y2:" + String.valueOf(e2.getX()) + "," + String.valueOf(e2.getY())); return false; }

程式碼 (Step 4-4) @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { txv.setText("快速滑動\nx1y1:" + String.valueOf(e1.getX()) + "," + String.valueOf(e1.getY()) + "\nx2y2:" + String.valueOf(e2.getX()) + "," + String.valueOf(e2.getY()) + "\nX軸Y軸速度:" + String.valueOf(velocityX) + "," + String.valueOf(velocityY)); return false; } 模擬測試看看

3. 針對特定元件進行觸控 前面的作法是利用View的onTouchEvent (全螢幕中的所有元件都可以觸控) 若要指定特定元件(如圖片)才能進行觸控,步驟如下: 實做OnTouchListener監聽事件 登錄元件進行監聽 撰寫onTouch方法

程式碼 (Step 1) public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener, View.OnTouchListener { TextView txv; ImageView img; GestureDetector gd;

程式碼 (Step 2) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txv = (TextView) findViewById(R.id.txv); img = (ImageView) findViewById(R.id.img); img.setOnTouchListener(this); gd = new GestureDetector(this, this); }

程式碼 (Step 3) /* public boolean onTouchEvent (MotionEvent event){ gd.onTouchEvent(event); return true; } */ @Override public boolean onTouch(View v, MotionEvent event) {

僅保留短按、長按、滑動 模擬測試看看 @Override public boolean onDown(MotionEvent e) { //txv.setText("觸控螢幕開始"); return false; } public void onShowPress(MotionEvent e) { //txv.setText("觸控後無後續動作"); public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //txv.setText("持續移動\nx1y1:" + String.valueOf(e1.getX()) + "," + String.valueOf(e1.getY()) // + "\nx2y2:" + String.valueOf(e2.getX()) + "," + String.valueOf(e2.getY())); 模擬測試看看

4.利用短按、長按、滑動,切換圖片 public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener, View.OnTouchListener { TextView txv; ImageView img; GestureDetector gd; int PictureNo, TotalPictures; //目前顯示第幾張圖,以及總共幾張圖片

設定變數初值 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txv = (TextView) findViewById(R.id.txv); img = (ImageView) findViewById(R.id.img); img.setOnTouchListener(this); gd = new GestureDetector(this, this); PictureNo = 0; TotalPictures = 4; }

短按,切換到首張圖片 @Override public boolean onSingleTapUp(MotionEvent e) { //txv.setText("短按螢幕"); PictureNo = 0; img.setImageResource(R.drawable.pu0); return false; }

長按,切換到末張圖片 @Override public void onLongPress(MotionEvent e) { //txv.setText("長按螢幕"); PictureNo = TotalPictures - 1; img.setImageResource(R.drawable.pu3); }

長按,切換到末張圖片 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e1.getX()<e2.getX()){ //向右滑動 PictureNo++; if (PictureNo==TotalPictures){ PictureNo = 0; } } else{ //向左滑動 PictureNo--; if (PictureNo<0){ PictureNo = TotalPictures-1; } txv.setText(String.valueOf(PictureNo)); return false; 模擬測試看看

5.根據PictureNo顯示照片 public void ShowPicture(){ switch (PictureNo){ case 0: { img.setImageResource(R.drawable.pu0); break;} case 1: { img.setImageResource(R.drawable.pu1); break;} case 2: { img.setImageResource(R.drawable.pu2); break;} case 3: { img.setImageResource(R.drawable.pu3); break;} }

改為呼叫ShowPicture (左右滑動) @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e1.getX()<e2.getX()){ //向右滑動 PictureNo++; if (PictureNo==TotalPictures){ PictureNo = 0; } } else{ //向左滑動 PictureNo--; if (PictureNo<0){ PictureNo = TotalPictures-1; } txv.setText(String.valueOf(PictureNo)); ShowPicture(); return false;

改為呼叫ShowPicture (短按) @Override public boolean onSingleTapUp(MotionEvent e) { //txv.setText("短按螢幕"); PictureNo = 0; txv.setText(String.valueOf(PictureNo)); ShowPicture(); //img.setImageResource(R.drawable.pu0); return false; }

改為呼叫ShowPicture (長按) @Override public void onLongPress(MotionEvent e) { //txv.setText("長按螢幕"); PictureNo = TotalPictures - 1; txv.setText(String.valueOf(PictureNo)); ShowPicture(); //img.setImageResource(R.drawable.pu3); }

6.動態取得資源識別 public void ShowPicture(){ /* switch (PictureNo){ case 0: { img.setImageResource(R.drawable.pu0); break;} case 1: { img.setImageResource(R.drawable.pu1); break;} case 2: { img.setImageResource(R.drawable.pu2); break;} case 3: { img.setImageResource(R.drawable.pu3); break;} } */ int res = getResources().getIdentifier("pu" + (PictureNo), "drawable", getPackageName()); img.setImageResource(res); 模擬測試看看

7.動態取得資源個數 (圖檔數) @Override protected void onCreate(Bundle savedInstanceState) { … PictureNo = 0; //TotalPictures = 4; int res = -1; int countDrawables = -1; while (res != 0) { countDrawables++; res = getResources().getIdentifier("pu" + (countDrawables), "drawable", getPackageName()); } TotalPictures = countDrawables; *將drawable資料夾的最後一張pu3改為p3, 模擬測試看看 *加入更多圖檔,命名pu3, pu4…模擬測試看看