多点触控,就是在onTouch 中 event.getPointerCount() 得到按在屏幕上的手指数
第一次做多点触控,就写了个图片的例子,一个手指时移动图片,两个手指时缩放图片
还存在些小问题,譬如两个手指移动时必需一起离开,否则会进入到一个手指的move状态中,图片会瞬移到某个地方。
操作缩放用的是FrameLayout.LayoutParams 。 现贴上代码,本人新手,欢迎指教
package test_multi_point;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;
import com.example.test_multi_point.R;
public class MainActivity extends Activity implements OnTouchListener{
//imageView
private ImageView image;
//imageView 的左边距
private int mag_left = 0;
//imageView 的上边距
private int mag_top = 0;
//imageView的宽度
private int image_width;
//imageView的高度
private int image_height;
//屏幕宽度
private int width;
//屏幕高度
private int height;
//imageView 的LayoutParams
private FrameLayout.LayoutParams image_params;
//图片文件的宽度
private int bit_width;
//图片文件的高度
private int bit_height;
//图片文件的宽高比例
private float bili;
//移动时的坐标 x
private float xx = -1;
//移动时的坐标y
private float yy = -1;
//设置第一个手指的位置 x
private float f_x = -1;
//设置第一个手指的位置 y
// private float f_y = -1;
//设置第二个手指的位置 x
private float s_x = -1;
//设置第二个手指的位置 y
// private float s_y = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
initView();
}
@Override
protected void onResume() {
super.onResume();
setDefault();
}
public void initView(){
image = (ImageView) findViewById(R.id.imageView1);
}
public void setDefault(){
//获取图片文件的最大尺寸
findViewById(R.id.framelayout).setOnTouchListener(this);
Options option = new Options();
option.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.test, option);
bit_width = option.outWidth;
bit_height = option.outHeight;
bili = (float)bit_height / (float)bit_width;
//获取当前屏幕大小(因为全屏,所以屏幕大小就是imageview大小)
WindowManager manager = getWindowManager();
Point point = new Point();
manager.getDefaultDisplay().getSize(point);
image_width = point.x;
image_height = point.y;
width = image_width;
height = image_height;
image_params = new FrameLayout.LayoutParams(width, height);
image_params.gravity = Gravity.CENTER;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
//判断当前是几个手指在
int point = event.getPointerCount();
if(point == 1){
//一个手指的时候移动
move(event);
}
else if(point == 2){
//两个手指的时候缩放
setSize(event);
}
else{
move(event);
Toast.makeText(this, "你的手指太多了 也许要切掉 " + (point - 2) +" 个才好用 。", Toast.LENGTH_SHORT).show();
}
return true;
}
private void move(MotionEvent event){
switch(event.getAction()){
//手指按下
case MotionEvent.ACTION_DOWN : {
xx = event.getX();
yy = event.getY();
break;
}
//手指移动
case MotionEvent.ACTION_MOVE : {
float now_x = event.getX();
float now_y = event.getY();
if(xx == -1 || yy == -1){
xx = now_x;
yy = now_y;
break;
}
float d_x = now_x - xx;
float d_y = now_y - yy;
mag_left += d_x;
mag_top += d_y;
xx = now_x;
yy = now_y;
image_params.leftMargin = mag_left;
image_params.topMargin = mag_top;
image.setLayoutParams(image_params);
break;
}
//手指抬起
case MotionEvent.ACTION_UP : {
xx = -1;
yy = -1;
f_x = -1;
s_x = -1;
break;
}
}
}
//缩放
private void setSize(MotionEvent event){
switch(event.getAction()){
//手指按下
case MotionEvent.ACTION_DOWN : {
f_x = event.getX(0);
s_x = event.getX(1);
break;
}
//手指缩放,只需要比较x缩放的距离,再乘以比例就可以
case MotionEvent.ACTION_MOVE : {
//目前两个手指的x坐标
float now_x_1 = event.getX(0);
float now_x_2 = event.getX(1);
//前一次两个手指间的距离
float old_l = s_x - f_x;
//今次两个手指间的距离
float new_l = now_x_2 - now_x_1;
//由于偶尔会跳进一个手指的事件,必须要加这个判断,否则容易出现问题
if(s_x == -1 || f_x == -1){
f_x = now_x_1;
s_x = now_x_2;
break;
}
//相减得到需要操作的距离,根据比例得到y轴需要改变的距离
float cha_x = new_l - old_l;
float cha_y = cha_x * bili;
image_width += cha_x;
image_height += cha_y;
image_params.width = image_width;
image_params.height = image_height;
image.setLayoutParams(image_params);
f_x = now_x_1;
s_x = now_x_2;
break;
}
//手指抬起
case MotionEvent.ACTION_UP : {
f_x = -1;
s_x = -1;
break;
}
}
}
}