zoukankan      html  css  js  c++  java
  • android 大图片拖拽缩放

     这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助。

         

               这篇就不做过多介绍了,直接上源码:

    001 public class SpacePageActivity extends Activity {
    002   
    003     private LinearLayout linnerLayout_spacepage;
    004     private RelativeLayout relativeLayout_spacepage;
    005     private Button btn_spacepage_back;
    006     private Button btn_spacepage_save;
    007     private static Boolean isTrue=false;
    008       
    009     private static  String IMAGE_MIME_TYPE ;
    010   
    011     private ImageView image_spacePage;
    012     private ProgressDialog dialog;
    013     private Bitmap bitmap;
    014     @Override
    015     protected void onCreate(Bundle savedInstanceState) {
    016         // TODO Auto-generated method stub
    017         super.onCreate(savedInstanceState);
    018         requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题  
    019         setContentView(R.layout.spacepage);
    020         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);   
    021         initHead();
    022       
    023         if(isNetworkAvailable()){
    024         image_spacePage=(ImageView) findViewById(R.id.image_spacepage);
    025         btn_spacepage_save=(Button) findViewById(R.id.btn_spacepage_save);
    026         image_spacePage.setOnTouchListener(new MulitPointTouchListener(image_spacePage));
    027         image_spacePage.setScaleType(ScaleType.CENTER_INSIDE);
    028           
    029         //加载成功
    030         String urls="http://epaper.yzdsb.com.cn/201201/04/yz2104_7.jpg";
    031         bitmap=returnBitMap(urls);
    032         if(null!=bitmap){
    033          image_spacePage.setImageBitmap(bitmap);
    034         }
    035           
    036         }
    037     
    038       
    039   
    040     public Bitmap returnBitMap(String url) {  
    041           
    042          if(null==url || "".equals(url)){
    043              return null;
    044          }
    045            URL myFileUrl = null;   
    046            Bitmap bitmap = null;   
    047            try {   
    048             myFileUrl = new URL(url);   
    049            } catch (MalformedURLException e) {   
    050             e.printStackTrace();   
    051            }   
    052            try {   
    053             HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
    054             conn.setConnectTimeout(2000);
    055             conn.setDoInput(true);   
    056             conn.connect();   
    057             InputStream is = conn.getInputStream();   
    058             bitmap = BitmapFactory.decodeStream(is);   
    059             is.close();   
    060            } catch (IOException e) {   
    061             e.printStackTrace();   
    062            }   
    063              
    064              
    065              
    066            return bitmap;   
    067         
    068     public class MulitPointTouchListener implements OnTouchListener {    
    069             
    070         Matrix matrix = new Matrix();    
    071         Matrix savedMatrix = new Matrix();    
    072         
    073         public ImageView image;    
    074         static final int NONE = 0;    
    075         static final int DRAG = 1;    
    076         static final int ZOOM = 2;    
    077         int mode = NONE;    
    078         
    079         PointF start = new PointF();    
    080         PointF mid = new PointF();    
    081         float oldDist = 1f;    
    082         
    083         
    084         public MulitPointTouchListener(ImageView image) {    
    085             super();    
    086             this.image = image;    
    087         }    
    088         
    089         @Override    
    090         public boolean onTouch(View v, MotionEvent event) {    
    091             this.image.setScaleType(ScaleType.MATRIX);    
    092         
    093             ImageView view = (ImageView) v;    
    094 //        dumpEvent(event);    
    095         
    096             switch (event.getAction() & MotionEvent.ACTION_MASK) {  
    097                 
    098             case MotionEvent.ACTION_DOWN:    
    099         
    100                 Log.w("FLAG", "ACTION_DOWN");  
    101                 matrix.set(view.getImageMatrix());    
    102                 savedMatrix.set(matrix);    
    103                 start.set(event.getX(), event.getY());    
    104                 mode = DRAG;    
    105                 break;    
    106             case MotionEvent.ACTION_POINTER_DOWN:    
    107                 Log.w("FLAG", "ACTION_POINTER_DOWN");  
    108                 oldDist = spacing(event);    
    109                 if (oldDist > 10f) {    
    110                     savedMatrix.set(matrix);    
    111                     midPoint(mid, event);    
    112                     mode = ZOOM;    
    113                 }    
    114                 break;    
    115             case MotionEvent.ACTION_UP:    
    116                 Log.w("FLAG", "ACTION_UP");  
    117             case MotionEvent.ACTION_POINTER_UP:    
    118                 Log.w("FLAG", "ACTION_POINTER_UP");  
    119                 mode = NONE;    
    120                 break;    
    121             case MotionEvent.ACTION_MOVE:    
    122                 Log.w("FLAG", "ACTION_MOVE");  
    123                 if (mode == DRAG) {    
    124                     matrix.set(savedMatrix);    
    125                     matrix.postTranslate(event.getX() - start.x, event.getY()    
    126                             - start.y);    
    127                 } else if (mode == ZOOM) {    
    128                     float newDist = spacing(event);    
    129                     if (newDist > 10f) {    
    130                         matrix.set(savedMatrix);    
    131                         float scale = newDist / oldDist;    
    132                         matrix.postScale(scale, scale, mid.x, mid.y);    
    133                     }    
    134                 }    
    135                 break;    
    136             }    
    137         
    138             view.setImageMatrix(matrix);    
    139             return true;  
    140         }    
    141         
    142             
    143         private float spacing(MotionEvent event) {    
    144             float x = event.getX(0) - event.getX(1);    
    145             float y = event.getY(0) - event.getY(1);    
    146             return FloatMath.sqrt(x * x + y * y);    
    147         }    
    148         
    149         private void midPoint(PointF point, MotionEvent event) {    
    150             float x = event.getX(0) + event.getX(1);    
    151             float y = event.getY(0) + event.getY(1);    
    152             point.set(x / 2, y / 2);    
    153         }    
    154     }   
    155     private void initHead() {
    156         linnerLayout_spacepage = (LinearLayout) findViewById(R.id.linnerLayout_spacepage);
    157         relativeLayout_spacepage=(RelativeLayout) findViewById(R.id.relativeLayout_spacepage);
    158         btn_spacepage_back = (Button) findViewById(R.id.btn_spacepage_back);
    159         btn_spacepage_back.setOnClickListener(new OnClickListener() {
    160               
    161             @Override
    162             public void onClick(View v) {
    163                 // TODO Auto-generated method stub
    164                   
    165                 finish();
    166             }
    167         });
    168         btn_spacepage_save = (Button) findViewById(R.id.btn_spacepage_save);
    169           
    170     }
    171     protected boolean isNetworkAvailable() {
    172         ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    173         if (connectivity == null) {
    174             Log.i("NetWorkState", "Unavailabel");
    175             return false;
    176         } else {
    177             NetworkInfo[] info = connectivity.getAllNetworkInfo();
    178             if (info != null) {
    179                 for (int i = 0; i < info.length; i++) {
    180                     if (info[i].getState() == NetworkInfo.State.CONNECTED) {
    181                         Log.i("NetWorkState", "Availabel");
    182                         return true;
    183                     }
    184                 }
    185             }
    186         }
    187         return false;
    188     }
    189    @Override
    190 protected void onStop() {
    191     // TODO Auto-generated method stub
    192        if(bitmap!=null){
    193             if(!bitmap.isRecycled()){
    194                 bitmap.recycle();   //回收图片所占的内存
    195                 bitmap=null;
    196                  System.gc();  //提醒系统及时回收
    197          }
    198         }
    199     super.onStop();
    200 }
    201     @Override
    202     protected void onDestroy() {
    203         // TODO Auto-generated method stub
    204         super.onDestroy();
    205         if(bitmap!=null){
    206         if(!bitmap.isRecycled()){
    207             bitmap.recycle();   //回收图片所占的内存
    208             bitmap=null;
    209              System.gc();  //提醒系统及时回收
    210      }
    211         }
    212     }
    213 }

         因为是大图片,在onDestroy的时候要recycle掉,这样系统才会定时回收掉,System.gc();是提醒系统回收,虽然java这种垃圾 回收机制不用我们自己关心对象的回收,但是这也给android开发人员带来了不好的一面,如果系统回收不及时很可能就造成了内存溢出了。什么时候手机不 担心内存使用了就好了。

       运行一下看看效果:

    android 大图片拖拽缩放

    android 大图片拖拽缩放

    转自:http://blog.csdn.net/wangkuifeng0118/article/details/7648692

  • 相关阅读:
    Python语法入门之基本数据类型
    ASCII,GBK,和Unicode的UTF-8,UTF-16,UTF-32阐述
    为什么计算机只认识0和1?
    Intel万兆网卡82599linux驱动安装
    Django自定义分页器
    Django图片防盗链
    Django配置用户上传文件夹和暴露后端文件夹资源
    Django之TruncMonth截取日期作为新的虚拟字段使用
    第十一篇:auth模块
    第十篇:跨站请求伪造csrf
  • 原文地址:https://www.cnblogs.com/zhwl/p/2734023.html
Copyright © 2011-2022 走看看