Android的多点触摸之图片放大缩小-刘宇

在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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章