您的位置:首页 > 移动开发 > Android开发

Android开发:对图片的手势操作——旋转、缩放、移动

2013-05-16 16:04 766 查看
以下代码经过测试,如有问题,请留言!

activity_main.xml文件:

<RelativeLayout xmlns:
android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<ImageView
android:id="@+id/imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/app_name"
android:scaleType="matrix"
android:src="@drawable/image" />
</LinearLayout>

</RelativeLayout>


java文件:

import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class PictureRotate extends Activity {

private ImageView imageView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

imageView = (ImageView) this.findViewById(R.id.imageview);
imageView.setOnTouchListener(new TouchListener());
}

private final class TouchListener implements OnTouchListener {
private PointF startPoint = new PointF();
private Matrix matrix = new Matrix();
private Matrix currentMatrix = new Matrix();
private int mode = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
private float startDis;// 开始距离
private PointF midPoint;// 中间点
private double startAngle;// 开始角度

public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:// 手指压下屏幕
Log.e("onTouch", "ACTION_DOWN");
mode = DRAG;
currentMatrix.set(imageView.getImageMatrix());// 记录ImageView当前的移动位置
startPoint.set(event.getX(), event.getY());
break;

case MotionEvent.ACTION_MOVE:// 手指在屏幕移动,该 事件会不断地触发
// Log.e("onTouch", "ACTION_MOVE");
if (mode == DRAG) {
float dx = event.getX() - startPoint.x;// 得到在x轴的移动距离
float dy = event.getY() - startPoint.y;// 得到在y轴的移动距离
matrix.set(currentMatrix);// 在没有进行移动之前的位置基础上进行移动
matrix.postTranslate(dx, dy);
} else if (mode == ZOOM) {// 缩放
float endDis = distance(event);// 结束距离
int trunAngel = (int) (angle(event) - startAngle);// 变化的角度
// Log.v("ACTION_MOVE", "trunAngel="+trunAngel);
if (endDis > 10f) {
float scale = endDis / startDis;// 得到缩放倍数
matrix.set(currentMatrix);
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
Log.v("ACTION_MOVE", "imageView.getHeight()="
+ imageView.getHeight());
Log.v("ACTION_MOVE", "imageView.getWidth()="
+ imageView.getWidth());
if (Math.abs(trunAngel) > 5) {
// 设置变化的角度
matrix.postRotate(trunAngel, midPoint.x, midPoint.y);
}

}
}
break;

case MotionEvent.ACTION_UP:// 手指离开屏
// Log.e("onTouch", "ACTION_UP");
break;
case MotionEvent.ACTION_POINTER_UP:// 有手指离开屏幕,但屏幕还有触点(手指)
// Log.e("onTouch", "ACTION_POINTER_UP");
mode = 0;
break;

case MotionEvent.ACTION_POINTER_DOWN:// 当屏幕上还有触点(手指),再有一个手指压下屏幕
// Log.e("onTouch", "ACTION_POINTER_DOWN");
mode = ZOOM;
startDis = distance(event);
startAngle = angle(event);
if (startDis > 10f) {
midPoint = mid(event);
currentMatrix.set(imageView.getImageMatrix());// 记录ImageView当前的缩放倍数
}
break;
}
// Bitmap
// bitmap0=((BitmapDrawable)getResources().getDrawable(R.drawable.test2)).getBitmap();
// LayerDrawable layerDrawable=LayerDrawable.
// Bitmap bitmap=Bitmap.createBitmap(bitmap0, x, y, width, height,
// m, filter)
imageView.setImageMatrix(matrix);
return true;
}

}

/**
* 计算两点之间的距离
*
* @param event
* @return
*/
public static float distance(MotionEvent event) {
float dx = event.getX(1) - event.getX(0);
float dy = event.getY(1) - event.getY(0);
return FloatMath.sqrt(dx * dx + dy * dy);
}

/**
* 计算两点之间的中间点
*
* @param event
* @return
*/
public static PointF mid(MotionEvent event) {
float midX = (event.getX(1) + event.getX(0)) / 2;
float midY = (event.getY(1) + event.getY(0)) / 2;
return new PointF(midX, midY);
}

/**
* 计算两个手指连线与坐标轴的角度(单位为。C)
*
* @param event
* @return
*/
public static double angle(MotionEvent event) {
double delta_x = (event.getX(0) - event.getX(1));
double delta_y = (event.getY(0) - event.getY(1));
double radians = Math.atan2(delta_y, delta_x);
return (float) Math.toDegrees(radians);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐