android多点触控初试

多点触控,就是在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;
			}
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值