代码下载地址
代码一:自定义支持多点触摸的TextView
什么是多点触摸
允许计算机用户同时通过多个手指来控制图形界面的一种技术
多点触摸的应用场景
- 对图片、文字、网页进行放大或者缩小
- 多手指手势操作自定义控件和布局
触摸事件的重要方法
- 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>
- 贴出自定义支持多点触控的TextView代码
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);
}
}
时间: 2024-10-27 04:53:09