liuming794 发表于 2015-10-14 08:16:25

Android实现图片放大缩小


[*]
[*]
[*]
[*]
[*]
[*]
蓝蓝的天
蓝蓝的天,白云朵朵。 White clouds in the blue sky.

[*]目录视图
[*]摘要视图
[*]订阅
新版极客头条上线,每天一大波干货   任玉刚:Android开发者的职场规划     从零练就iOS高手实战班震撼来袭     新型数据库利弊谈     Android实现图片放大缩小
分类: Android应用2010-12-2114:05 26279人阅读 评论(7) 收藏 举报androidlayoutbuttonactionvelocitydistance
viewplaincopy
[*]package com.min.Test_Gallery;
[*]
[*]import android.app.Activity;
[*]import android.graphics.Bitmap;
[*]import android.graphics.BitmapFactory;
[*]import android.graphics.Color;
[*]import android.graphics.Matrix;
[*]import android.os.Bundle;
[*]import android.util.DisplayMetrics;
[*]import android.util.Log;
[*]import android.view.GestureDetector;
[*]import android.view.KeyEvent;
[*]import android.view.MotionEvent;
[*]import android.view.View;
[*]import android.view.GestureDetector.OnGestureListener;
[*]import android.view.View.OnTouchListener;
[*]import android.widget.Button;
[*]import android.widget.FrameLayout;
[*]import android.widget.ImageView;
[*]import android.widget.LinearLayout;
[*]import android.widget.Toast;
[*]
[*]public class DisplayImage extends Activity implements OnTouchListener, OnGestureListener{
[*]    private static final String TAG = "DisplayImage";
[*]    private static final int FLING_MIN_DISTANCE = 100;
[*]    private static final int FLING_MIN_VELOCITY = 200;
[*]      
[*]      
[*]    /* 相关变量声明 */
[*]    private ImageView mImageView;
[*]    private Button mButton01;
[*]    private Button mButton02;
[*]    private FrameLayout layout1;
[*]    private LinearLayout layoutImage;
[*]    private Bitmap bmp;
[*]    private int id=0;
[*]    private int displayWidth;
[*]    private int displayHeight;
[*]    private float scaleWidth=1;
[*]    private float scaleHeight=1;
[*]    private GestureDetector mGestureDetector;
[*]      
[*]    /** Called when the activity is first created. */
[*]    @Override
[*]    public void onCreate(Bundle savedInstanceState)    {
[*]      super.onCreate(savedInstanceState);
[*]      /* 加载display.xml Layout */
[*]      setContentView(R.layout.display);
[*]         
[*]      /* 取得屏幕分辨率大小 */
[*]      DisplayMetrics dm=new DisplayMetrics();
[*]      getWindowManager().getDefaultDisplay().getMetrics(dm);
[*]      displayWidth=dm.widthPixels;
[*]      displayHeight=dm.heightPixels;   
[*]         
[*]      /* 初始化相关变量 */
[*]      Bundle bundle = this.getIntent().getExtras();
[*]      Integer imageId = bundle.getInt("imageId");
[*]      Log.i(TAG, "onCreate, imageId = " + imageId);
[*]                     
[*]      bmp=BitmapFactory.decodeResource(getResources(), imageId);   
[*]      mImageView = (ImageView)findViewById(R.id.myImageView);
[*]      mImageView.setImageBitmap(bmp);
[*]      mImageView.setOnTouchListener(this);
[*]      mImageView.setLongClickable(true);
[*]         
[*]      layout1 = (FrameLayout)findViewById(R.id.layout1);
[*]      layoutImage = (LinearLayout)findViewById(R.id.layoutImage);
[*]      mButton01 = (Button)findViewById(R.id.myButton1);
[*]      mButton02 = (Button)findViewById(R.id.myButton2);   
[*]         
[*]      /* 缩小按钮onClickListener */
[*]      mButton01.setOnClickListener(new Button.OnClickListener() {
[*]            @Override
[*]            public void onClick(View v) {
[*]                small();   
[*]            }
[*]      });
[*]         
[*]      /* 放大按钮onClickListener */
[*]      mButton02.setOnClickListener(new Button.OnClickListener() {
[*]            @Override         
[*]            public void onClick(View v) {
[*]                big();
[*]            }   
[*]      });
[*]    }   
[*]      
[*]    // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
[*]    @Override
[*]    public boolean onDown(MotionEvent e) {
[*]      // TODO Auto-generated method stub
[*]//      Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();   
[*]      Log.i(TAG, "onDown...");
[*]         
[*]      return false;
[*]    }
[*]
[*]    /* 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN,
[*]   * 多个ACTION_MOVE, 1个ACTION_UP触发
[*]   * 参数解释:
[*]   * e1:第1个ACTION_DOWN MotionEvent
[*]   * e2:最后一个ACTION_MOVE MotionEvent
[*]   * velocityX:X轴上的移动速度,像素/秒
[*]   * velocityY:Y轴上的移动速度,像素/秒
[*]   * 触发条件 :
[*]   * X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
[*]   * @see android.view.GestureDetector$OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float)
[*]   */
[*]    @Override
[*]    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
[*]            float velocityY) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, "onFling...");
[*]         
[*]      if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE      
[*]               && Math.abs(velocityX) > FLING_MIN_VELOCITY) {      
[*]            // Fling left
[*]
[*]             Toast.makeText(this, "Fling Left", Toast.LENGTH_SHORT).show();      
[*]         } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE      
[*]               && Math.abs(velocityX) > FLING_MIN_VELOCITY) {      
[*]
[*]             // Fling right
[*]
[*]             Toast.makeText(this, "Fling Right", Toast.LENGTH_SHORT).show();      
[*]         }   
[*]         
[*]      return false;
[*]    }
[*]
[*]    // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
[*]    @Override
[*]    public void onLongPress(MotionEvent e) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, "onLongPress...");
[*]         
[*]    }
[*]
[*]    // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
[*]    @Override
[*]    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
[*]            float distanceY) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, "onScroll...");
[*]         
[*]      return false;
[*]    }
[*]
[*]    // 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
[*]    // 注意和onDown()的区别,强调的是没有松开或者拖动的状态
[*]    @Override
[*]    public void onShowPress(MotionEvent e) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, "onShowPress...");
[*]         
[*]    }
[*]
[*]    // 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
[*]    @Override
[*]    public boolean onSingleTapUp(MotionEvent e) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, "onSingleTapUp...");
[*]         
[*]      return false;
[*]    }
[*]
[*]    @Override
[*]    public boolean onTouch(View v, MotionEvent event) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, "onTouch...");
[*]         
[*]      // Set button visible
[*]      mButton01.setVisibility(View.VISIBLE);
[*]      mButton02.setVisibility(View.VISIBLE);
[*]         
[*]      returnmGestureDetector.onTouchEvent(event);      
[*]    }
[*]
[*]//@Override
[*]//public boolean onTouchEvent(MotionEvent event) {
[*]//      // TODO Auto-generated method stub
[*]//      super.onTouchEvent(event);
[*]//      
[*]//      Log.i(TAG, "onTouchEvent");
[*]//      // Set button visible
[*]//      mButton01.setVisibility(View.VISIBLE);
[*]//      mButton02.setVisibility(View.VISIBLE);
[*]//      
[*]//      return true;
[*]//}
[*]      
[*]    @Override
[*]    public boolean onKeyDown(int keyCode, KeyEvent event) {
[*]      // TODO Auto-generated method stub
[*]      super.onKeyDown(keyCode, event);
[*]         
[*]      Log.i(TAG, "onKeyDown...");
[*]      // Set button visible
[*]      mButton01.setVisibility(View.VISIBLE);
[*]      mButton02.setVisibility(View.VISIBLE);
[*]         
[*]      return true;
[*]    }
[*]
[*]    /* 图片缩小的method */
[*]    private void small()    {
[*]      int bmpWidth=bmp.getWidth();   
[*]      int bmpHeight=bmp.getHeight();
[*]         
[*]      Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);
[*]         
[*]      /* 设置图片缩小的比例 */
[*]      double scale=0.8;
[*]      /* 计算出这次要缩小的比例 */   
[*]      scaleWidth=(float) (scaleWidth*scale);   
[*]      scaleHeight=(float) (scaleHeight*scale);   
[*]      /* 产生reSize后的Bitmap对象 */
[*]      Matrix matrix = new Matrix();
[*]      matrix.postScale(scaleWidth, scaleHeight);
[*]      Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
[*]                bmpHeight,matrix,true);   
[*]         
[*]      if(id==0)      {
[*]            /* 如果是第一次按,就删除原来默认的ImageView */
[*]            layoutImage.removeView(mImageView);
[*]      } else {
[*]            /* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */
[*]            layoutImage.removeView((ImageView)findViewById(id));
[*]      }   
[*]         
[*]      /* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */
[*]      id++;
[*]      ImageView imageView = new ImageView(this);
[*]      imageView.setId(id);
[*]      imageView.setImageBitmap(resizeBmp);
[*]      layoutImage.addView(imageView);
[*]      Log.i(TAG, "imageView.getWidth() = " + imageView.getWidth()
[*]                + ", imageView.getHeight() = " + imageView.getHeight());
[*]      setContentView(layout1);
[*]      /* 因为图片放到最大时放大按钮会disable,所以在缩小时把它重设为enable */   
[*]      mButton02.setEnabled(true);
[*]      mButton02.setTextColor(Color.MAGENTA);
[*]    }
[*]      
[*]    /* 图片放大的method */
[*]    private void big() {
[*]      int bmpWidth=bmp.getWidth();
[*]      int bmpHeight=bmp.getHeight();
[*]         
[*]      Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);
[*]         
[*]      /* 设置图片放大的比例 */
[*]      double scale=1.25;
[*]      /* 计算这次要放大的比例 */
[*]      scaleWidth=(float)(scaleWidth*scale);
[*]      scaleHeight=(float)(scaleHeight*scale);
[*]      /* 产生reSize后的Bitmap对象 */
[*]      Matrix matrix = new Matrix();
[*]      matrix.postScale(scaleWidth, scaleHeight);
[*]      Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
[*]                bmpHeight,matrix,true);
[*]         
[*]      if(id==0) {
[*]            /* 如果是第一次按,就删除原来设置的ImageView */
[*]            layoutImage.removeView(mImageView);
[*]      } else {
[*]            /* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */   
[*]            layoutImage.removeView((ImageView)findViewById(id));
[*]      }
[*]         
[*]      /* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */
[*]      id++;
[*]      ImageView imageView = new ImageView(this);
[*]      imageView.setId(id);
[*]      imageView.setImageBitmap(resizeBmp);
[*]      layoutImage.addView(imageView);
[*]      setContentView(layout1);
[*]      /* 如果再放大会超过屏幕大小,就把Button disable */
[*]      if( scaleWidth * scale * bmpWidth > bmpWidth * 3 ||
[*]            scaleHeight * scale * bmpHeight > bmpWidth * 3 ||
[*]            scaleWidth * scale * bmpWidth > displayWidth * 5 ||
[*]            scaleHeight * scale * bmpHeight > displayHeight * 5) {
[*]                mButton02.setEnabled(false);
[*]                mButton02.setTextColor(Color.GRAY);
[*]            } else {
[*]                mButton02.setEnabled(true);
[*]                mButton02.setTextColor(Color.MAGENTA);
[*]            }
[*]      }   
[*]      
[*]}
  

display.xml文件

viewplaincopy
[*]<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>
[*]<FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
[*]    android:orientation=&quot;vertical&quot;
[*]    android:layout_width=&quot;fill_parent&quot;
[*]    android:layout_height=&quot;fill_parent&quot;
[*]    android:id=&quot;@&#43;id/layout1&quot;
[*]    >
[*]
[*]    <ScrollView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;   
[*]      android:layout_width=&quot;fill_parent&quot;
[*]      android:layout_height=&quot;wrap_content&quot;   
[*]      android:layout_weight=&quot;19&quot;
[*]      android:scrollbars=&quot;vertical&quot;
[*]      android:fadingEdge=&quot;vertical&quot;>
[*]    <HorizontalScrollView   
[*]      android:layout_height=&quot;fill_parent&quot;
[*]      android:layout_width=&quot;wrap_content&quot;>
[*]      <LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
[*]            android:orientation=&quot;horizontal&quot;
[*]            android:layout_width=&quot;fill_parent&quot;
[*]            android:layout_height=&quot;wrap_content&quot;
[*]            android:gravity=&quot;center&quot;
[*]            android:id=&quot;@&#43;id/layoutImage&quot;
[*]            >
[*]            <ImageView
[*]                android:id=&quot;@&#43;id/myImageView&quot;
[*]                android:layout_width=&quot;fill_parent&quot;
[*]                android:layout_height=&quot;wrap_content&quot;
[*]                android:layout_weight=&quot;19&quot;
[*]                android:paddingTop=&quot;5dip&quot;
[*]                android:paddingBottom=&quot;5dip&quot;
[*]                />
[*]      </LinearLayout>
[*]    </HorizontalScrollView >
[*]    </ScrollView>   
[*]
[*]    <RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
[*]      android:layout_width=&quot;fill_parent&quot;
[*]      android:layout_height=&quot;wrap_content&quot;
[*]      >
[*]      <Button
[*]            android:id=&quot;@&#43;id/myButton1&quot;
[*]            android:layout_width=&quot;45dip&quot;
[*]            android:layout_height=&quot;30dip&quot;
[*]            android:layout_alignParentLeft=&quot;true&quot;
[*]            android:gravity=&quot;left&quot;
[*]            style=&quot;@style/my_style_button&quot;
[*]            android:visibility=&quot;gone&quot;
[*]            android:text=&quot;缩小&quot;
[*]            />
[*]      <Button
[*]            android:id=&quot;@&#43;id/myButton2&quot;
[*]            android:layout_width=&quot;45dip&quot;
[*]            android:layout_height=&quot;30dip&quot;
[*]            android:layout_alignParentRight=&quot;true&quot;
[*]            android:gravity=&quot;right&quot;
[*]            style=&quot;@style/my_style_button&quot;
[*]            android:visibility=&quot;gone&quot;
[*]            android:text=&quot;放大&quot;
[*]            />
[*]    </RelativeLayout>
[*]</FrameLayout>
  
版权声明:本文为博主原创文章,未经博主允许不得转载。

[*]上一篇layout中设置图片自适应大小,并且设置最大宽高
[*]下一篇Java非静态内部类和静态内部类,访问父类的非静态和静态成员变量及成员函数
主题推荐android图片imageviewvelocityboolean猜你在找Apple Watch开发入门JavaScript for Qt Quick(QML)反编译Android应用APP内置IM 系统——从入门到千万级在线网络赚钱靠谱项目推荐Android支付接入一支付宝分享45个android实例源码很好很强大收藏吧Android Service 详解四开始停止serviceandroid消息广播Intent传递数据Android UI设计与开发第15期顶部标题栏六实现悬浮式顶部和底部标题栏效果准备好了么? 跳吧             !更多职位尽在 CSDNJOB移动-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

[*]访问: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
[*]中国移动终端测试网站

公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告|合作伙伴|论坛反馈网站客服杂志客服微博客服webmaster@iyunv.com400-600-2320|北京创新乐知信息技术有限公司 版权所有|江苏乐知网络技术有限公司 提供商务支持京 ICP 证 070598 号|Copyright &copy; 1999-2014, CSDN.NET, All Rights Reserved

[*]
[*]
[*]
[*]
[*]
[*]
蓝蓝的天
蓝蓝的天,白云朵朵。 White clouds in the blue sky.

[*]目录视图
[*]摘要视图
[*]订阅
新版极客头条上线,每天一大波干货   任玉刚:Android开发者的职场规划     从零练就iOS高手实战班震撼来袭     新型数据库利弊谈     Android实现图片放大缩小
分类: Android应用2010-12-21 14:05 26279人阅读 评论(7) 收藏 举报androidlayoutbuttonactionvelocitydistance
view plaincopy
[*]package com.min.Test_Gallery;
[*]
[*]import android.app.Activity;
[*]import android.graphics.Bitmap;
[*]import android.graphics.BitmapFactory;
[*]import android.graphics.Color;
[*]import android.graphics.Matrix;
[*]import android.os.Bundle;
[*]import android.util.DisplayMetrics;
[*]import android.util.Log;
[*]import android.view.GestureDetector;
[*]import android.view.KeyEvent;
[*]import android.view.MotionEvent;
[*]import android.view.View;
[*]import android.view.GestureDetector.OnGestureListener;
[*]import android.view.View.OnTouchListener;
[*]import android.widget.Button;
[*]import android.widget.FrameLayout;
[*]import android.widget.ImageView;
[*]import android.widget.LinearLayout;
[*]import android.widget.Toast;
[*]
[*]public class DisplayImage extends Activity implements OnTouchListener, OnGestureListener{
[*]    private static final String TAG = &quot;DisplayImage&quot;;
[*]    private static final int FLING_MIN_DISTANCE = 100;
[*]    private static final int FLING_MIN_VELOCITY = 200;
[*]      
[*]      
[*]    /* 相关变量声明 */
[*]    private ImageView mImageView;
[*]    private Button mButton01;
[*]    private Button mButton02;
[*]    private FrameLayout layout1;
[*]    private LinearLayout layoutImage;
[*]    private Bitmap bmp;
[*]    private int id=0;
[*]    private int displayWidth;
[*]    private int displayHeight;
[*]    private float scaleWidth=1;
[*]    private float scaleHeight=1;
[*]    private GestureDetector mGestureDetector;
[*]      
[*]    /** Called when the activity is first created. */
[*]    @Override
[*]    public void onCreate(Bundle savedInstanceState)    {
[*]      super.onCreate(savedInstanceState);
[*]      /* 加载display.xml Layout */
[*]      setContentView(R.layout.display);
[*]         
[*]      /* 取得屏幕分辨率大小 */
[*]      DisplayMetrics dm=new DisplayMetrics();
[*]      getWindowManager().getDefaultDisplay().getMetrics(dm);
[*]      displayWidth=dm.widthPixels;
[*]      displayHeight=dm.heightPixels;   
[*]         
[*]      /* 初始化相关变量 */
[*]      Bundle bundle = this.getIntent().getExtras();
[*]      Integer imageId = bundle.getInt(&quot;imageId&quot;);
[*]      Log.i(TAG, &quot;onCreate, imageId = &quot; + imageId);
[*]                     
[*]      bmp=BitmapFactory.decodeResource(getResources(), imageId);   
[*]      mImageView = (ImageView)findViewById(R.id.myImageView);
[*]      mImageView.setImageBitmap(bmp);
[*]      mImageView.setOnTouchListener(this);
[*]      mImageView.setLongClickable(true);
[*]         
[*]      layout1 = (FrameLayout)findViewById(R.id.layout1);
[*]      layoutImage = (LinearLayout)findViewById(R.id.layoutImage);
[*]      mButton01 = (Button)findViewById(R.id.myButton1);
[*]      mButton02 = (Button)findViewById(R.id.myButton2);   
[*]         
[*]      /* 缩小按钮onClickListener */
[*]      mButton01.setOnClickListener(new Button.OnClickListener() {
[*]            @Override
[*]            public void onClick(View v) {
[*]                small();   
[*]            }
[*]      });
[*]         
[*]      /* 放大按钮onClickListener */
[*]      mButton02.setOnClickListener(new Button.OnClickListener() {
[*]            @Override         
[*]            public void onClick(View v) {
[*]                big();
[*]            }   
[*]      });
[*]    }   
[*]      
[*]    // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
[*]    @Override
[*]    public boolean onDown(MotionEvent e) {
[*]      // TODO Auto-generated method stub
[*]//      Toast.makeText(this, &quot;onDown&quot;, Toast.LENGTH_SHORT).show();   
[*]      Log.i(TAG, &quot;onDown...&quot;);
[*]         
[*]      return false;
[*]    }
[*]
[*]    /* 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN,
[*]   * 多个ACTION_MOVE, 1个ACTION_UP触发
[*]   * 参数解释:
[*]   * e1:第1个ACTION_DOWN MotionEvent
[*]   * e2:最后一个ACTION_MOVE MotionEvent
[*]   * velocityX:X轴上的移动速度,像素/秒
[*]   * velocityY:Y轴上的移动速度,像素/秒
[*]   * 触发条件 :
[*]   * X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
[*]   * @see android.view.GestureDetector$OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float)
[*]   */
[*]    @Override
[*]    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
[*]            float velocityY) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, &quot;onFling...&quot;);
[*]         
[*]      if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE      
[*]               && Math.abs(velocityX) > FLING_MIN_VELOCITY) {      
[*]            // Fling left
[*]
[*]             Toast.makeText(this, &quot;Fling Left&quot;, Toast.LENGTH_SHORT).show();      
[*]         } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE      
[*]               && Math.abs(velocityX) > FLING_MIN_VELOCITY) {      
[*]
[*]             // Fling right
[*]
[*]             Toast.makeText(this, &quot;Fling Right&quot;, Toast.LENGTH_SHORT).show();      
[*]         }   
[*]         
[*]      return false;
[*]    }
[*]
[*]    // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
[*]    @Override
[*]    public void onLongPress(MotionEvent e) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, &quot;onLongPress...&quot;);
[*]         
[*]    }
[*]
[*]    // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
[*]    @Override
[*]    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
[*]            float distanceY) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, &quot;onScroll...&quot;);
[*]         
[*]      return false;
[*]    }
[*]
[*]    // 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
[*]    // 注意和onDown()的区别,强调的是没有松开或者拖动的状态
[*]    @Override
[*]    public void onShowPress(MotionEvent e) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, &quot;onShowPress...&quot;);
[*]         
[*]    }
[*]
[*]    // 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
[*]    @Override
[*]    public boolean onSingleTapUp(MotionEvent e) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, &quot;onSingleTapUp...&quot;);
[*]         
[*]      return false;
[*]    }
[*]
[*]    @Override
[*]    public boolean onTouch(View v, MotionEvent event) {
[*]      // TODO Auto-generated method stub
[*]      Log.i(TAG, &quot;onTouch...&quot;);
[*]         
[*]      // Set button visible
[*]      mButton01.setVisibility(View.VISIBLE);
[*]      mButton02.setVisibility(View.VISIBLE);
[*]         
[*]      returnmGestureDetector.onTouchEvent(event);      
[*]    }
[*]
[*]//@Override
[*]//public boolean onTouchEvent(MotionEvent event) {
[*]//      // TODO Auto-generated method stub
[*]//      super.onTouchEvent(event);
[*]//      
[*]//      Log.i(TAG, &quot;onTouchEvent&quot;);
[*]//      // Set button visible
[*]//      mButton01.setVisibility(View.VISIBLE);
[*]//      mButton02.setVisibility(View.VISIBLE);
[*]//      
[*]//      return true;
[*]//}
[*]      
[*]    @Override
[*]    public boolean onKeyDown(int keyCode, KeyEvent event) {
[*]      // TODO Auto-generated method stub
[*]      super.onKeyDown(keyCode, event);
[*]         
[*]      Log.i(TAG, &quot;onKeyDown...&quot;);
[*]      // Set button visible
[*]      mButton01.setVisibility(View.VISIBLE);
[*]      mButton02.setVisibility(View.VISIBLE);
[*]         
[*]      return true;
[*]    }
[*]
[*]    /* 图片缩小的method */
[*]    private void small()    {
[*]      int bmpWidth=bmp.getWidth();   
[*]      int bmpHeight=bmp.getHeight();
[*]         
[*]      Log.i(TAG, &quot;bmpWidth = &quot; + bmpWidth + &quot;, bmpHeight = &quot; + bmpHeight);
[*]         
[*]      /* 设置图片缩小的比例 */
[*]      double scale=0.8;
[*]      /* 计算出这次要缩小的比例 */   
[*]      scaleWidth=(float) (scaleWidth*scale);   
[*]      scaleHeight=(float) (scaleHeight*scale);   
[*]      /* 产生reSize后的Bitmap对象 */
[*]      Matrix matrix = new Matrix();
[*]      matrix.postScale(scaleWidth, scaleHeight);
[*]      Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
[*]                bmpHeight,matrix,true);   
[*]         
[*]      if(id==0)      {
[*]            /* 如果是第一次按,就删除原来默认的ImageView */
[*]            layoutImage.removeView(mImageView);
[*]      } else {
[*]            /* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */
[*]            layoutImage.removeView((ImageView)findViewById(id));
[*]      }   
[*]         
[*]      /* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */
[*]      id++;
[*]      ImageView imageView = new ImageView(this);
[*]      imageView.setId(id);
[*]      imageView.setImageBitmap(resizeBmp);
[*]      layoutImage.addView(imageView);
[*]      Log.i(TAG, &quot;imageView.getWidth() = &quot; + imageView.getWidth()
[*]                + &quot;, imageView.getHeight() = &quot; + imageView.getHeight());
[*]      setContentView(layout1);
[*]      /* 因为图片放到最大时放大按钮会disable,所以在缩小时把它重设为enable */   
[*]      mButton02.setEnabled(true);
[*]      mButton02.setTextColor(Color.MAGENTA);
[*]    }
[*]      
[*]    /* 图片放大的method */
[*]    private void big() {
[*]      int bmpWidth=bmp.getWidth();
[*]      int bmpHeight=bmp.getHeight();
[*]         
[*]      Log.i(TAG, &quot;bmpWidth = &quot; + bmpWidth + &quot;, bmpHeight = &quot; + bmpHeight);
[*]         
[*]      /* 设置图片放大的比例 */
[*]      double scale=1.25;
[*]      /* 计算这次要放大的比例 */
[*]      scaleWidth=(float)(scaleWidth*scale);
[*]      scaleHeight=(float)(scaleHeight*scale);
[*]      /* 产生reSize后的Bitmap对象 */
[*]      Matrix matrix = new Matrix();
[*]      matrix.postScale(scaleWidth, scaleHeight);
[*]      Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
[*]                bmpHeight,matrix,true);
[*]         
[*]      if(id==0) {
[*]            /* 如果是第一次按,就删除原来设置的ImageView */
[*]            layoutImage.removeView(mImageView);
[*]      } else {
[*]            /* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */   
[*]            layoutImage.removeView((ImageView)findViewById(id));
[*]      }
[*]         
[*]      /* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */
[*]      id++;
[*]      ImageView imageView = new ImageView(this);
[*]      imageView.setId(id);
[*]      imageView.setImageBitmap(resizeBmp);
[*]      layoutImage.addView(imageView);
[*]      setContentView(layout1);
[*]      /* 如果再放大会超过屏幕大小,就把Button disable */
[*]      if( scaleWidth * scale * bmpWidth > bmpWidth * 3 ||
[*]            scaleHeight * scale * bmpHeight > bmpWidth * 3 ||
[*]            scaleWidth * scale * bmpWidth > displayWidth * 5 ||
[*]            scaleHeight * scale * bmpHeight > displayHeight * 5) {
[*]                mButton02.setEnabled(false);
[*]                mButton02.setTextColor(Color.GRAY);
[*]            } else {
[*]                mButton02.setEnabled(true);
[*]                mButton02.setTextColor(Color.MAGENTA);
[*]            }
[*]      }   
[*]      
[*]}
  

display.xml文件

view plaincopy
[*]<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>
[*]<FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
[*]    android:orientation=&quot;vertical&quot;
[*]    android:layout_width=&quot;fill_parent&quot;
[*]    android:layout_height=&quot;fill_parent&quot;
[*]    android:id=&quot;@+id/layout1&quot;
[*]    >
[*]
[*]    <ScrollView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;   
[*]      android:layout_width=&quot;fill_parent&quot;
[*]      android:layout_height=&quot;wrap_content&quot;   
[*]      android:layout_weight=&quot;19&quot;
[*]      android:scrollbars=&quot;vertical&quot;
[*]      android:fadingEdge=&quot;vertical&quot;>
[*]    <HorizontalScrollView   
[*]      android:layout_height=&quot;fill_parent&quot;
[*]      android:layout_width=&quot;wrap_content&quot;>
[*]      <LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
[*]            android:orientation=&quot;horizontal&quot;
[*]            android:layout_width=&quot;fill_parent&quot;
[*]            android:layout_height=&quot;wrap_content&quot;
[*]            android:gravity=&quot;center&quot;
[*]            android:id=&quot;@+id/layoutImage&quot;
[*]            >
[*]            <ImageView
[*]                android:id=&quot;@+id/myImageView&quot;
[*]                android:layout_width=&quot;fill_parent&quot;
[*]                android:layout_height=&quot;wrap_content&quot;
[*]                android:layout_weight=&quot;19&quot;
[*]                android:paddingTop=&quot;5dip&quot;
[*]                android:paddingBottom=&quot;5dip&quot;
[*]                />
[*]      </LinearLayout>
[*]    </HorizontalScrollView >
[*]    </ScrollView>   
[*]
[*]    <RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
[*]      android:layout_width=&quot;fill_parent&quot;
[*]      android:layout_height=&quot;wrap_content&quot;
[*]      >
[*]      <Button
[*]            android:id=&quot;@+id/myButton1&quot;
[*]            android:layout_width=&quot;45dip&quot;
[*]            android:layout_height=&quot;30dip&quot;
[*]            android:layout_alignParentLeft=&quot;true&quot;
[*]            android:gravity=&quot;left&quot;
[*]            style=&quot;@style/my_style_button&quot;
[*]            android:visibility=&quot;gone&quot;
[*]            android:text=&quot;缩小&quot;
[*]            />
[*]      <Button
[*]            android:id=&quot;@+id/myButton2&quot;
[*]            android:layout_width=&quot;45dip&quot;
[*]            android:layout_height=&quot;30dip&quot;
[*]            android:layout_alignParentRight=&quot;true&quot;
[*]            android:gravity=&quot;right&quot;
[*]            style=&quot;@style/my_style_button&quot;
[*]            android:visibility=&quot;gone&quot;
[*]            android:text=&quot;放大&quot;
[*]            />
[*]    </RelativeLayout>
[*]</FrameLayout>
  
版权声明:本文为博主原创文章,未经博主允许不得转载。

[*]上一篇layout中设置图片自适应大小,并且设置最大宽高
[*]下一篇Java非静态内部类和静态内部类,访问父类的非静态和静态成员变量及成员函数
主题推荐android图片imageviewvelocityboolean猜你在找Apple Watch开发入门JavaScript for Qt Quick(QML)反编译Android应用APP内置IM 系统——从入门到千万级在线网络赚钱靠谱项目推荐Android支付接入一支付宝分享45个android实例源码很好很强大收藏吧Android Service 详解四开始停止serviceandroid消息广播Intent传递数据Android UI设计与开发第15期顶部标题栏六实现悬浮式顶部和底部标题栏效果准备好了么? 跳吧             !更多职位尽在 CSDN JOB移动-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 WindowsMobile Rails QEMU KDE Cassandra CloudStack FTCcoremail OPhone CouchBase 云计算 iOS6 Rackspace WebApp SpringSide Maemo Compuware 大数据 aptech PerlTornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular CloudFoundry Redis Scala Django Bootstrap
个人资料


ameyume

[*]访问:1410114次
[*]积分:15235
[*]等级:
[*]排名:第294名


[*]原创:245篇
[*]转载:83篇
[*]译文:1篇
[*]评论:457条


文章搜索



博客专栏

Android多媒体文章:15篇
阅读:118133

文章分类


[*]Android应用(102)
[*]Android面试(1)
[*]C/C&#43;&#43;(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)展开

阅读排行


[*]AndroidDialog用法(67979)
[*]Android实现下载图片并保存到SD卡中(52033)
[*]视频码率,帧率和分辨率的联系与区别(49499)
[*]QT开发环境安装配置教程(48509)
[*]AndroidTextView属性详解(33307)
[*]AndroidSystemProperties设置/取得系统属性的用法总结(27512)
[*]Android实现图片放大缩小(26238)
[*]用Iterator实现遍历集合(21000)
[*]Android通过onDraw实现在View中绘图操作(20289)
[*]Android客户端与PC服务器通过socket进行交互实例(20017)

评论排行


[*]Android实现下载图片并保存到SD卡中(62)
[*]Android客户端与PC服务器通过socket进行交互实例(49)
[*]android和RTSP视频文件播放(一)(23)
[*]AndroidDialog用法(19)
[*]ICS4.0.3创建NuPlayer的处理流程(12)
[*]QT开发环境安装配置教程(12)
[*]android手势操作滑动效果触摸屏事件处理(11)
[*]javaString的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
[*]中国移动终端测试网站

公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告|合作伙伴|论坛反馈网站客服杂志客服微博客服webmaster@iyunv.com400-600-2320|北京创新乐知信息技术有限公司版权所有|江苏乐知网络技术有限公司提供商务支持京 ICP 证 070598 号|Copyright© 1999-2014, CSDN.NET, All Rights Reserved
页: [1]
查看完整版本: Android实现图片放大缩小