Android之關于手勢操作圖片的縮放與移動
在Android中實現手勢對于圖片的操作,首先需要對MotionEvent以及Matrix兩個類有所了解實現對手勢的識別以及圖片變動的操作。
在實現該功能時候需要在xml中要將圖片的縮放格式改成Matrix才行.
下面代碼主要實現兩個demo,一個是關于matrix的簡單測試以及圖片的手勢縮放與移動demo.。。
XML代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/linearLayout1" android:weightSum="1">
<ImageView android:layout_width="wrap_content" android:id="@+id/imag" android:layout_height="wrap_content" android:src="@drawable/a"
android:layout_gravity="center"
android:scaleType="matrix"
></ImageView>
<ImageView android:layout_width="wrap_content"
android:id="@+id/imag1"
android:scaleType="matrix"
android:layout_height="wrap_content"></ImageView>
</LinearLayout>
實現代碼:
package hfut.gmm;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.FloatMath;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
public class Img_control extends Activity implements OnTouchListener {//implements OnTouchListener {
private ImageView imgview;
private ImageView img;
private Matrix matrix=new Matrix();
private Matrix savedMatrix=new Matrix();
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
//private GestureDetector gesture;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.img_control);
imgview=(ImageView)this.findViewById(R.id.imag1);
imgview.setAnimation(AnimationUtils.loadAnimation(this, R.anim.newanim));
img=(ImageView)this.findViewById(R.id.imag);
Matrix mt=img.getImageMatrix();
//mt.postRotate(30);
mt.postScale(0.5f,0.5f);mt.postScale(1.5f,1.5f);
mt.postRotate(30, 130, 100);
mt.postTranslate(100, 10);
img.setImageMatrix(mt);
//imgview.setLongClickable(true);
imgview.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.a));
imgview.setOnTouchListener(this);
imgview.setLongClickable(true);
}
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
/*
Log.d("Infor", "類別:"+event.getAction());
Log.d("Infor", "mask:"+event.getActionMasked());
Log.d("Infor", "index:"+event.getActionIndex());
Log.d("Infor", "points:"+event.getPointerCount());*/
Log.d("Infor", "size:"+event.getSize());
if(event.getActionMasked()==MotionEvent.ACTION_POINTER_UP)
Log.d("Infor", "多點操作");
switch(event.getActionMasked()){
case MotionEvent.ACTION_DOWN:
matrix.set(imgview.getImageMatrix());
savedMatrix.set(matrix);
start.set(event.getX(),event.getY());
Log.d("Infor", "觸摸了...");
mode=DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN: //多點觸控
oldDist=this.spacing(event);
if(oldDist>10f){
Log.d("Infor", "oldDist"+oldDist);
savedMatrix.set(matrix);
midPoint(mid,event);
mode=ZOOM;
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode=NONE;
break;
case MotionEvent.ACTION_MOVE:
if(mode==DRAG){ //此實現圖片的拖動功能...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX()-start.x, event.getY()-start.y);
}
else if(mode==ZOOM){// 此實現圖片的縮放功能...
float newDist=spacing(event);
if(newDist>10){
matrix.set(savedMatrix);
float scale=newDist/oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
imgview.setImageMatrix(matrix);
return false;
}
}
運行結果如下:


本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!