android仿快图浏览,图片缩放移动效果
2012-05-11 09:43
393 查看
代码是拿别人的改的 ,原来的有些BUG ,项目加载的都是网络图片 还没弄左右滑动效果
yi 工具类
二, Activity
截图
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; } }
截图
相关文章推荐
- Android 手势检测实战 打造支持缩放平移的图片预览效果(上)
- Android-图片预览(自定义ImageView实现图片缩放,多点触控,自由移动)
- android实现手势缩放、移动图片
- Android手势控制实现缩放、移动图片
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
- Android点击WebView实现图片缩放及滑动浏览效果
- android imageview 多点触碰(MultiTouch)实现图片拖拽移动缩放
- Android实现本地图片选择及预览缩放效果
- [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印
- android 实现 波纹效果+图片左右无限滑动缩放效果
- Android view的移动,旋转,缩放,透明等效果
- android 图片操作(缩放移动) 实例代码
- Android仿QQ好友详情页下拉顶部图片缩放效果
- Android 布局手势缩放,可滑动查看,实现类似Imgview图片缩放效果
- [Android View] 判断是否点中一个动态可旋转、可缩放、可移动的图片
- [vb.net]使用GDI+绘图达到图片随鼠标缩放与移动的效果
- Android中利用matrix 控制图片的旋转、缩放、移动
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
- android 图片浏览时 两手指控制缩放 、移动
- android开发步步为营之83:android图片处理技术之二(通过Matrix移动缩放旋转错切)