Android实现图片放大缩小

来源:互联网 发布:阿里云学生没有库存 编辑:程序博客网 时间:2024/04/30 12:15


新版极客头条上线,每天一大波干货     任玉刚:Android开发者的职场规划     从零练就iOS高手实战班震撼来袭     新型数据库利弊谈    
 

Android实现图片放大缩小

分类: Android应用 26279人阅读 评论(7) 收藏 举报
androidlayoutbuttonactionvelocitydistance

[java] view plaincopy
  1. package com.min.Test_Gallery;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Color;  
  7. import android.graphics.Matrix;  
  8. import android.os.Bundle;  
  9. import android.util.DisplayMetrics;  
  10. import android.util.Log;  
  11. import android.view.GestureDetector;  
  12. import android.view.KeyEvent;  
  13. import android.view.MotionEvent;  
  14. import android.view.View;  
  15. import android.view.GestureDetector.OnGestureListener;  
  16. import android.view.View.OnTouchListener;  
  17. import android.widget.Button;  
  18. import android.widget.FrameLayout;  
  19. import android.widget.ImageView;  
  20. import android.widget.LinearLayout;  
  21. import android.widget.Toast;  
  22.   
  23. public class DisplayImage extends Activity implements OnTouchListener, OnGestureListener  {  
  24.     private static final String TAG = "DisplayImage";  
  25.     private static final int FLING_MIN_DISTANCE = 100;  
  26.     private static final int FLING_MIN_VELOCITY = 200;  
  27.       
  28.       
  29.     /* 相关变量声明 */  
  30.     private ImageView mImageView;  
  31.     private Button mButton01;  
  32.     private Button mButton02;  
  33.     private FrameLayout layout1;  
  34.     private LinearLayout layoutImage;  
  35.     private Bitmap bmp;  
  36.     private int id=0;  
  37.     private int displayWidth;  
  38.     private int displayHeight;  
  39.     private float scaleWidth=1;  
  40.     private float scaleHeight=1;  
  41.     private GestureDetector mGestureDetector;  
  42.       
  43.     /** Called when the activity is first created. */  
  44.     @Override  
  45.     public void onCreate(Bundle savedInstanceState)    {  
  46.         super.onCreate(savedInstanceState);  
  47.         /* 加载display.xml Layout */  
  48.         setContentView(R.layout.display);  
  49.           
  50.         /* 取得屏幕分辨率大小 */  
  51.         DisplayMetrics dm=new DisplayMetrics();  
  52.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  53.         displayWidth=dm.widthPixels;  
  54.         displayHeight=dm.heightPixels;   
  55.           
  56.         /* 初始化相关变量 */  
  57.         Bundle bundle = this.getIntent().getExtras();  
  58.         Integer imageId = bundle.getInt("imageId");  
  59.         Log.i(TAG, "onCreate, imageId = " + imageId);  
  60.                        
  61.         bmp=BitmapFactory.decodeResource(getResources(), imageId);   
  62.         mImageView = (ImageView)findViewById(R.id.myImageView);  
  63.         mImageView.setImageBitmap(bmp);  
  64.         mImageView.setOnTouchListener(this);  
  65.         mImageView.setLongClickable(true);  
  66.           
  67.         layout1 = (FrameLayout)findViewById(R.id.layout1);  
  68.         layoutImage = (LinearLayout)findViewById(R.id.layoutImage);  
  69.         mButton01 = (Button)findViewById(R.id.myButton1);  
  70.         mButton02 = (Button)findViewById(R.id.myButton2);   
  71.           
  72.         /* 缩小按钮onClickListener */  
  73.         mButton01.setOnClickListener(new Button.OnClickListener() {  
  74.             @Override  
  75.             public void onClick(View v) {  
  76.                 small();   
  77.             }  
  78.         });  
  79.           
  80.         /* 放大按钮onClickListener */  
  81.         mButton02.setOnClickListener(new Button.OnClickListener() {  
  82.             @Override         
  83.             public void onClick(View v) {  
  84.                 big();  
  85.             }   
  86.         });  
  87.     }    
  88.       
  89.     // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发  
  90.     @Override  
  91.     public boolean onDown(MotionEvent e) {  
  92.         // TODO Auto-generated method stub  
  93. //      Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();      
  94.         Log.i(TAG, "onDown...");  
  95.           
  96.         return false;  
  97.     }  
  98.   
  99.     /* 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN,  
  100.      * 多个ACTION_MOVE, 1个ACTION_UP触发 
  101.      * 参数解释:  
  102.      * e1:第1个ACTION_DOWN MotionEvent  
  103.      * e2:最后一个ACTION_MOVE MotionEvent  
  104.      * velocityX:X轴上的移动速度,像素/秒  
  105.      * velocityY:Y轴上的移动速度,像素/秒  
  106.      * 触发条件 :  
  107.      * X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒 
  108.      * @see android.view.GestureDetector$OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float) 
  109.      */  
  110.     @Override  
  111.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  112.             float velocityY) {  
  113.         // TODO Auto-generated method stub  
  114.         Log.i(TAG, "onFling...");  
  115.           
  116.         if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE      
  117.                  && Math.abs(velocityX) > FLING_MIN_VELOCITY) {      
  118.             // Fling left   
  119.   
  120.              Toast.makeText(this"Fling Left", Toast.LENGTH_SHORT).show();      
  121.          } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE      
  122.                  && Math.abs(velocityX) > FLING_MIN_VELOCITY) {      
  123.   
  124.              // Fling right   
  125.   
  126.              Toast.makeText(this"Fling Right", Toast.LENGTH_SHORT).show();      
  127.          }    
  128.           
  129.         return false;  
  130.     }  
  131.   
  132.     // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发   
  133.     @Override  
  134.     public void onLongPress(MotionEvent e) {  
  135.         // TODO Auto-generated method stub  
  136.         Log.i(TAG, "onLongPress...");  
  137.           
  138.     }  
  139.   
  140.     // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发  
  141.     @Override  
  142.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
  143.             float distanceY) {  
  144.         // TODO Auto-generated method stub  
  145.         Log.i(TAG, "onScroll...");  
  146.           
  147.         return false;  
  148.     }  
  149.   
  150.     // 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发  
  151.     // 注意和onDown()的区别,强调的是没有松开或者拖动的状态  
  152.     @Override  
  153.     public void onShowPress(MotionEvent e) {  
  154.         // TODO Auto-generated method stub  
  155.         Log.i(TAG, "onShowPress...");  
  156.           
  157.     }  
  158.   
  159.     // 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发  
  160.     @Override  
  161.     public boolean onSingleTapUp(MotionEvent e) {  
  162.         // TODO Auto-generated method stub  
  163.         Log.i(TAG, "onSingleTapUp...");  
  164.           
  165.         return false;  
  166.     }  
  167.   
  168.     @Override  
  169.     public boolean onTouch(View v, MotionEvent event) {  
  170.         // TODO Auto-generated method stub  
  171.         Log.i(TAG, "onTouch...");  
  172.           
  173.         // Set button visible  
  174.         mButton01.setVisibility(View.VISIBLE);  
  175.         mButton02.setVisibility(View.VISIBLE);  
  176.           
  177.         return  mGestureDetector.onTouchEvent(event);      
  178.     }  
  179.   
  180. //  @Override  
  181. //  public boolean onTouchEvent(MotionEvent event) {  
  182. //      // TODO Auto-generated method stub  
  183. //      super.onTouchEvent(event);  
  184. //        
  185. //      Log.i(TAG, "onTouchEvent");  
  186. //      // Set button visible  
  187. //      mButton01.setVisibility(View.VISIBLE);  
  188. //      mButton02.setVisibility(View.VISIBLE);  
  189. //        
  190. //      return true;  
  191. //  }  
  192.       
  193.     @Override  
  194.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  195.         // TODO Auto-generated method stub  
  196.         super.onKeyDown(keyCode, event);  
  197.           
  198.         Log.i(TAG, "onKeyDown...");  
  199.         // Set button visible  
  200.         mButton01.setVisibility(View.VISIBLE);  
  201.         mButton02.setVisibility(View.VISIBLE);  
  202.           
  203.         return true;  
  204.     }  
  205.   
  206.     /* 图片缩小的method */  
  207.     private void small()    {  
  208.         int bmpWidth=bmp.getWidth();   
  209.         int bmpHeight=bmp.getHeight();  
  210.           
  211.         Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);  
  212.           
  213.         /* 设置图片缩小的比例 */  
  214.         double scale=0.8;  
  215.         /* 计算出这次要缩小的比例 */   
  216.         scaleWidth=(float) (scaleWidth*scale);   
  217.         scaleHeight=(float) (scaleHeight*scale);   
  218.         /* 产生reSize后的Bitmap对象 */  
  219.         Matrix matrix = new Matrix();  
  220.         matrix.postScale(scaleWidth, scaleHeight);  
  221.         Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
  222.                 bmpHeight,matrix,true);   
  223.           
  224.         if(id==0)      {  
  225.             /* 如果是第一次按,就删除原来默认的ImageView */  
  226.             layoutImage.removeView(mImageView);  
  227.         } else {  
  228.             /* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */  
  229.             layoutImage.removeView((ImageView)findViewById(id));  
  230.         }   
  231.           
  232.         /* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */  
  233.         id++;  
  234.         ImageView imageView = new ImageView(this);  
  235.         imageView.setId(id);  
  236.         imageView.setImageBitmap(resizeBmp);  
  237.         layoutImage.addView(imageView);  
  238.         Log.i(TAG, "imageView.getWidth() = " + imageView.getWidth()  
  239.                 + ", imageView.getHeight() = " + imageView.getHeight());  
  240.         setContentView(layout1);  
  241.         /* 因为图片放到最大时放大按钮会disable,所以在缩小时把它重设为enable */   
  242.         mButton02.setEnabled(true);  
  243.         mButton02.setTextColor(Color.MAGENTA);  
  244.     }  
  245.       
  246.     /* 图片放大的method */  
  247.     private void big() {  
  248.         int bmpWidth=bmp.getWidth();  
  249.         int bmpHeight=bmp.getHeight();  
  250.           
  251.         Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);  
  252.           
  253.         /* 设置图片放大的比例 */  
  254.         double scale=1.25;  
  255.         /* 计算这次要放大的比例 */  
  256.         scaleWidth=(float)(scaleWidth*scale);  
  257.         scaleHeight=(float)(scaleHeight*scale);  
  258.         /* 产生reSize后的Bitmap对象 */  
  259.         Matrix matrix = new Matrix();  
  260.         matrix.postScale(scaleWidth, scaleHeight);  
  261.         Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
  262.                 bmpHeight,matrix,true);  
  263.           
  264.         if(id==0) {  
  265.             /* 如果是第一次按,就删除原来设置的ImageView */  
  266.             layoutImage.removeView(mImageView);  
  267.         } else {  
  268.             /* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */   
  269.             layoutImage.removeView((ImageView)findViewById(id));  
  270.         }  
  271.           
  272.         /* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */  
  273.         id++;  
  274.         ImageView imageView = new ImageView(this);  
  275.         imageView.setId(id);  
  276.         imageView.setImageBitmap(resizeBmp);  
  277.         layoutImage.addView(imageView);  
  278.         setContentView(layout1);  
  279.         /* 如果再放大会超过屏幕大小,就把Button disable */  
  280.         if( scaleWidth * scale * bmpWidth > bmpWidth * 3 ||  
  281.             scaleHeight * scale * bmpHeight > bmpWidth * 3 ||  
  282.             scaleWidth * scale * bmpWidth > displayWidth * 5 ||  
  283.             scaleHeight * scale * bmpHeight > displayHeight * 5) {  
  284.                 mButton02.setEnabled(false);  
  285.                 mButton02.setTextColor(Color.GRAY);  
  286.             } else {  
  287.                 mButton02.setEnabled(true);  
  288.                 mButton02.setTextColor(Color.MAGENTA);  
  289.             }  
  290.         }   
  291.       
  292. }  

 

display.xml文件

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:id="@+id/layout1"  
  7.     >  
  8.   
  9.     <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"     
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content"   
  12.         android:layout_weight="19"  
  13.         android:scrollbars="vertical"  
  14.         android:fadingEdge="vertical">  
  15.     <HorizontalScrollView   
  16.         android:layout_height="fill_parent"  
  17.         android:layout_width="wrap_content">  
  18.         <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  19.             android:orientation="horizontal"  
  20.             android:layout_width="fill_parent"  
  21.             android:layout_height="wrap_content"  
  22.             android:gravity="center"  
  23.             android:id="@+id/layoutImage"  
  24.             >  
  25.             <ImageView  
  26.                 android:id="@+id/myImageView"  
  27.                 android:layout_width="fill_parent"  
  28.                 android:layout_height="wrap_content"  
  29.                 android:layout_weight="19"  
  30.                 android:paddingTop="5dip"  
  31.                 android:paddingBottom="5dip"  
  32.                 />  
  33.         </LinearLayout>  
  34.     </HorizontalScrollView >  
  35.     </ScrollView>   
  36.   
  37.     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  38.         android:layout_width="fill_parent"  
  39.         android:layout_height="wrap_content"  
  40.         >  
  41.         <Button  
  42.             android:id="@+id/myButton1"  
  43.             android:layout_width="45dip"  
  44.             android:layout_height="30dip"  
  45.             android:layout_alignParentLeft="true"  
  46.             android:gravity="left"  
  47.             style="@style/my_style_button"  
  48.             android:visibility="gone"  
  49.             android:text="缩小"  
  50.             />  
  51.         <Button  
  52.             android:id="@+id/myButton2"  
  53.             android:layout_width="45dip"  
  54.             android:layout_height="30dip"  
  55.             android:layout_alignParentRight="true"  
  56.             android:gravity="right"  
  57.             style="@style/my_style_button"  
  58.             android:visibility="gone"  
  59.             android:text="放大"  
  60.             />  
  61.     </RelativeLayout>  
  62. </FrameLayout>  

版权声明:本文为博主原创文章,未经博主允许不得转载。

主题推荐
android图片imageviewvelocityboolean
猜你在找
Apple Watch开发入门
JavaScript for Qt Quick(QML)
反编译Android应用
APP内置IM 系统——从入门到千万级在线
网络赚钱靠谱项目推荐
Android支付接入一支付宝
分享45个android实例源码很好很强大收藏吧
Android Service 详解四开始停止service
android消息广播Intent传递数据
Android UI设计与开发第15期顶部标题栏六实现悬浮式顶部和底部标题栏效果
准备好了么? 更多职位尽在 
移动-IOS开发工程师
北京爱奇艺科技有限公司
15-30K/月
我要跳槽
iOS开发工程师
上海彩亿信息技术有限公司
8-15K/月
我要跳槽
iOS
人民网股份有限公司
12-15K/月
我要跳槽
IOS工程师
路普达网络科技(北京)有限公司
10-20K/月
我要跳槽
查看评论
7楼 BinaryIsAll 2014-12-03 15:42发表 [回复]
坑了多少人,Matrix.postScale传入的参数是缩放比率,你传的是什么?
6楼 gxh9314 2013-12-16 15:37发表 [回复]
ImageId,找不到Source。代码不全,鉴定完毕
5楼 huhuaohua 2013-10-21 16:26发表 [回复]
能发整个工程看看吗
4楼 ameyume 2012-03-19 09:19发表 [回复]
可以用按钮缩放,不是拖动缩放。
3楼 sipolan 2012-03-15 17:53发表 [回复]
确实不行啊。。。好多错误啊。。。
2楼 cwjtojava 2012-02-20 14:41发表 [回复]
好像不行呢。
1楼 liangzl1986 2011-08-18 09:41发表 [回复]
效果图都不给一张啊哥子。
发表评论
  • 用 户 名:
  • Leaning_wk
  • 评论内容:
  • 插入代码
      
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
核心技术类目
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStack VPN Spark ERP IE10Eclipse CRM JavaScript 数据库 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IISFedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTCcoremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech PerlTornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap
    个人资料
     
    ameyume
     
    2
    • 访问:1410114次
    • 积分:15235
    • 等级: 
    • 排名:第294名
    • 原创:245篇
    • 转载:83篇
    • 译文:1篇
    • 评论:457条
    博客专栏
    Android多媒体

    文章:15篇

    阅读:118133
    文章分类
  • Android应用(102)
  • Android面试(1)
  • C/C++(36)
  • DRM(数字版权管理)(2)
  • java(26)
  • office(2)
  • Ubuntu/Linux(25)
  • vb(1)
  • VC/MFC(15)
  • 其他(4)
  • 计算机使用(5)
  • 面试(2)
  • 多媒体(23)
  • android多媒体(35)
  • android framework(24)
  • 随感(9)
  • cpu(1)
  • 手机使用(5)
  • Android Audio系统(10)
  • 数据库(7)
  • 图形图像(2)
  • C#(2)
  • QT(1)
  • 网络(3)
  • Android媒体扫描(3)
  • Android编译(2)
  • 电池状态 电池信息(1)
    文章存档
  • 2015年06月(1)
  • 2015年05月(3)
  • 2015年04月(1)
  • 2015年02月(1)
  • 2015年01月(1)
  • 展开
    阅读排行
  • Android Dialog用法(67979)
  • Android实现下载图片并保存到SD卡中(52033)
  • 视频码率,帧率和分辨率的联系与区别(49499)
  • QT开发环境安装配置教程(48509)
  • Android TextView属性详解(33307)
  • Android SystemProperties设置/取得系统属性的用法总结(27512)
  • Android实现图片放大缩小(26238)
  • 用Iterator实现遍历集合(21000)
  • Android通过onDraw实现在View中绘图操作(20289)
  • Android客户端与PC服务器通过socket进行交互实例(20017)
    评论排行
  • Android实现下载图片并保存到SD卡中(62)
  • Android客户端与PC服务器通过socket进行交互实例(49)
  • android和RTSP视频文件播放(一)(23)
  • Android Dialog用法(19)
  • ICS4.0.3创建NuPlayer的处理流程(12)
  • QT开发环境安装配置教程(12)
  • android手势操作滑动效果触摸屏事件处理(11)
  • java String的equals,intern方法(10)
  • Android个人所得税计算器(8)
  • Android实现秒表计时器的程序设计(8)
    推荐文章
      最新评论
    • 用Iterator实现遍历集合

      ouleioulei: 还不错,学习了

    • 用Iterator实现遍历集合

      tuspark2015: ArrayList的Iterator实现可以看这里的介绍:http://swiftlet.net/a...

    • Android客户端与PC服务器通过socket进行交互实例

      yanziz123: 为什么服务器一直都是S: Connecting...?哪位大神能给指点一二啊?谢谢谢谢

    • Android客户端与PC服务器通过socket进行交互实例

      yanziz123: 为什么服务器一直都是S: Connecting...?哪位大神能给指点一二啊?谢谢谢谢

    • android手势操作滑动效果触摸屏事件处理

      大左来自火星: 有没有完成的DEMO哦!!

    • Android客户端与PC服务器通过socket进行交互实例

      爱小谢: @lihongjie123:1055251337@qq.com好人一生平安,谢谢谢谢

    • Android客户端与PC服务器通过socket进行交互实例

      爱小谢: @lihongjie123:1055251337@qq.com好人一生平安,谢谢谢谢

    • Android实现秒表计时器的程序设计

      ice_eyes: 点击系统菜单再点击设置时间单位时,没有弹出时间单位设置的菜单,是不是switch里 SETTING_...

    • Android客户端与PC服务器通过socket进行交互实例

      HZDZKJDXchenpeng: 求份可运行代码,谢谢,2601349541@qq.com

    • 指针函数与函数指针

      某种意境: 好文,理解了。

      我的空间
      • Android源码下载方法
      • Downloading the Source Tree
      • MSM/QSD Android Enablement Project
      • Android Market
      • Android官方在线API
      • stackoverflow
      • http://code.google.com/p/android/issues/list
      • eoe Android API Guides
      • 中国移动终端测试网站
     
    新版极客头条上线,每天一大波干货     任玉刚:Android开发者的职场规划     从零练就iOS高手实战班震撼来袭     新型数据库利弊谈    
     

    Android实现图片放大缩小

    分类: Android应用 26279人阅读 评论(7) 收藏 举报
    androidlayoutbuttonactionvelocitydistance

    [java] view plaincopy
    1. package com.min.Test_Gallery;  
    2.   
    3. import android.app.Activity;  
    4. import android.graphics.Bitmap;  
    5. import android.graphics.BitmapFactory;  
    6. import android.graphics.Color;  
    7. import android.graphics.Matrix;  
    8. import android.os.Bundle;  
    9. import android.util.DisplayMetrics;  
    10. import android.util.Log;  
    11. import android.view.GestureDetector;  
    12. import android.view.KeyEvent;  
    13. import android.view.MotionEvent;  
    14. import android.view.View;  
    15. import android.view.GestureDetector.OnGestureListener;  
    16. import android.view.View.OnTouchListener;  
    17. import android.widget.Button;  
    18. import android.widget.FrameLayout;  
    19. import android.widget.ImageView;  
    20. import android.widget.LinearLayout;  
    21. import android.widget.Toast;  
    22.   
    23. public class DisplayImage extends Activity implements OnTouchListener, OnGestureListener  {  
    24.     private static final String TAG = "DisplayImage";  
    25.     private static final int FLING_MIN_DISTANCE = 100;  
    26.     private static final int FLING_MIN_VELOCITY = 200;  
    27.       
    28.       
    29.     /* 相关变量声明 */  
    30.     private ImageView mImageView;  
    31.     private Button mButton01;  
    32.     private Button mButton02;  
    33.     private FrameLayout layout1;  
    34.     private LinearLayout layoutImage;  
    35.     private Bitmap bmp;  
    36.     private int id=0;  
    37.     private int displayWidth;  
    38.     private int displayHeight;  
    39.     private float scaleWidth=1;  
    40.     private float scaleHeight=1;  
    41.     private GestureDetector mGestureDetector;  
    42.       
    43.     /** Called when the activity is first created. */  
    44.     @Override  
    45.     public void onCreate(Bundle savedInstanceState)    {  
    46.         super.onCreate(savedInstanceState);  
    47.         /* 加载display.xml Layout */  
    48.         setContentView(R.layout.display);  
    49.           
    50.         /* 取得屏幕分辨率大小 */  
    51.         DisplayMetrics dm=new DisplayMetrics();  
    52.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
    53.         displayWidth=dm.widthPixels;  
    54.         displayHeight=dm.heightPixels;   
    55.           
    56.         /* 初始化相关变量 */  
    57.         Bundle bundle = this.getIntent().getExtras();  
    58.         Integer imageId = bundle.getInt("imageId");  
    59.         Log.i(TAG, "onCreate, imageId = " + imageId);  
    60.                        
    61.         bmp=BitmapFactory.decodeResource(getResources(), imageId);   
    62.         mImageView = (ImageView)findViewById(R.id.myImageView);  
    63.         mImageView.setImageBitmap(bmp);  
    64.         mImageView.setOnTouchListener(this);  
    65.         mImageView.setLongClickable(true);  
    66.           
    67.         layout1 = (FrameLayout)findViewById(R.id.layout1);  
    68.         layoutImage = (LinearLayout)findViewById(R.id.layoutImage);  
    69.         mButton01 = (Button)findViewById(R.id.myButton1);  
    70.         mButton02 = (Button)findViewById(R.id.myButton2);   
    71.           
    72.         /* 缩小按钮onClickListener */  
    73.         mButton01.setOnClickListener(new Button.OnClickListener() {  
    74.             @Override  
    75.             public void onClick(View v) {  
    76.                 small();   
    77.             }  
    78.         });  
    79.           
    80.         /* 放大按钮onClickListener */  
    81.         mButton02.setOnClickListener(new Button.OnClickListener() {  
    82.             @Override         
    83.             public void onClick(View v) {  
    84.                 big();  
    85.             }   
    86.         });  
    87.     }    
    88.       
    89.     // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发  
    90.     @Override  
    91.     public boolean onDown(MotionEvent e) {  
    92.         // TODO Auto-generated method stub  
    93. //      Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();      
    94.         Log.i(TAG, "onDown...");  
    95.           
    96.         return false;  
    97.     }  
    98.   
    99.     /* 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN,  
    100.      * 多个ACTION_MOVE, 1个ACTION_UP触发 
    101.      * 参数解释:  
    102.      * e1:第1个ACTION_DOWN MotionEvent  
    103.      * e2:最后一个ACTION_MOVE MotionEvent  
    104.      * velocityX:X轴上的移动速度,像素/秒  
    105.      * velocityY:Y轴上的移动速度,像素/秒  
    106.      * 触发条件 :  
    107.      * X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒 
    108.      * @see android.view.GestureDetector$OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float) 
    109.      */  
    110.     @Override  
    111.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
    112.             float velocityY) {  
    113.         // TODO Auto-generated method stub  
    114.         Log.i(TAG, "onFling...");  
    115.           
    116.         if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE      
    117.                  && Math.abs(velocityX) > FLING_MIN_VELOCITY) {      
    118.             // Fling left   
    119.   
    120.              Toast.makeText(this"Fling Left", Toast.LENGTH_SHORT).show();      
    121.          } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE      
    122.                  && Math.abs(velocityX) > FLING_MIN_VELOCITY) {      
    123.   
    124.              // Fling right   
    125.   
    126.              Toast.makeText(this"Fling Right", Toast.LENGTH_SHORT).show();      
    127.          }    
    128.           
    129.         return false;  
    130.     }  
    131.   
    132.     // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发   
    133.     @Override  
    134.     public void onLongPress(MotionEvent e) {  
    135.         // TODO Auto-generated method stub  
    136.         Log.i(TAG, "onLongPress...");  
    137.           
    138.     }  
    139.   
    140.     // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发  
    141.     @Override  
    142.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
    143.             float distanceY) {  
    144.         // TODO Auto-generated method stub  
    145.         Log.i(TAG, "onScroll...");  
    146.           
    147.         return false;  
    148.     }  
    149.   
    150.     // 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发  
    151.     // 注意和onDown()的区别,强调的是没有松开或者拖动的状态  
    152.     @Override  
    153.     public void onShowPress(MotionEvent e) {  
    154.         // TODO Auto-generated method stub  
    155.         Log.i(TAG, "onShowPress...");  
    156.           
    157.     }  
    158.   
    159.     // 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发  
    160.     @Override  
    161.     public boolean onSingleTapUp(MotionEvent e) {  
    162.         // TODO Auto-generated method stub  
    163.         Log.i(TAG, "onSingleTapUp...");  
    164.           
    165.         return false;  
    166.     }  
    167.   
    168.     @Override  
    169.     public boolean onTouch(View v, MotionEvent event) {  
    170.         // TODO Auto-generated method stub  
    171.         Log.i(TAG, "onTouch...");  
    172.           
    173.         // Set button visible  
    174.         mButton01.setVisibility(View.VISIBLE);  
    175.         mButton02.setVisibility(View.VISIBLE);  
    176.           
    177.         return  mGestureDetector.onTouchEvent(event);      
    178.     }  
    179.   
    180. //  @Override  
    181. //  public boolean onTouchEvent(MotionEvent event) {  
    182. //      // TODO Auto-generated method stub  
    183. //      super.onTouchEvent(event);  
    184. //        
    185. //      Log.i(TAG, "onTouchEvent");  
    186. //      // Set button visible  
    187. //      mButton01.setVisibility(View.VISIBLE);  
    188. //      mButton02.setVisibility(View.VISIBLE);  
    189. //        
    190. //      return true;  
    191. //  }  
    192.       
    193.     @Override  
    194.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
    195.         // TODO Auto-generated method stub  
    196.         super.onKeyDown(keyCode, event);  
    197.           
    198.         Log.i(TAG, "onKeyDown...");  
    199.         // Set button visible  
    200.         mButton01.setVisibility(View.VISIBLE);  
    201.         mButton02.setVisibility(View.VISIBLE);  
    202.           
    203.         return true;  
    204.     }  
    205.   
    206.     /* 图片缩小的method */  
    207.     private void small()    {  
    208.         int bmpWidth=bmp.getWidth();   
    209.         int bmpHeight=bmp.getHeight();  
    210.           
    211.         Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);  
    212.           
    213.         /* 设置图片缩小的比例 */  
    214.         double scale=0.8;  
    215.         /* 计算出这次要缩小的比例 */   
    216.         scaleWidth=(float) (scaleWidth*scale);   
    217.         scaleHeight=(float) (scaleHeight*scale);   
    218.         /* 产生reSize后的Bitmap对象 */  
    219.         Matrix matrix = new Matrix();  
    220.         matrix.postScale(scaleWidth, scaleHeight);  
    221.         Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
    222.                 bmpHeight,matrix,true);   
    223.           
    224.         if(id==0)      {  
    225.             /* 如果是第一次按,就删除原来默认的ImageView */  
    226.             layoutImage.removeView(mImageView);  
    227.         } else {  
    228.             /* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */  
    229.             layoutImage.removeView((ImageView)findViewById(id));  
    230.         }   
    231.           
    232.         /* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */  
    233.         id++;  
    234.         ImageView imageView = new ImageView(this);  
    235.         imageView.setId(id);  
    236.         imageView.setImageBitmap(resizeBmp);  
    237.         layoutImage.addView(imageView);  
    238.         Log.i(TAG, "imageView.getWidth() = " + imageView.getWidth()  
    239.                 + ", imageView.getHeight() = " + imageView.getHeight());  
    240.         setContentView(layout1);  
    241.         /* 因为图片放到最大时放大按钮会disable,所以在缩小时把它重设为enable */   
    242.         mButton02.setEnabled(true);  
    243.         mButton02.setTextColor(Color.MAGENTA);  
    244.     }  
    245.       
    246.     /* 图片放大的method */  
    247.     private void big() {  
    248.         int bmpWidth=bmp.getWidth();  
    249.         int bmpHeight=bmp.getHeight();  
    250.           
    251.         Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);  
    252.           
    253.         /* 设置图片放大的比例 */  
    254.         double scale=1.25;  
    255.         /* 计算这次要放大的比例 */  
    256.         scaleWidth=(float)(scaleWidth*scale);  
    257.         scaleHeight=(float)(scaleHeight*scale);  
    258.         /* 产生reSize后的Bitmap对象 */  
    259.         Matrix matrix = new Matrix();  
    260.         matrix.postScale(scaleWidth, scaleHeight);  
    261.         Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
    262.                 bmpHeight,matrix,true);  
    263.           
    264.         if(id==0) {  
    265.             /* 如果是第一次按,就删除原来设置的ImageView */  
    266.             layoutImage.removeView(mImageView);  
    267.         } else {  
    268.             /* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */   
    269.             layoutImage.removeView((ImageView)findViewById(id));  
    270.         }  
    271.           
    272.         /* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */  
    273.         id++;  
    274.         ImageView imageView = new ImageView(this);  
    275.         imageView.setId(id);  
    276.         imageView.setImageBitmap(resizeBmp);  
    277.         layoutImage.addView(imageView);  
    278.         setContentView(layout1);  
    279.         /* 如果再放大会超过屏幕大小,就把Button disable */  
    280.         if( scaleWidth * scale * bmpWidth > bmpWidth * 3 ||  
    281.             scaleHeight * scale * bmpHeight > bmpWidth * 3 ||  
    282.             scaleWidth * scale * bmpWidth > displayWidth * 5 ||  
    283.             scaleHeight * scale * bmpHeight > displayHeight * 5) {  
    284.                 mButton02.setEnabled(false);  
    285.                 mButton02.setTextColor(Color.GRAY);  
    286.             } else {  
    287.                 mButton02.setEnabled(true);  
    288.                 mButton02.setTextColor(Color.MAGENTA);  
    289.             }  
    290.         }   
    291.       
    292. }  

     

    display.xml文件

    [xhtml] view plaincopy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:orientation="vertical"  
    4.     android:layout_width="fill_parent"  
    5.     android:layout_height="fill_parent"  
    6.     android:id="@+id/layout1"  
    7.     >  
    8.   
    9.     <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"     
    10.         android:layout_width="fill_parent"  
    11.         android:layout_height="wrap_content"   
    12.         android:layout_weight="19"  
    13.         android:scrollbars="vertical"  
    14.         android:fadingEdge="vertical">  
    15.     <HorizontalScrollView   
    16.         android:layout_height="fill_parent"  
    17.         android:layout_width="wrap_content">  
    18.         <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    19.             android:orientation="horizontal"  
    20.             android:layout_width="fill_parent"  
    21.             android:layout_height="wrap_content"  
    22.             android:gravity="center"  
    23.             android:id="@+id/layoutImage"  
    24.             >  
    25.             <ImageView  
    26.                 android:id="@+id/myImageView"  
    27.                 android:layout_width="fill_parent"  
    28.                 android:layout_height="wrap_content"  
    29.                 android:layout_weight="19"  
    30.                 android:paddingTop="5dip"  
    31.                 android:paddingBottom="5dip"  
    32.                 />  
    33.         </LinearLayout>  
    34.     </HorizontalScrollView >  
    35.     </ScrollView>   
    36.   
    37.     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    38.         android:layout_width="fill_parent"  
    39.         android:layout_height="wrap_content"  
    40.         >  
    41.         <Button  
    42.             android:id="@+id/myButton1"  
    43.             android:layout_width="45dip"  
    44.             android:layout_height="30dip"  
    45.             android:layout_alignParentLeft="true"  
    46.             android:gravity="left"  
    47.             style="@style/my_style_button"  
    48.             android:visibility="gone"  
    49.             android:text="缩小"  
    50.             />  
    51.         <Button  
    52.             android:id="@+id/myButton2"  
    53.             android:layout_width="45dip"  
    54.             android:layout_height="30dip"  
    55.             android:layout_alignParentRight="true"  
    56.             android:gravity="right"  
    57.             style="@style/my_style_button"  
    58.             android:visibility="gone"  
    59.             android:text="放大"  
    60.             />  
    61.     </RelativeLayout>  
    62. </FrameLayout>  

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    主题推荐
    android图片imageviewvelocityboolean
    猜你在找
    Apple Watch开发入门
    JavaScript for Qt Quick(QML)
    反编译Android应用
    APP内置IM 系统——从入门到千万级在线
    网络赚钱靠谱项目推荐
    Android支付接入一支付宝
    分享45个android实例源码很好很强大收藏吧
    Android Service 详解四开始停止service
    android消息广播Intent传递数据
    Android UI设计与开发第15期顶部标题栏六实现悬浮式顶部和底部标题栏效果
    准备好了么? 更多职位尽在 
    移动-IOS开发工程师
    北京爱奇艺科技有限公司
    15-30K/月
    我要跳槽
    iOS开发工程师
    上海彩亿信息技术有限公司
    8-15K/月
    我要跳槽
    iOS
    人民网股份有限公司
    12-15K/月
    我要跳槽
    IOS工程师
    路普达网络科技(北京)有限公司
    10-20K/月
    我要跳槽
    查看评论
    7楼 BinaryIsAll 2014-12-03 15:42发表 [回复]
    坑了多少人,Matrix.postScale传入的参数是缩放比率,你传的是什么?
    6楼 gxh9314 2013-12-16 15:37发表 [回复]
    ImageId,找不到Source。代码不全,鉴定完毕
    5楼 huhuaohua 2013-10-21 16:26发表 [回复]
    能发整个工程看看吗
    4楼 ameyume 2012-03-19 09:19发表 [回复]
    可以用按钮缩放,不是拖动缩放。
    3楼 sipolan 2012-03-15 17:53发表 [回复]
    确实不行啊。。。好多错误啊。。。
    2楼 cwjtojava 2012-02-20 14:41发表 [回复]
    好像不行呢。
    1楼 liangzl1986 2011-08-18 09:41发表 [回复]
    效果图都不给一张啊哥子。
    发表评论
    • 用 户 名:
    • Leaning_wk
    • 评论内容:
    • 插入代码
        
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    核心技术类目
    全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStack VPN Spark ERP IE10Eclipse CRM JavaScript 数据库 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IISFedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTCcoremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech PerlTornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap
      个人资料
       
      ameyume
       
      2
      • 访问:1410114次
      • 积分:15235
      • 等级: 
      • 排名:第294名
      • 原创:245篇
      • 转载:83篇
      • 译文:1篇
      • 评论:457条
      博客专栏
      Android多媒体

      文章:15篇

      阅读:118133
      文章分类
    • Android应用(102)
    • Android面试(1)
    • C/C++(36)
    • DRM(数字版权管理)(2)
    • java(26)
    • office(2)
    • Ubuntu/Linux(25)
    • vb(1)
    • VC/MFC(15)
    • 其他(4)
    • 计算机使用(5)
    • 面试(2)
    • 多媒体(23)
    • android多媒体(35)
    • android framework(24)
    • 随感(9)
    • cpu(1)
    • 手机使用(5)
    • Android Audio系统(10)
    • 数据库(7)
    • 图形图像(2)
    • C#(2)
    • QT(1)
    • 网络(3)
    • Android媒体扫描(3)
    • Android编译(2)
    • 电池状态 电池信息(1)
      文章存档
    • 2015年06月(1)
    • 2015年05月(3)
    • 2015年04月(1)
    • 2015年02月(1)
    • 2015年01月(1)
      展开
      阅读排行
    • Android Dialog用法(67979)
    • Android实现下载图片并保存到SD卡中(52033)
    • 视频码率,帧率和分辨率的联系与区别(49499)
    • QT开发环境安装配置教程(48509)
    • Android TextView属性详解(33307)
    • Android SystemProperties设置/取得系统属性的用法总结(27512)
    • Android实现图片放大缩小(26238)
    • 用Iterator实现遍历集合(21000)
    • Android通过onDraw实现在View中绘图操作(20289)
    • Android客户端与PC服务器通过socket进行交互实例(20017)
      评论排行
    • Android实现下载图片并保存到SD卡中(62)
    • Android客户端与PC服务器通过socket进行交互实例(49)
    • android和RTSP视频文件播放(一)(23)
    • Android Dialog用法(19)
    • ICS4.0.3创建NuPlayer的处理流程(12)
    • QT开发环境安装配置教程(12)
    • android手势操作滑动效果触摸屏事件处理(11)
    • java String的equals,intern方法(10)
    • Android个人所得税计算器(8)
    • Android实现秒表计时器的程序设计(8)
      推荐文章
        最新评论
      • 用Iterator实现遍历集合

        ouleioulei: 还不错,学习了

      • 用Iterator实现遍历集合

        tuspark2015: ArrayList的Iterator实现可以看这里的介绍:http://swiftlet.net/a...

      • Android客户端与PC服务器通过socket进行交互实例

        yanziz123: 为什么服务器一直都是S: Connecting...?哪位大神能给指点一二啊?谢谢谢谢

      • Android客户端与PC服务器通过socket进行交互实例

        yanziz123: 为什么服务器一直都是S: Connecting...?哪位大神能给指点一二啊?谢谢谢谢

      • android手势操作滑动效果触摸屏事件处理

        大左来自火星: 有没有完成的DEMO哦!!

      • Android客户端与PC服务器通过socket进行交互实例

        爱小谢: @lihongjie123:1055251337@qq.com好人一生平安,谢谢谢谢

      • Android客户端与PC服务器通过socket进行交互实例

        爱小谢: @lihongjie123:1055251337@qq.com好人一生平安,谢谢谢谢

      • Android实现秒表计时器的程序设计

        ice_eyes: 点击系统菜单再点击设置时间单位时,没有弹出时间单位设置的菜单,是不是switch里 SETTING_...

      • Android客户端与PC服务器通过socket进行交互实例

        HZDZKJDXchenpeng: 求份可运行代码,谢谢,2601349541@qq.com

      • 指针函数与函数指针

        某种意境: 好文,理解了。

        我的空间
        • Android源码下载方法
        • Downloading the Source Tree
        • MSM/QSD Android Enablement Project
        • Android Market
        • Android官方在线API
        • stackoverflow
        • http://code.google.com/p/android/issues/list
        • eoe Android API Guides
        • 中国移动终端测试网站
       
      1 0