在android中无论是游戏还是应用上来说,现在多点触摸已经越来越普遍了,晚上就试着写了一下,下面来和大家分享一下。值得注意的是,在进行测试的时候需要用真机测试,因为模拟器不支持多点触摸。
源码下载地址:http://download.csdn.net/detail/liuyu973971883/9606172
效果图:
——————————————————————————————————————————————
首先我们先创建一个工程
涉及的新方法:
1、setOnTouchListener()为布局设置触摸监听;
2、RelativeLayout.LayoutParams类型,通过子View进行getLayoutParams()获取到,设置好参数后通过子View的setLayoutParams(RelativeLayout.LayoutParams类型)进行提交,这个方法主要是子View向父View提交自己的意愿;
3、getPointerCount()获取到当前有多少触摸点;
主布局文件的根为RelativeLayout布局,在里面添加一个ImageView即可,为根和ImageView都添加上ID,以便查找到。
——————————————————————————————————————————————
代码如下:
activity_main.xml:
<span style="font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/iv"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/ic_launcher"/>
</RelativeLayout></span>
MainActivity.java:
package com.oak.learnmultouch;
import android.os.Bundle;
import android.app.Activity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
public class MainActivity extends Activity {
private RelativeLayout root;//获取到根布局
private ImageView iv;//获取到放大缩小的图片
private int currentDistance;//当前距离
private int lastDistance = -1;//上一次距离
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取到RelativeLayout根布局
root = (RelativeLayout) findViewById(R.id.relativeLayout);
//获取到图片
iv = (ImageView) findViewById(R.id.iv);
//为根布局设置触摸监听
root.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
//当手指按下的时候
case MotionEvent.ACTION_DOWN:
System.out.println("action_down");
break;
//当手指移动的时候
case MotionEvent.ACTION_MOVE:
//记录两点之间x和y之间的距离,然后通过勾股定理得出两点距离
float xLength,yLength;
//判断如果触摸点大于等于2则表示需要放大缩小图片
if (event.getPointerCount() >= 2) {
//获取到两点x坐标之间的值
xLength = event.getX(0) - event.getX(1);
//获取到两点y坐标之间的值
yLength = event.getY(0) - event.getY(1);
//通过勾股定理得出两点之间的值
currentDistance = (int) Math.sqrt(xLength * xLength
+ yLength * yLength);
//因为我们上一次距离变量初始化为-1,如果<0,则表示第一次进行放大缩小
if (lastDistance < 0) {
//记录这个两点之间的距离
lastDistance = currentDistance;
} else {
//如果当前距离比上一次距离大5个像素就进行放大操作
if (currentDistance - lastDistance > 5) {
// 放大
//获取到子View向父View提交意愿的类
RelativeLayout.LayoutParams lp = (LayoutParams) iv
.getLayoutParams();
//设置其宽度,每次*1.1放大
lp.width = (int) (iv.getWidth() * 1.1);
//设置其高度,每次*1.1放大
lp.height = (int) (iv.getHeight() * 1.1);
//子View提交意愿
iv.setLayoutParams(lp);
//放大后将当前距离复制为上一次距离
lastDistance = currentDistance;
//如果当前距离比上一次距离小5个像素就进行缩小操作
} else if (lastDistance - currentDistance > 5) {
// 缩小
//这里因为是缩小,图片宽度最小缩小到20像素,以免缩为1像素后不可进行放大
if (iv.getWidth() > 20) {
//获取到子View向父View提交意愿的类
RelativeLayout.LayoutParams lp = (LayoutParams) iv
.getLayoutParams();
//设置其宽度,每次*0.9缩小
lp.width = (int) (iv.getWidth() * 0.9);
//设置其高度,每次*0.9缩小
lp.height = (int) (iv.getHeight() * 0.9);
//子View提交意愿
iv.setLayoutParams(lp);
//缩小后将当期距离复制为上一次距离
lastDistance = currentDistance;
}
}
}
}
break;
case MotionEvent.ACTION_UP:
//手指抬起触发
System.out.println("action_up");
break;
}
return true;
}
});
}
}
多触点之图片放大缩小到这里教程就结束了,有不懂的可以留言哦,我会第一时间回复你的。
By:Brycen Liu