您的位置:首页 > 其它

Bitmap旋转和缩放

2013-06-06 22:51 69 查看
MainActivity如下:

package cn.testtouchscreentomoveimage;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
/**
* Demo描述:
* 实现图片的拖动和缩放
*
* 参考资料:
* 1 http://blog.csdn.net/lfdfhl/article/details/8248848 * 2 http://blog.csdn.net/leverage_1229/article/details/9009931 *
* 注意事项:
* 在该Demo中对于ImageView的设置
* android:layout_width="match_parent"
* android:layout_height="match_parent"
* 是不太合理的,在具体项目中应调整
*/

public class MainActivity extends Activity {
private ImageView mImageView;
// 开始点
private PointF mStartPoinF ;
// 图片位置的变换矩阵
private Matrix mMatrix;
// 图片当前矩阵
private Matrix mCurrentMatrix;
// 模式参数
private int current_mode = 0;
// 拖拉模式
private static final int drag_mode = 1;
// 缩放模式
private static final int zoom_mode = 2;
// 开启缩放的阈值
private static final float ZOOM_THRESHOLD = 10.0f;
// 缩放前两指间的距离
private float before_move_twoFingers_distance;
// 两指移动后两者间的距离
private float after_move_twoFingers_distance;
// 两指间中心点
private PointF mMiddlePointF;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}

private void init() {
mStartPoinF = new PointF();
mMatrix = new Matrix();
mCurrentMatrix = new Matrix();
mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setOnTouchListener(new TouchListenerImpl());
}

private class TouchListenerImpl implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
current_mode = drag_mode;
// 记录图片当前matrix
mCurrentMatrix.set(mImageView.getImageMatrix());
// 记录开始坐标
mStartPoinF.set(event.getX(), event.getY());
break;

// 当屏幕上已经有触点(手指),再有手指按下时触发该事件
case MotionEvent.ACTION_POINTER_DOWN:
current_mode = zoom_mode;
before_move_twoFingers_distance = getTwoPointsDistance(event);
if (before_move_twoFingers_distance > ZOOM_THRESHOLD) {
// 计算两触点的中心点
mMiddlePointF = getMiddlePoint(event);
// 记录图片当前matrix
mCurrentMatrix.set(mImageView.getImageMatrix());
}
break;

case MotionEvent.ACTION_MOVE:
//处理图片的拖动
if (current_mode == drag_mode) {
// 获取X轴移动距离
float distanceX = event.getX() - mStartPoinF.x;
// 获取Y轴移动距离
float distanceY = event.getY() - mStartPoinF.y;
// 在mCurrentMatrix的基础上平移图片
mMatrix.set(mCurrentMatrix);
mMatrix.postTranslate(distanceX, distanceY);

}
//处理图片的缩放
if (current_mode == zoom_mode) {
after_move_twoFingers_distance = getTwoPointsDistance(event);
if (after_move_twoFingers_distance > ZOOM_THRESHOLD) {
// 计算缩放比例
float scale = after_move_twoFingers_distance / before_move_twoFingers_distance;
mMatrix.set(mCurrentMatrix);
// 依据缩放比例和中心点进行缩放
mMatrix.postScale(scale, scale, mMiddlePointF.x,mMiddlePointF.y);
}
}
break;

case MotionEvent.ACTION_UP:
// 当手指离开屏幕,但屏幕上仍有其他触点(手指)时触发该事件
case MotionEvent.ACTION_POINTER_UP:
current_mode = 0;
break;
}
// 为ImageView设置matrix
mImageView.setImageMatrix(mMatrix);
return true;
}

}

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

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


main.xml如下:

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/e"
android:scaleType="matrix"
/>

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: