只在别人代码的基础上做了一点点修改,限制图片超出边界,不然图片消失了不太好玩~~

 

1.MainActivity  显示的页面

            
  1. package whu.iss.activity;  
  2.  
  3. import android.app.Activity;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.ProgressBar;  
  12. import android.widget.ZoomControls;  
  13.  
  14. public class main extends Activity {  
  15.     /** Called when the activity is first created. */ 
  16.     private ImageZoomView mZoomView;  
  17.     private ZoomState mZoomState;  
  18.     private Bitmap mBitmap;  
  19.     private SimpleZoomListener mZoomListener;  
  20.     private ProgressBar progressBar;  
  21.     private Handler handler = new Handler() {  
  22.         @Override 
  23.         public void handleMessage(Message msg) {  
  24.             progressBar.setVisibility(View.GONE);  
  25.             mZoomView.setImage(mBitmap);  
  26.             mZoomState = new ZoomState();  
  27.             mZoomView.setZoomState(mZoomState);  
  28.             mZoomListener = new SimpleZoomListener();  
  29.             mZoomListener.setZoomState(mZoomState);  
  30.             mZoomView.setOnTouchListener(mZoomListener);  
  31.             resetZoomState();  
  32.         }  
  33.     };  
  34.  
  35.     @Override 
  36.     public void onCreate(Bundle savedInstanceState) {  
  37.         super.onCreate(savedInstanceState);  
  38.         setContentView(R.layout.activity_p_w_picpath);  
  39.         mZoomView = (ImageZoomView) findViewById(R.id.zoomView);  
  40.         progressBar = (ProgressBar) findViewById(R.id.progress_large);  
  41.         progressBar.setVisibility(View.VISIBLE);  
  42.         Thread thread = new Thread(new Runnable() {  
  43.             @Override 
  44.             public void run() {  
  45.                 /*  
  46.                  * 加载网络图片 load form url  
  47.                  */ 
  48.                 // mBitmap =  
  49.                 // ImageDownloader.getInstance().getBitmap(url);  
  50.                 mBitmap = BitmapFactory.decodeResource(  
  51.                         main.this.getResources(), R.drawable.earth);  
  52.                 handler.sendEmptyMessage(0);  
  53.             }  
  54.         });  
  55.         thread.start();  
  56.  
  57.         ZoomControls zoomCtrl = (ZoomControls) findViewById(R.id.zoomCtrl);  
  58.         zoomCtrl.setOnZoomInClickListener(new OnClickListener() {  
  59.             @Override 
  60.             public void onClick(View v) {  
  61.                 float z = mZoomState.getZoom() + 0.25f;  
  62.                 mZoomState.setZoom(z);  
  63.                 mZoomState.notifyObservers();  
  64.             }  
  65.         });  
  66.         zoomCtrl.setOnZoomOutClickListener(new OnClickListener() {  
  67.  
  68.             @Override 
  69.             public void onClick(View v) {  
  70.                 float z = mZoomState.getZoom() - 0.25f;  
  71.                 mZoomState.setZoom(z);  
  72.                 mZoomState.notifyObservers();  
  73.             }  
  74.         });  
  75.     }  
  76.  
  77.     @Override 
  78.     protected void onDestroy() {  
  79.         super.onDestroy();  
  80.         if (mBitmap != null)  
  81.             mBitmap.recycle();  
  82.         // mZoomView.setOnTouchListener(null);  
  83.         // mZoomState.deleteObservers();  
  84.     }  
  85.  
  86.     private void resetZoomState() {  
  87.         mZoomState.setPanX(0.5f);  
  88.         mZoomState.setPanY(0.5f);  
  89.         mZoomState.setZoom(1f);  
  90.         mZoomState.notifyObservers();  
  91.     }  

2.相对于MainActivity 的布局文件

 

            
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout 
  3.   xmlns:android="http://schemas.android.com/apk/res/android" 
  4.   android:layout_width="wrap_content" 
  5.   android:layout_height="wrap_content" 
  6.   android:orientation="vertical"> 
  7.           <RelativeLayout 
  8.           android:layout_width="fill_parent" 
  9.           android:layout_height="41dip"> 
  10.             
  11.           <TextView 
  12.           android:layout_width="wrap_content" 
  13.           android:layout_height="wrap_content" 
  14.           android:layout_centerInParent="true" 
  15.           android:textSize="20sp" 
  16.           android:text="浏览图片" 
  17.           android:textColor="#ffffff"> 
  18.           TextView> 
  19.             
  20.           <Button 
  21.           android:id="@+id/downBtn" 
  22.           android:layout_width="wrap_content" 
  23.           android:layout_height="wrap_content" 
  24.           android:layout_alignParentRight="true" 
  25.           android:text="下载"> 
  26.           Button> 
  27.             
  28.           RelativeLayout> 
  29.             
  30.           <RelativeLayout 
  31.           android:layout_width="fill_parent" 
  32.           android:layout_height="fill_parent"> 
  33.           <whu.iss.activity.ImageZoomView 
  34.             android:id="@+id/zoomView" 
  35.             android:layout_width="fill_parent"   
  36.             android:layout_height="fill_parent"> 
  37.           whu.iss.activity.ImageZoomView> 
  38.          <ProgressBar   
  39.                     android:id="@+id/progress_large" 
  40.                     android:layout_height="wrap_content" 
  41.                     android:layout_width="wrap_content" 
  42.                     style="?android:attr/progressBarStyleLarge" 
  43.                     android:visibility="gone" 
  44.                     android:layout_centerInParent="true"/> 
  45.           <ZoomControls 
  46.           android:id="@+id/zoomCtrl" 
  47.           android:layout_width="wrap_content" 
  48.           android:layout_height="wrap_content" 
  49.           android:layout_alignParentBottom="true" 
  50.           android:layout_centerHorizontal="true"> 
  51.           ZoomControls> 
  52.           RelativeLayout> 
  53. LinearLayout>  

3.AndroidMainfest

就不写了,没啥东西,和一般的注册页面一样,没有什么权限

4.三个重要工具类

 

            
  1. package whu.iss.activity;  
  2.  
  3. import java.util.Observable;  
  4.  
  5. public class ZoomState extends Observable {  
  6.  
  7.     private float mZoom;  
  8.     private float mPanX;  
  9.     private float mPanY;  
  10.  
  11.     public float getPanX() {  
  12.         return mPanX;  
  13.     }  
  14.  
  15.     public float getPanY() {  
  16.         return mPanY;  
  17.     }  
  18.  
  19.     public float getZoom() {  
  20.         return mZoom;  
  21.     }  
  22.  
  23.     public void setPanX(float panX) {  
  24.         if (panX != mPanX) {  
  25.             mPanX = panX;  
  26.             setChanged();  
  27.         }  
  28.     }  
  29.  
  30.     public void setPanY(float panY) {  
  31.         if (panY != mPanY) {  
  32.             mPanY = panY;  
  33.             setChanged();  
  34.         }  
  35.     }  
  36.  
  37.     public void setZoom(float zoom) {  
  38.         if (zoom != mZoom) {  
  39.             mZoom = zoom;  
  40.             setChanged();  
  41.         }  
  42.     }  
  43.       
  44.     public float getZoomX(float aspectQuotient) {  
  45.         return Math.min(mZoom, mZoom * aspectQuotient);  
  46.     }  
  47.  
  48.     public float getZoomY(float aspectQuotient) {  
  49.         return Math.min(mZoom, mZoom / aspectQuotient);  
  50.     }  
  51. }  

 

 

            
  1. package whu.iss.activity;  
  2.  
  3. import android.util.Log;  
  4. import android.view.MotionEvent;  
  5. import android.view.View;  
  6.  
  7. public class SimpleZoomListener implements View.OnTouchListener {  
  8.  
  9.     public enum ControlType {  
  10.         PAN, ZOOM  
  11.     }  
  12.  
  13.     private ControlType mControlType = ControlType.PAN;  
  14.  
  15.     private ZoomState mState;  
  16.  
  17.     private float mX;  
  18.     private float mY;  
  19.     private float mGap;  
  20.  
  21.     public void setZoomState(ZoomState state) {  
  22.         mState = state;  
  23.     }  
  24.  
  25.     public void setControlType(ControlType controlType) {  
  26.         mControlType = controlType;  
  27.     }  
  28.  
  29.     public boolean onTouch(View v, MotionEvent event) {  
  30.         final int action = event.getAction();  
  31.         int pointCount = event.getPointerCount();  
  32.         if (pointCount == 1) {  
  33.             final float x = event.getX();  
  34.             final float y = event.getY();  
  35.             switch (action) {  
  36.             case MotionEvent.ACTION_DOWN:  
  37.                 mX = x;  
  38.                 mY = y;  
  39.                 break;  
  40.             case MotionEvent.ACTION_MOVE: {  
  41.  
  42.                 final float dx = (x - mX) / v.getWidth();  
  43.                 final float dy = (y - mY) / v.getHeight();  
  44.                 if (((mState.getPanX() - dx) > 0 && (mState.getPanX() - dx) < 1)  
  45.                         && ((mState.getPanY() - dy) > 0 && (mState.getPanY() - dy) < 1)) {  
  46.                     Log.d("dd",  
  47.                             "----------------mov=" + (mState.getPanX() - dx)  
  48.                                     + "   dy=" + (mState.getPanY() - dy));  
  49.                     mState.setPanX(mState.getPanX() - dx);  
  50.                     mState.setPanY(mState.getPanY() - dy);  
  51.                     mState.notifyObservers();  
  52.                     mX = x;  
  53.                     mY = y;  
  54.                 }  
  55.  
  56.                 break;  
  57.             }  
  58.             }  
  59.         }  
  60.         if (pointCount == 2) {  
  61.             final float x0 = event.getX(event.getPointerId(0));  
  62.             final float y0 = event.getY(event.getPointerId(0));  
  63.  
  64.             final float x1 = event.getX(event.getPointerId(1));  
  65.             final float y1 = event.getY(event.getPointerId(1));  
  66.  
  67.             final float gap = getGap(x0, x1, y0, y1);  
  68.             switch (action) {  
  69.             case MotionEvent.ACTION_POINTER_2_DOWN:  
  70.             case MotionEvent.ACTION_POINTER_1_DOWN:  
  71.                 mGap = gap;  
  72.                 break;  
  73.             case MotionEvent.ACTION_POINTER_1_UP:  
  74.                 mX = x1;  
  75.                 mY = y1;  
  76.                 break;  
  77.             case MotionEvent.ACTION_POINTER_2_UP:  
  78.                 mX = x0;  
  79.                 mY = y0;  
  80.                 break;  
  81.             case MotionEvent.ACTION_MOVE: {  
  82.                 final float dgap = (gap - mGap) / mGap;  
  83.                 // Log.d("Gap", String.valueOf(dgap));  
  84.                 Log.d("Gap", String.valueOf((float) Math.pow(20, dgap)));  
  85.                 mState.setZoom(mState.getZoom() * (float) Math.pow(5, dgap));  
  86.                 mState.notifyObservers();  
  87.                 mGap = gap;  
  88.                 break;  
  89.             }  
  90.             }  
  91.         }  
  92.  
  93.         return true;  
  94.     }  
  95.  
  96.     private float getGap(float x0, float x1, float y0, float y1) {  
  97.         return (float) Math.pow(  
  98.                 Math.pow((x0 - x1), 2) + Math.pow((y0 - y1), 2), 0.5);  
  99.     }  
  100.  
  101. }  

 

            
  1. package whu.iss.activity;  
  2.  
  3. import java.util.Observable;  
  4. import java.util.Observer;  
  5.  
  6. import android.content.Context;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.Canvas;  
  9. import android.graphics.Paint;  
  10. import android.graphics.Rect;  
  11. import android.util.AttributeSet;  
  12. import android.view.View;  
  13.  
  14. public class ImageZoomView extends View implements Observer {  
  15.  
  16.     private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);  
  17.     private final Rect mRectSrc = new Rect();  
  18.     private final Rect mRectDst = new Rect();  
  19.     private float mAspectQuotient;  
  20.       
  21.     private Bitmap mBitmap;  
  22.     private ZoomState mState;  
  23.  
  24.     public ImageZoomView(Context context, AttributeSet attrs) {  
  25.         super(context, attrs);  
  26.     }  
  27.  
  28.     public void setZoomState(ZoomState state) {  
  29.         if (mState != null) {  
  30.             mState.deleteObserver(this);  
  31.         }  
  32.         mState = state;  
  33.         mState.addObserver(this);  
  34.         invalidate();  
  35.     }  
  36.       
  37.     protected void onDraw(Canvas canvas) {  
  38.         if (mBitmap != null && mState != null) {  
  39.             final int viewWidth = getWidth();  
  40.             final int viewHeight = getHeight();  
  41.             final int bitmapWidth = mBitmap.getWidth();  
  42.             final int bitmapHeight = mBitmap.getHeight();  
  43.  
  44.             final float panX = mState.getPanX();  
  45.             final float panY = mState.getPanY();  
  46.             final float zoomX = mState.getZoomX(mAspectQuotient) * viewWidth / bitmapWidth;  
  47.             final float zoomY = mState.getZoomY(mAspectQuotient) * viewHeight / bitmapHeight;  
  48.  
  49.             // Setup source and destination rectangles  
  50.             mRectSrc.left = (int)(panX * bitmapWidth - viewWidth / (zoomX * 2));  
  51.             mRectSrc.top = (int)(panY * bitmapHeight - viewHeight / (zoomY * 2));  
  52.             mRectSrc.right = (int)(mRectSrc.left + viewWidth / zoomX);  
  53.             mRectSrc.bottom = (int)(mRectSrc.top + viewHeight / zoomY);  
  54.             mRectDst.left = getLeft();  
  55.             mRectDst.top = getTop();  
  56.             mRectDst.right = getRight();  
  57.             mRectDst.bottom = getBottom();  
  58.  
  59.             // Adjust source rectangle so that it fits within the source p_w_picpath.  
  60.             if (mRectSrc.left < 0) {  
  61.                 mRectDst.left += -mRectSrc.left * zoomX;  
  62.                 mRectSrc.left = 0;  
  63.             }  
  64.             if (mRectSrc.right > bitmapWidth) {  
  65.                 mRectDst.right -= (mRectSrc.right - bitmapWidth) * zoomX;  
  66.                 mRectSrc.right = bitmapWidth;  
  67.             }  
  68.             if (mRectSrc.top < 0) {  
  69.                 mRectDst.top += -mRectSrc.top * zoomY;  
  70.                 mRectSrc.top = 0;  
  71.             }  
  72.             if (mRectSrc.bottom > bitmapHeight) {  
  73.                 mRectDst.bottom -= (mRectSrc.bottom - bitmapHeight) * zoomY;  
  74.                 mRectSrc.bottom = bitmapHeight;  
  75.             }  
  76.  
  77.             canvas.drawBitmap(mBitmap, mRectSrc, mRectDst, mPaint);  
  78.         }  
  79.     }  
  80.  
  81.     public void update(Observable observable, Object data) {  
  82.         invalidate();  
  83.     }  
  84.       
  85.     private void calculateAspectQuotient() {  
  86.         if (mBitmap != null) {  
  87.             mAspectQuotient =  
  88.                 (((float)mBitmap.getWidth()) / mBitmap.getHeight()) /  
  89.                 (((float)getWidth()) / getHeight());  
  90.         }  
  91.     }  
  92.  
  93.     public void setImage(Bitmap bitmap) {  
  94.         mBitmap = bitmap;  
  95.         calculateAspectQuotient();  
  96.         invalidate();  
  97.     }  
  98.  
  99.     @Override 
  100.     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {  
  101.         super.onLayout(changed, left, top, right, bottom);  
  102.         calculateAspectQuotient();  
  103.     }  
  104.  
  105. }  

 

更多相关文章

  1. Android获取SD卡中选中图片的路径(URL)
  2. Android目录结构--drawable和drawable-v24区别
  3. 网络图片浏览器
  4. 【原创】Android仿新浪微博的“更多”页面效果
  5. Android拍照获得图片URI为空的处理方法
  6. Unity 调用android插件
  7. Android(安卓)各种功能代码收集
  8. Android(安卓)mdpi ldpi hdpi区别(转)
  9. react-native 键盘遮挡输入框

随机推荐

  1. android九宫格锁屏控件
  2. android 点击空白 隐藏软键盘
  3. Android笔记(1)---Android开发环境的搭建
  4. android获取图片和视频的缩略图
  5. Android Wear 进阶 - 3 Creating Custom
  6. Android中文API——ScrollView
  7. android圆形有边框无背景色
  8. Android指示灯控制
  9. Android Robitium Solo语法知识
  10. android 封装Http请求的帮助类