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

Android之关于手势操作图片的缩放与移动

2014-03-25 13:07 375 查看
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="1" >

<ImageView
android:id="@+id/imag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:scaleType="matrix"
android:src="@drawable/a" >
</ImageView>

<ImageView
android:id="@+id/imag1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="matrix" >
</ImageView>

</LinearLayout>
实现代码:

package hfut.gmm;

import javax.swing.text.View;
import javax.swing.text.html.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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息