Android实现图片放大缩小



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

Android实现图片放大缩小

分类: Android应用   26279人阅读  评论(7)  收藏  举报
android layout button action velocity distance

[java]  view plain copy
  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 plain copy
  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 图片 imageview velocity boolean
猜你在找
Apple Watch开发入门
JavaScript for Qt Quick(QML)
反编译Android应用
APP内置IM 系统——从入门到千万级在线
网络赚钱靠谱项目推荐
Android支付接入一支付宝
分享45个android实例源码很好很强大收藏吧
Android Service 详解四开始停止service
android消息广播Intent传递数据
Android UI设计与开发第15期顶部标题栏六实现悬浮式顶部和底部标题栏效果
准备好了么? 跳吧             ! 更多职位尽在 CSDN JOB
移动-IOS开发工程师
北京爱奇艺科技有限公司
|
15-30K/月
我要跳槽
iOS开发工程师
上海彩亿信息技术有限公司
|
8-15K/月
我要跳槽
iOS
人民网股份有限公司
|
12-15K/月
我要跳槽
IOS工程师
路普达网络科技(北京)有限公司
|
10-20K/月
我要跳槽
id="ad_frm_0" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=4&containerId=ad_cen&frmId=ad_frm_0" style="border-width: 0px; overflow: hidden; width: 984px; height: 90px;">
查看评论
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网站的观点或立场
id="ad_frm_1" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=5&containerId=ad_bot&frmId=ad_frm_1" style="border-width: 0px; overflow: hidden; width: 984px; height: 0px;">
核心技术类目
全部主题  Hadoop  AWS  移动游戏  Java  Android  iOS  Swift  智能硬件  Docker  OpenStack  VPN  Spark  ERP  IE10 Eclipse  CRM  JavaScript  数据库  Ubuntu  NFC  WAP  jQuery  BI  HTML5  Spring  Apache  .NET  API  HTML  SDK  IIS Fedora  XML  LBS  Unity  Splashtop  UML  components  Windows Mobile  Rails  QEMU  KDE  Cassandra  CloudStack  FTC coremail  OPhone  CouchBase  云计算  iOS6  Rackspace  Web App  SpringSide  Maemo  Compuware  大数据  aptech  Perl Tornado  Ruby  Hibernate  ThinkPHP  HBase  Pure  Solr  Angular  Cloud Foundry  Redis  Scala  Django  Bootstrap
  • 个人资料
  • Android实现图片放大缩小_第1张图片 
    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)
  • 推荐文章
  • id="ad_frm_2" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=12&containerId=ad_commend&frmId=ad_frm_2" style="border-width: 0px; overflow: hidden; width: 194px; height: 200px;">
  • 最新评论
  • 用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:[email protected]好人一生平安,谢谢谢谢

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

    爱小谢: @lihongjie123:[email protected]好人一生平安,谢谢谢谢

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

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

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

    HZDZKJDXchenpeng: 求份可运行代码,谢谢,[email protected]

  • 指针函数与函数指针

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

  • 我的空间
    • 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
    • 中国移动终端测试网站
  src="http://zz.csdn.net/bin/logs.php" frameborder="0" width="0" height="0">
新版极客头条上线,每天一大波干货      任玉刚:Android开发者的职场规划      从零练就iOS高手实战班震撼来袭      新型数据库利弊谈    
 

Android实现图片放大缩小

分类: Android应用   26279人阅读  评论(7)  收藏  举报
android layout button action velocity distance

[java]  view plain copy
  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 plain copy
  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 图片 imageview velocity boolean
猜你在找
Apple Watch开发入门
JavaScript for Qt Quick(QML)
反编译Android应用
APP内置IM 系统——从入门到千万级在线
网络赚钱靠谱项目推荐
Android支付接入一支付宝
分享45个android实例源码很好很强大收藏吧
Android Service 详解四开始停止service
android消息广播Intent传递数据
Android UI设计与开发第15期顶部标题栏六实现悬浮式顶部和底部标题栏效果
准备好了么? 跳吧             ! 更多职位尽在 CSDN JOB
移动-IOS开发工程师
北京爱奇艺科技有限公司
|
15-30K/月
我要跳槽
iOS开发工程师
上海彩亿信息技术有限公司
|
8-15K/月
我要跳槽
iOS
人民网股份有限公司
|
12-15K/月
我要跳槽
IOS工程师
路普达网络科技(北京)有限公司
|
10-20K/月
我要跳槽
id="ad_frm_0" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=4&containerId=ad_cen&frmId=ad_frm_0" style="border-width: 0px; overflow: hidden; width: 984px; height: 90px;">
查看评论
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网站的观点或立场
id="ad_frm_1" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=5&containerId=ad_bot&frmId=ad_frm_1" style="border-width: 0px; overflow: hidden; width: 984px; height: 0px;">
核心技术类目
全部主题  Hadoop  AWS  移动游戏  Java  Android  iOS  Swift  智能硬件  Docker  OpenStack  VPN  Spark  ERP  IE10 Eclipse  CRM  JavaScript  数据库  Ubuntu  NFC  WAP  jQuery  BI  HTML5  Spring  Apache  .NET  API  HTML  SDK  IIS Fedora  XML  LBS  Unity  Splashtop  UML  components  Windows Mobile  Rails  QEMU  KDE  Cassandra  CloudStack  FTC coremail  OPhone  CouchBase  云计算  iOS6  Rackspace  Web App  SpringSide  Maemo  Compuware  大数据  aptech  Perl Tornado  Ruby  Hibernate  ThinkPHP  HBase  Pure  Solr  Angular  Cloud Foundry  Redis  Scala  Django  Bootstrap
  • 个人资料
  • Android实现图片放大缩小_第2张图片 
    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)
  • 推荐文章
  • id="ad_frm_2" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=12&containerId=ad_commend&frmId=ad_frm_2" style="border-width: 0px; overflow: hidden; width: 194px; height: 200px;">
  • 最新评论
  • 用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:[email protected]好人一生平安,谢谢谢谢

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

    爱小谢: @lihongjie123:[email protected]好人一生平安,谢谢谢谢

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

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

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

    HZDZKJDXchenpeng: 求份可运行代码,谢谢,[email protected]

  • 指针函数与函数指针

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

  • 我的空间
    • 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,图片缩放处理)