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. Android多点触摸放大缩小图片

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

  9. 图片放大缩小(和ViewPager配合使用流畅显示)--第三方开源--PhotoView

    图片的放大缩小实现效果是使用的github上的一个开源项目photoView实现的,下载地址:https://github.com/chrisbanes/PhotoView 下面看测试代码: acti ...

随机推荐

  1. (转)Should 断言的基本使用方法

    一.基础 RobotFramework带有丰富的系统关键,使用时无需导入,直接使用,为写自动化用例带来了极大的方便:不能停留在知道或者是会得程度,只有熟练使用各关键字,才能提升自动化用例的写作效率.下 ...

  2. iOS 修改UIWebView的UserAgent

    iOS和H5交互的时候,H5需要用userAgent带一些参数,需要我们修改默认的UserAgent为自定义的. 首先,给大家普及一下userAgent的历史,点击UserAgent查看. 1 在Ap ...

  3. python通过win32api轻松获取控件的属性值

    1.如何利用句柄操作windows窗体 首先,获得窗体的句柄  win32api.FindWindows() 第二,获得窗体中控件的id号,spy++ 第三,根据控件的ID获得控件的句柄(hwnd)  ...

  4. sharepoint 2010 找不到搜索不到ad里的用户

    前提条件: 1.这个用户是在ad中存在的. 2.这个用户也同步到了userprofile中. 问题现象: 在sharepoint的人员选择器中,搜索不到已经添加的用户. 可能原因: 1.有人说需要将 ...

  5. oracle中的loop与while循环

    Oracle中loop语句会先执行一次循环,然后再判断“exit when”关键字后面的条件表达式的值是true还是false,如果是true,那么将退出循环,否则继续循环. LOOP循环 语法如下l ...

  6. ReactNative-----环境搭建二(android)

    一.初始化一个ReactNative项目 在指定目录运行命令:react-native init Vince(项目名称)  //其过程就是在使用CLI工具构建项目, 命令行代码 F:\React> ...

  7. java201521123118《java程序设计》第3周总结

    1. 本周学习 总结初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...

  8. [ZJOI 2010]Perm 排列计数

    Description 题库链接 询问有多少个 \(1\sim N\) 的排列 \(P\) 满足" \(\forall i\in[2,N], P_i>P_{\frac{i}{2}}\) ...

  9. WINDOWS下nginx实现本地支持的图片服务器反向代理

    最近在学习nginx的反向代理和负载均衡的运用时,觉得挺简单的,但是还是想写一篇博客用于记录自己的学习过程. 好的,我们进入正题 Nginx(engine x) 是一个高性能的HTTP和反向代理服务器 ...

  10. Codeforces 992C Nastya and a Wardrobe (思维)

    <题目链接> 题目大意: 你开始有X个裙子 你有K+1次增长机会 前K次会100%的增长一倍 但是增长后有50%的机会会减少一个 给你X,K(0<=X,K<=1e18), 问你 ...