CustomView(自定義視圖) 、 畫布、顏色及多點觸控 靜宜大學資管系 楊子青

Slides:



Advertisements
Similar presentations
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
Advertisements

JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
项目6 通用堆栈.
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖.
2015/Spring 跨平台行動程式進階應用 王派洲老師
第二章 JAVA语言基础.
類別與物件 Class & Object.
ArrayAdapter & Spinner
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
實驗四:單位轉換程式.
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
實驗十三:顯示目前經緯度位置.
Ch06 再談選單元件 物件導向系統實務.
使用Android控制Arduino 史先强
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
Working with Databases (II) 靜宜大學資管系 楊子青
本單元介紹何謂變數,及說明變數的宣告方式。
Chapter 6 進階UI設計.
第9章 使用意圖啟動活動與內建應用程式 9-1 意圖的基礎 9-2 使用意圖啟動活動
程式設計實作.
CH7 佈局、按鈕與文字編輯元件.
Android + Service 建國科技大學 資管系 饒瑞佶.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
實驗十四:顯示與控制地圖.
辅导课程十三.
第6章 建立Android使用介面 6-1 介面元件的基礎 6-2 Android的事件處理 6-3 按鈕元件 6-4 文字元件
Android App簡介及 App Inventor 2體驗 靜宜大學資管系 楊子青
Android 專案建立、編譯與執行.
平面繪圖與動畫.
第一單元 建立java 程式.
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
App Inventor 2初體驗 靜宜大學資管系 楊子青
Chapter 5 Basic UI Design.
實驗九:延續實驗八, 製作一個完整音樂播放器
Location Based Services - LBS
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
補間動畫 (Tween Animation) 靜宜大學資管系 楊子青
GridView.
HelloPurr_Extend 靜宜大學資管系 楊子青
第二章 Java语法基础.
螢幕觸控及手勢辨別 靜宜大學資管系 楊子青.
Video 影像 (VideoPlayer 影像播放器、Camcorder 錄影機) 靜宜大學資管系 楊子青
Review 1~3.
從HTML表格到CSS 靜宜大學 資管系 楊子青.
第二章 Java基本语法 讲师:复凡.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
RecyclerView and CardView
反覆迴圈、陣列、副程式 靜宜大學資管系 楊子青
反覆迴圈、陣列、副程式 靜宜大學資管系 楊子青
實驗十:影片播放.
打Mole不打Ladybug (IV): 讓使用者控制Ladybug移動 靜宜大學資管系 楊子青
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
第2章 Java语言基础.
讀取網路資料及JSON開放資料 靜宜大學資管系 楊子青
加速感測器 靜宜大學資管系 楊子青.
NFC (近場通訊, Near Field Communication) 靜宜大學資管系 楊子青
SQLite資料庫 靜宜大學資管系 楊子青.
第二章 Java基本语法 讲师:复凡.
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
变量定位图形 Java中数据的类型分为四种:基本数据类型、数组类型、类类型以及接口类型。任何常量和变量都一定是上述四种数据类型中的一种。简单数据类型的实例化有两种:变量和常量。 变量名和常量名必须是Java语言中合法的标识符。 常量是在程序运行期间值不改变的量。 变量是在程序运行期间值可通过赋值改变的量,
Presentation transcript:

CustomView(自定義視圖) 、 畫布、顏色及多點觸控 靜宜大學資管系 楊子青

1. 觸控專案:CustomView 用程式方式自行定義螢幕畫面 (自訂SingleFingerView)

針對SingleFingerView新增constructor

SingleFingerView.java程式碼 public class SingleFingerView extends View { Paint paint = new Paint(); float xPos = 200; float yPos = 200; public SingleFingerView(Context context) { super(context); paint.setColor(Color.YELLOW); } public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.drawColor(Color.LTGRAY); canvas.drawCircle(xPos, yPos, 80, paint); 說明: 淺灰色背景之畫布 使用黃色畫筆 於(200,200)位置 畫一個半徑80的圓形

MainActivity.java程式碼 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); setContentView(new SingleFingerView(this)); } 執行結果:

畫出文字內容 說明: onDraw方法中,加入以下程式碼: 使用藍色畫筆,50像素 避免鋸齒狀 以(50,200)為軸心,-10度角 畫出文字之內容 onDraw方法中,加入以下程式碼: paint.setColor(Color.BLUE); paint.setTextSize(50); paint.setAntiAlias(true); canvas.rotate(-10,50,200); canvas.drawText("觸控螢幕,圓形呈現不同顏色!", 50,200,paint); 執行結果:

畫出資源圖形 先在drowable資料夾中,放入圖檔(例如靜宜校徽 logo.jpg) onDraw方法中,加入以下程式碼: Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.logo); canvas.drawBitmap(bitmap, 500,600, paint); 說明: 於(500,600) 畫出圖片 執行結果:

手勢辨別 public class SingleFingerView extends View implements GestureDetector.OnGestureListener{ Paint paint = new Paint(); float xPos = 200; float yPos = 200; GestureDetector gd; public SingleFingerView(Context context) { super(context); paint.setColor(Color.YELLOW); gd = new GestureDetector(context, this); }

處理觸控事件 public boolean onTouchEvent (MotionEvent event) { gd.onTouchEvent(event); return true; } public boolean onDown(MotionEvent e) { paint.setColor(Color.YELLOW); xPos = e.getX(); yPos = e.getY(); invalidate(); return false; public void onShowPress(MotionEvent e) {

處理觸控事件 public boolean onSingleTapUp(MotionEvent e) { paint.setColor(Color.MAGENTA); xPos = e.getX(); yPos = e.getY(); invalidate(); return false; } @Override public void onLongPress(MotionEvent e) { paint.setColor(Color.BLACK);

處理觸控事件 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { paint.setColor(Color.RED); xPos = e2.getX(); yPos = e2.getY(); invalidate(); return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { paint.setColor(Color.GREEN);

2. 多點觸控 新增自訂MultiFingersView 新增同名的constructor、新增onDraw方法 public class MultiFingersView extends View { Paint paint = new Paint(); public MultiFingersView(Context context) { super(context); } public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.drawColor(Color.LTGRAY); paint.setColor(Color.BLUE); paint.setTextSize(50); paint.setAntiAlias(true); canvas.drawText("多指觸控,依序呈現彩虹顏色!", 50,200,paint);

修改MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); //setContentView(new SingleFingerView(this)); setContentView(new MultiFingersView(this)); } 執行結果:

MultiFingersView.java屬性宣告 宣告以下三個屬性,分別記錄按下之手指數及X與Y座標 int Count = 0; float[] xPos = new float[20]; float[] yPos = new float[20];

多點觸控 event.getAction() //獲取觸控動作,例如ACTION_DOWN event.getPointerCount(); //獲取觸控點的數量,例如2是兩個手指同時按壓屏幕 event.getPointerId(nID); //對於每個觸控的點的細節,可以藉由一個循環執行getPointerId方法獲取索引 event.getX(nID); //獲取第nID個觸控點的x位置 event.getY(nID); //獲取第nID個點觸控的y位置 event.getPressure(nID); //LCD可以感應出用戶的手指壓力,具體的級別由驅動和物理硬件決定的

MultiFingersView.java處理觸控 撰寫onTouchEvent方法 public boolean onTouchEvent (MotionEvent event) { Count = event.getPointerCount(); for (int i = 0; i < Count; i++) { xPos[i] = event.getX(i); yPos[i] = event.getY(i); } invalidate(); return true;

MultiFingersView.java觸控時畫圓 擴充onDraw方法 public void onDraw(Canvas canvas){ … for (int i=0; i<Count; i++){ paint.setColor(Color.YELLOW); canvas.drawCircle(xPos[i], yPos[i], 80, paint); } 執行結果:

自行定義colors.xml資源檔 Android 中xml 內的顏色對照表 http://blog.xuite.net/saso0704/wretch/203137609-Android+%E4%B8%ADxml+%E5%85%A7%E7%9A%84%E9%A1%8F%E8%89%B2%E5%B0%8D%E7%85%A7%E8%A1%A8

於colors.xml定義顏色及陣列 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#008577</color> <color name="colorPrimaryDark">#00574B</color> <color name="colorAccent">#D81B60</color> <color name="red">#FF0000</color><!--紅色 --> <color name="orange">#FFA500</color><!--橙色 --> <color name="yellow">#FFFF00</color><!--黃色 --> <color name="green">#008000</color><!--綠色 --> <color name="blue">#0000FF</color><!--藍色 --> <color name="indigo">#4B0082</color><!--靛青色 --> <color name="purple">#800080</color><!--紫色 --> <array name="rainbow"> <item>@color/red</item> <item>@color/orange</item> <item>@color/yellow</item> <item>@color/green</item> <item>@color/blue</item> <item>@color/indigo</item> <item>@color/purple</item> </array> </resources>

修改MultiFingersView.java讀取顏色 public class MultiFingersView extends View{ Paint paint = new Paint(); int Count = 0; float[] xPos = new float[20]; float[] yPos = new float[20]; int[] rainbow; public SingleFingerView(Context context) { super(context); rainbow = context.getResources().getIntArray(R.array.rainbow); }

修改MultiFingersView.java設定顏色 public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.drawColor(Color.LTGRAY); paint.setColor(Color.BLUE); paint.setTextSize(50); paint.setAntiAlias(true); canvas.drawText("多指觸控,依序呈現彩虹顏色!", 50,200,paint); for (int i=0; i<Count; i++){ //paint.setColor(Color.YELLOW); paint.setColor(rainbow[i % 7]); canvas.drawCircle(xPos[i], yPos[i], 80, paint); } 執行結果:

後續自行探索 Handling single and multi touch on Android – Tutorial http://www.vogella.com/tutorials/AndroidTouch/article.html This pointer index can change over time, e.g. if one finger is lifted from the device. The stable version of a pointer is the pointer id, which can be determined with the getPointerId(pointerIndex) method from the MotionEvent object. public boolean onTouchEvent(MotionEvent event) { // get pointer index from the event object int pointerIndex = event.getActionIndex(); // get pointer ID int pointerId = event.getPointerId(pointerIndex); // get masked (not specific to a pointer) action int maskedAction = event.getActionMasked(); switch (maskedAction) { … Tutorial: ScaleGestureDetector