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

display.xml文件

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

Android实现图片放大缩小的更多相关文章

  1. 41.Android之图片放大缩小学习

    生活中经常会用到图片放大和缩小,今天简单学习下. 思路:1.添加一个操作图片放大和缩小类;  2. 布局文件中引用这个自定义控件;  3. 主Activity一些修改. 代码如下: 增加图片操作类: ...

  2. imageView图片放大缩小及旋转

    imageView图片放大缩小及旋转 一.简介 二.方法 1)设置图片放大缩小效果 第一步:将<ImageView>标签中的android:scaleType设置为"fitCen ...

  3. 鼠标滚轮图片放大缩小功能,使用layer弹框后不起作用

    今天在项目中遇到的一个问题:点击按钮使用layer弹框弹出一张图片,需要加一个鼠标滚轮放大缩小,图片也跟着放大缩小的功能.于是在网上找了一个demo. DEMO: <!DOCTYPE html ...

  4. javascript仿新浪微博图片放大缩小及旋转效果

    javascript仿新浪微博图片放大缩小及旋转效果 经常看到新浪微博里有图片放大缩小旋转效果,感觉效果还不错,所以就想试着做一个类似的demo出来,至于旋转对于IE可以用滤镜来解决,标准的浏览器可以 ...

  5. hammer使用: 代码:捏合、捏开、图片放大 的一个手机图片“放大缩小可拖动”的小效果

    hammer.js 的使用. (手机手势插件) 捏合.捏开.图片放大 的一个手机图片“放大缩小可拖动”的小效果. 相关js 到 http://www.bootcdn.cn/  查找和下载. hamme ...

  6. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

  7. 自定义mousewheel事件,实现图片放大缩小功能实现

    本文是承接 上一篇的<自定义鼠标滚动事件>  的基础上实现的,建议大家先看一下上一篇的mousewheel的实现,再浏览下文: 上篇中我们介绍到: $element.mousewheel( ...

  8. wpf下的图片放大缩小

    WPF下实现图片的放大缩小移动   在windows 7里面有自带的图片查看器,这个软件可以打开一张图片然后以鼠标在图片中的焦点为原点来进行缩放,并且放大后可以随意拖动.下面我们在WPF中实现这个功能 ...

  9. Android多点触摸放大缩小图片

    1.Activity package com.fit.touchimage; import android.app.Activity; import android.graphics.Bitmap; ...

随机推荐

  1. mongodb一些特性

    mongodb 地理位置 mongodb schema mongodb 定时任务 mysql 也有定时任务 mongodb 读写分离 http://blog.csdn.net/sd0902/artic ...

  2. mysql source命令导入sql文件效率分析和索引整理

    Query OK, 24918 rows affected (0.90 sec)Records: 24918  Duplicates: 0  Warnings: 0 Query OK, 24923 r ...

  3. oracle查询blob类型

    下午要查询一个数据,要求是从 表t_report 中查找出 mainbody字段中包含“hibernate”字符串的所有信息.而mainbody字段是blob类型.百度后终于找到答案: DBMS_LO ...

  4. Matlab与外部接口:MAT文件基础

    MAT 文件MAT文件是MATLAB使用的一种特有的二进制数据文件.MAT文件可以包含一个或者多个MATLAB 变量.MATLAB通常采用MAT文件把工作空间的变量存储在磁盘里,在MAT文件中不仅保存 ...

  5. python 的内置函数(1)

     19.内置函数:              abs():求绝对值              bool():求一个值是True or False ,其中False值有 0 ,空字符串'',None,空 ...

  6. 无效的过程调用或参数: 'Instr'解决方法

    以前我一直使用ASP无组件上传类来上传文件.但是今天又个客户反映说.不能上传.出现错误.,但在我电脑上测试没问题.后来发现客户用的是IE8 于是开始找解决方法 错误如下:Microsoft VBScr ...

  7. Azure构建PredictionIO和Spark的推荐引擎服务

    Azure构建PredictionIO和Spark的推荐引擎服务 1. 在Azure构建Ubuntu 16.04虚拟机 假设前提条件您已有 Azure 帐号,登陆 Azure https://port ...

  8. wifi钓鱼教程

    关于 <原创>想钓鱼必须还要有好竿wifi学习教程+软件下载地址修正 因为最近网盘维护 导致资源无法下载 今天早上开通下载服务了大家可以放心下载. 蹭网要低调不要炫耀 软件介绍:Wires ...

  9. 『安全工具』Nmap 强悍的端口扫描工具

    作为时下流行的端口扫描工具,Nmap有因其扫描的隐密性有“端口扫描之王”之称 上图是黑客帝国(The Matrix)中崔妮蒂用Nmap入侵核发电站的能源管理系统 0x 01 Nmap介绍 Nmap是一 ...

  10. windows 2003 远程桌面 连接输入账号密码后,只能看见蓝色屏幕和鼠标

    具体解决方案参考的 http://www.tomshardware.com/forum/171045-46-remote-desktop-connection-blank-desktop   to s ...