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

 

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