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. zookeeper集群的安装

    顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员, Apache Hbase和 Apache Solr 的分布式集群都用到了zook ...

  2. javaScript 自定义事件、发布订阅设计模式

    现在很多应用都允许用户根据自己的喜好订阅一些自己较为关注的信息,当应用更新了这些信息后将针对不同的订阅类型推送此类信息.例如xx招聘网,当你订阅了互联网IT技术相关分类的招聘信息推送后,当企业在该网站 ...

  3. JavaScript 客户端JavaScript之cookie和客户端持久性

    Document对象都有一个cookie属性,它使得JavaScript代码能够在用户的硬盘上持久地存储数据, 并且能够获取以这种方式存储的数据.客户端持久性是赋予WEB应用程序记忆力的一种简单方法. ...

  4. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  5. Mysql 索引案例学习

    理解索引最好的办法是结合示例,所以这里准备了一个索引的案例. 假设要设计一个在线约会网站,用户信息表有很多列,包裹国家,地区,城市,性别,眼睛颜色,等等.完整必须支持上面这些特征的各种组合来搜索用户, ...

  6. Struts2请求处理流程及源码分析

    1.1 Struts2请求处理 1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionConte ...

  7. easyui 1.3.3 中combotree post传参问题

    重写Tree的loader,增加queryParams属性支持,并且增加setQueryParams方法 //重写tree的loader $.extend($.fn.tree.defaults, { ...

  8. css3中的圆角属性

    圆角属性:border-radius <style type="text/css"> .content{ border: 1px solid green; width: ...

  9. 如何统一修改 Altium Designer 中的字符大小

    如下图 1 所示: Q1. Q2. C1. C2. R1 等等的字符你想统一修改他们的大小.原来是 Text Height( 100mil), Text Width( 12mil),想改成 Text ...

  10. 玩转Google开源C++单元测试框架Google Test系列(转载)

    越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...