Android实现图片放大缩小

时间:2022-10-21 07:57:25
  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&period;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使用&colon; 代码:捏合、捏开、图片放大 的一个手机图片&OpenCurlyDoubleQuote;放大缩小可拖动”的小效果

    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. 【JAVA】Spring 事物管理

            在Spring事务管理中通过TransactionProxyFactoryBean配置事务信息,此类通过3个重要接口完成事务的配置及相关操作,分别是PlatformTransactio ...

  2. &lbrack;转&rsqb;-Gradle使用手册(二):项目结构

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Using-sourceCompatibility-1. ...

  3. Retina屏下1px border

    layout tltle tags post ios7下移动web开发的几个坑 webapp 1.Retina屏下1px border 由于高清屏的特性,1px是由2×2个像素点来渲染,那么我们样式上 ...

  4. BZOJ 1044

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1393  Solved: 497[Submit][Statu ...

  5. 项目FAQ

    报错: Conversion from String Literal to Char* is deprecated http://*.com/questions/1369030 ...

  6. apache主目录,配置文件目录结构说明

    apache服务安装成功后,主要的目录结构如下: |-- bin 程序命令目录[apache执行文件的目录如apachectl,htpassed] |-- build |-- cgi-bin 预设给一 ...

  7. c语言之要点-泛篇

    1.goto goto由goto和标签名组成, 1 1 if(....) 2 2 { 3 3 ..... 4 4 goto part2; 5 5 } 6 6 part2: printf(". ...

  8. 关于java中的锁&lpar;转&rpar;

    对于锁一直处于比较模糊的状态,最近一天晚上偶然想看看,就翻了几本书,然后弄明白了一些概念,有一些仍然没明白,例如AQS,先把搞明白的记录一下吧. 什么是线程安全? 当多个线程访问一个对象时,如果不用考 ...

  9. 使用userData兼容IE6-10,chrome,FF 及360等浏览器的本地存储

    开发过程中涉及本地存储的使用,IE很多版本都不支持localStorage,没办法,就得兼容使用userData了.废话不说了,看代码: (function(window){var LS;(funct ...

  10. HEVC 有损优化一

    前期通过X86汇编和C的优化,HEVC 编码有了大幅的提升,目前320x240可以到4~5 fps 了.从现在开始无损优化先放放(还有很大的优化空间),开始做有损优化.做有损优化,我们设定的前提是ps ...