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

android仿快图浏览,图片缩放移动效果

2012-05-11 09:43 393 查看
代码是拿别人的改的 ,原来的有些BUG ,项目加载的都是网络图片 还没弄左右滑动效果

yi 工具类

package com.lin.image;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.Rect;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;

public class MyImageView extends ImageView {
private    Matrix mMatrix;
private float bWidth;// 图片宽度
private float bHeight;

private int dWidth;//屏幕宽度
private int  dHeight;//屏幕高度
private float initScale;
private float mScale;
private float scale;
ImageState mapState = new ImageState();
private float oldDist;
PointF mStart = new PointF();
private Bitmap mBitmap;
float[] values = new float[9];

Matrix initMatrix;
Matrix mSavedMatrix;

public MyImageView(Context context) {
super(context);
this.setScaleType(ScaleType.MATRIX);
}
public void init(MotionEvent event){
mStart.set(event.getX(), event.getY());
mSavedMatrix.set(mMatrix);

}
float rate=1.0f;
// 刷新界面
public void setView() {
//rate=rate/10*9;
// UserUtils.log(TAG, "set view", "set view");
//mMatrix.postScale(scale,scale,0,0);
this.setImageMatrix(mMatrix);

Rect rect = this.getDrawable().getBounds();
this.getImageMatrix().getValues(values);
bWidth = rect.width() * values[0];
bHeight = rect.height() * values[0];

mapState.left = values[2];
mapState.top = values[5];
mapState.right = mapState.left + bWidth;
mapState.bottom = mapState.top + bHeight;
}
private float s=0.9f;
public void setScale(){

float sX = dWidth / 2;
float sY = dHeight / 2;

mMatrix.postScale(s, s, sX, sY);
setView();
}
public void setScreenSize(Context context, int width, int height,Bitmap bitmap) {
mBitmap =bitmap;
dWidth = width;
dHeight = height;
setImageBitmap(mBitmap);
//        gd = new GestureDetector(context, new LearnGestureListener());

bWidth = mBitmap.getWidth();
bHeight = mBitmap.getHeight();
// mView = (ImageView) findViewById(R.id.imageView);
float xScale = (float) dWidth / bWidth;
float yScale = (float) dHeight / bHeight;
mScale = xScale <= yScale ? xScale : yScale;
scale = mScale < 1 ? mScale : 1;
initScale = scale;
mMatrix = new Matrix();
mSavedMatrix = new Matrix();
System.out.println("dwidth==="+dHeight+"  bHeight===="+bHeight);
// 平移
mMatrix.postTranslate((dWidth - bWidth) / 2, (dHeight - bHeight) / 2);

float sX = dWidth / 2;
float sY = dHeight / 2;

mSavedMatrix.set(mMatrix);
mMatrix.postScale(scale, scale, sX, sY);
setView();
}

/** 计算移动距离 */
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);
}
float backScale;
//缩放
public void zoom(MotionEvent event) {

float newDist = spacing(event);
if((mapState.right-mapState.left)>4*dWidth&&newDist>oldDist)
return;
Log.e("lin","oldDist="+oldDist+",newDist=="+newDist);
if (newDist > 10f&&Math.abs((newDist-oldDist))>10f) {
scale = newDist / oldDist;
if (scale < 1) {
mMatrix.postScale(scale, scale, dWidth / 2, dHeight / 2);
} else {
mMatrix.postScale(scale, scale, dWidth / 2, dHeight / 2);
}
oldDist=newDist;
}

setView();
}

/**
* @return the oldDist
*/
public float getOldDist(MotionEvent event) {
this.oldDist = this.spacing(event);
if (oldDist > 10f) {
mSavedMatrix.set(mMatrix);
}
backScale=oldDist;
Log.e("lin","oldDist="+oldDist);
return oldDist;
}
public void backScale(){
scale = backScale / oldDist;
if (scale < 1) {
//   mMatrix.postScale(scale, scale, dWidth / 2, dHeight / 2);
} else {
if(mapState.right-mapState.left<=dWidth){
scale= dWidth/(mapState.right-mapState.left);

mMatrix.postScale(scale, scale, dWidth / 2, dHeight / 2);
float h=(dHeight-(mapState.bottom-mapState.top))/2;
float w=(dWidth-(mapState.right-mapState.left))/2;
mMatrix.postTranslate(w-mapState.left,h-mapState.top);
}
}
setView();
}
public void backDrag(){
if (mapState.left >= 0 || mapState.right <= dWidth
||mapState.top >= 0 || mapState.bottom <= dHeight) {
float h=(dHeight-(mapState.bottom-mapState.top))/2;
float w=(dWidth-(mapState.right-mapState.left))/2;
mMatrix.postTranslate(w-mapState.left,h-mapState.top);
setView();
}
}
//拖动
public void drag(MotionEvent event){
//Log.i
Log.e("lin","left="+mapState.left+",right="+mapState.right
+",top="+mapState.top+",bottom="+mapState.bottom);

mMatrix.set(mSavedMatrix);
if ((mapState.left <= 0 || mapState.right >= dWidth)
&& (mapState.top <= 0 || mapState.bottom >= dHeight)) {
mMatrix.postTranslate(event.getX() - mStart.x, event.getY()
- mStart.y);
} else if (mapState.top <= 0 || mapState.bottom >= dHeight) {
mMatrix.postTranslate(0, event.getY() - mStart.y);
} else if (mapState.left <= 0 || mapState.right >= dWidth) {
mMatrix.postTranslate(event.getX() - mStart.x, 0);
}
else{
mMatrix.postTranslate(event.getX() - mStart.x, event.getY()-mStart.y);
}
//mStart.x=event.getX();
// mStart.y=event.getY();
setView();

}
private class ImageState {
private float left;
private float top;
private float right;
private float bottom;
}
}


二, Activity
package com.lin.image;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;

public class ImageScaleActivity extends Activity {
/** Called when the activity is first created. */
MyImageView image;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
image=new MyImageView(this);
Bitmap bmp=((BitmapDrawable)getResources().getDrawable(R.drawable.totallist)).getBitmap();
image.setScreenSize(this,getWindowManager().getDefaultDisplay().getWidth(),
getWindowManager().getDefaultDisplay().getHeight(),bmp);
setContentView(image);
}
private static final int DRAG=10;
private static final int  NULL=0;
private static final int SCALE=11;
private int mode;
private float mStartX;
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case  MotionEvent.ACTION_DOWN:
Log.i("lin","down");
mode=DRAG;

mStartX = event.getRawX();
image.init(event);
break;
case MotionEvent.ACTION_MOVE:
if(mode==SCALE)
image.zoom(event);
if(mode==DRAG){
image.drag(event);
return true;
}
break;
case MotionEvent.ACTION_UP:
Log.i("lin","up");
if(mode==SCALE){
image.backScale();
mode=NULL;
}
else if(mode==DRAG){
image.backDrag();
}
break;
case MotionEvent.ACTION_POINTER_1_DOWN:
Log.i("lin","down1");
break;
case MotionEvent.ACTION_POINTER_2_DOWN:
Log.i("lin","down2");
image.getOldDist(event);
mode=SCALE;
break;
case MotionEvent.ACTION_POINTER_2_UP:
Log.i("lin","up2");

default:
break;
}

return super.onTouchEvent(event);
}
private float calculate(float x1,  float x2) {

float pz = x1 - x2;// 计算两点间的距离
return pz;
}
}


截图



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