標籤:
代碼
代碼一:自訂支援多點觸摸的TextView
http://download.csdn.net/detail/zhiyuan0932/9513852
什麼是多點觸摸
允許電腦使用者同時通過多個手指來控製圖形介面的一種技術
多點觸摸的應用情境
- 對圖片、文字、網頁進行放大或者縮小
- 多手指手勢操作自訂控制項和布局
觸摸事件的重要方法
event.getActionMasked(); 擷取事件類型
在只使用單手指操作的時候,這個方法我們一般使用的是event.getAction(),來擷取事件類型,但是對於多個手指,我們使用event.getActionMasked()或者event.getAction() & MotionEvent.ACTION_MASK 來擷取支援多個手指觸摸的事件類型。
MotionEvent.ACTION_POINTER_DOWN 手指按下事件
這個方法可以擷取到多個手指按下的狀態
MotionEvent.ACTION_POINTER_UP 手指抬起事件
這個方法可以擷取到多個手指抬起的狀態
MotionEvent.ACTION_MOVE 手指移動事件
event.getPointerCount() 擷取手指個數
這個方法是擷取當前手指的個數
案例一:通過兩指觸摸實現字型縮放
<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" > <com.example.scaletextview.ZoomTextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:gravity="center" android:text="@string/hello_world" android:textSize="30sp" /></RelativeLayout>
package com.example.scaletextview;import android.content.Context;import android.util.AttributeSet;import android.util.FloatMath;import android.util.Log;import android.view.MotionEvent;import android.widget.TextView;public class ZoomTextView extends TextView { private static final String TAG = "ZoomTextView"; private float textSize; private int mode; private float oldDist; public ZoomTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ZoomTextView(Context context, AttributeSet attrs) { super(context, attrs); } public ZoomTextView(Context context) { super(context); } /** * 處理TextView的觸摸事件 */ @Override public boolean onTouchEvent(MotionEvent event) { //在一開始,計算當前字型的大小 if (textSize == 0) { textSize = this.getTextSize(); } // 擷取觸摸事件的類型,如果是單點是event.getAction(),當涉及到多點觸控時,就使用getActionMasked來擷取觸摸事件類型 switch (event.getActionMasked()) { case MotionEvent.ACTION_POINTER_DOWN: // 當手指按下的時候,就去擷取當前手指的間距 oldDist = spacing(event); break; case MotionEvent.ACTION_MOVE: // 擷取當前觸摸點的個數 if (event.getPointerCount() >= 2) { // 如果觸摸點>=2 擷取當前兩個手指的距離,然後進行縮放 float newDist = spacing(event); zoom(newDist / oldDist); //重新置位 oldDist = newDist; } break; } return true; } /** * 不斷進行縮放 * * @param f */ private void zoom(float f) { textSize *= f; this.setTextSize(px2sp(getContext(), textSize)); } /** * 將px值轉換為sp值,保證文字大小不變 * * @param pxValue * @param fontScale * (DisplayMetrics類中屬性scaledDensity) * @return */ public static int px2sp(Context context, float pxValue) { float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } /** * 計算兩個手指的大小 * * @param event * @return */ private float spacing(MotionEvent event) { //擷取第一個點的x座標和第二個點的x座標 float x = event.getX(0) - event.getX(1); //分別擷取y座標 float y = event.getY(0) - event.getY(1); //使用勾股定理計算兩點距離 return FloatMath.sqrt(x * x + y * y); }}
Android中的多點觸摸