android 图片浏览功能 图片放大缩小 使用 photoview 双击或双指缩放的ImageView

android 图片浏览功能  图片放大缩小   

使用 photoview 双击或双指缩放的ImageView 

使用多点触控和双击。

滚动,以平滑滚动甩。


github  下载地址:  https://github.com/chrisbanes/PhotoView


实际效果参考 


图片来自 : http://a.code4app.com/android/PhotoView/5241a4026803fa1327000000


下载完成后 导入IDE里面




将lib  添加进来




贴出 photoview的代码:

[java]  view plain copy
  1. /******************************************************************************* 
  2.  * Copyright 2011, 2012 Chris Banes. 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  *******************************************************************************/  
  16. package uk.co.senab.photoview;  
  17.   
  18. import android.content.Context;  
  19. import android.graphics.Bitmap;  
  20. import android.graphics.Matrix;  
  21. import android.graphics.RectF;  
  22. import android.graphics.drawable.Drawable;  
  23. import android.net.Uri;  
  24. import android.util.AttributeSet;  
  25. import android.view.GestureDetector;  
  26. import android.widget.ImageView;  
  27.   
  28. import uk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedListener;  
  29. import uk.co.senab.photoview.PhotoViewAttacher.OnPhotoTapListener;  
  30. import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener;  
  31.   
  32. public class PhotoView extends ImageView implements IPhotoView {  
  33.   
  34.     private final PhotoViewAttacher mAttacher;  
  35.   
  36.     private ScaleType mPendingScaleType;  
  37.   
  38.     public PhotoView(Context context) {  
  39.         this(context, null);  
  40.     }  
  41.   
  42.     public PhotoView(Context context, AttributeSet attr) {  
  43.         this(context, attr, 0);  
  44.     }  
  45.   
  46.     public PhotoView(Context context, AttributeSet attr, int defStyle) {  
  47.         super(context, attr, defStyle);  
  48.         super.setScaleType(ScaleType.MATRIX);  
  49.         mAttacher = new PhotoViewAttacher(this);  
  50.   
  51.         if (null != mPendingScaleType) {  
  52.             setScaleType(mPendingScaleType);  
  53.             mPendingScaleType = null;  
  54.         }  
  55.     }  
  56.   
  57.     /** 
  58.      * @deprecated use {@link #setRotationTo(float)} 
  59.      */  
  60.     @Override  
  61.     public void setPhotoViewRotation(float rotationDegree) {  
  62.         mAttacher.setRotationTo(rotationDegree);  
  63.     }  
  64.       
  65.     @Override  
  66.     public void setRotationTo(float rotationDegree) {  
  67.         mAttacher.setRotationTo(rotationDegree);  
  68.     }  
  69.   
  70.     @Override  
  71.     public void setRotationBy(float rotationDegree) {  
  72.         mAttacher.setRotationBy(rotationDegree);  
  73.     }  
  74.   
  75.     @Override  
  76.     public boolean canZoom() {  
  77.         return mAttacher.canZoom();  
  78.     }  
  79.   
  80.     @Override  
  81.     public RectF getDisplayRect() {  
  82.         return mAttacher.getDisplayRect();  
  83.     }  
  84.   
  85.     @Override  
  86.     public Matrix getDisplayMatrix() {  
  87.         return mAttacher.getDrawMatrix();  
  88.     }  
  89.   
  90.     @Override  
  91.     public boolean setDisplayMatrix(Matrix finalRectangle) {  
  92.         return mAttacher.setDisplayMatrix(finalRectangle);  
  93.     }  
  94.   
  95.     @Override  
  96.     @Deprecated  
  97.     public float getMinScale() {  
  98.         return getMinimumScale();  
  99.     }  
  100.   
  101.     @Override  
  102.     public float getMinimumScale() {  
  103.         return mAttacher.getMinimumScale();  
  104.     }  
  105.   
  106.     @Override  
  107.     @Deprecated  
  108.     public float getMidScale() {  
  109.         return getMediumScale();  
  110.     }  
  111.   
  112.     @Override  
  113.     public float getMediumScale() {  
  114.         return mAttacher.getMediumScale();  
  115.     }  
  116.   
  117.     @Override  
  118.     @Deprecated  
  119.     public float getMaxScale() {  
  120.         return getMaximumScale();  
  121.     }  
  122.   
  123.     @Override  
  124.     public float getMaximumScale() {  
  125.         return mAttacher.getMaximumScale();  
  126.     }  
  127.   
  128.     @Override  
  129.     public float getScale() {  
  130.         return mAttacher.getScale();  
  131.     }  
  132.   
  133.     @Override  
  134.     public ScaleType getScaleType() {  
  135.         return mAttacher.getScaleType();  
  136.     }  
  137.   
  138.     @Override  
  139.     public void setAllowParentInterceptOnEdge(boolean allow) {  
  140.         mAttacher.setAllowParentInterceptOnEdge(allow);  
  141.     }  
  142.   
  143.     @Override  
  144.     @Deprecated  
  145.     public void setMinScale(float minScale) {  
  146.         setMinimumScale(minScale);  
  147.     }  
  148.   
  149.     @Override  
  150.     public void setMinimumScale(float minimumScale) {  
  151.         mAttacher.setMinimumScale(minimumScale);  
  152.     }  
  153.   
  154.     @Override  
  155.     @Deprecated  
  156.     public void setMidScale(float midScale) {  
  157.         setMediumScale(midScale);  
  158.     }  
  159.   
  160.     @Override  
  161.     public void setMediumScale(float mediumScale) {  
  162.         mAttacher.setMediumScale(mediumScale);  
  163.     }  
  164.   
  165.     @Override  
  166.     @Deprecated  
  167.     public void setMaxScale(float maxScale) {  
  168.         setMaximumScale(maxScale);  
  169.     }  
  170.   
  171.     @Override  
  172.     public void setMaximumScale(float maximumScale) {  
  173.         mAttacher.setMaximumScale(maximumScale);  
  174.     }  
  175.   
  176.     @Override  
  177.     // setImageBitmap calls through to this method  
  178.     public void setImageDrawable(Drawable drawable) {  
  179.         super.setImageDrawable(drawable);  
  180.         if (null != mAttacher) {  
  181.             mAttacher.update();  
  182.         }  
  183.     }  
  184.   
  185.     @Override  
  186.     public void setImageResource(int resId) {  
  187.         super.setImageResource(resId);  
  188.         if (null != mAttacher) {  
  189.             mAttacher.update();  
  190.         }  
  191.     }  
  192.   
  193.     @Override  
  194.     public void setImageURI(Uri uri) {  
  195.         super.setImageURI(uri);  
  196.         if (null != mAttacher) {  
  197.             mAttacher.update();  
  198.         }  
  199.     }  
  200.   
  201.     @Override  
  202.     public void setOnMatrixChangeListener(OnMatrixChangedListener listener) {  
  203.         mAttacher.setOnMatrixChangeListener(listener);  
  204.     }  
  205.   
  206.     @Override  
  207.     public void setOnLongClickListener(OnLongClickListener l) {  
  208.         mAttacher.setOnLongClickListener(l);  
  209.     }  
  210.   
  211.     @Override  
  212.     public void setOnPhotoTapListener(OnPhotoTapListener listener) {  
  213.         mAttacher.setOnPhotoTapListener(listener);  
  214.     }  
  215.   
  216.     @Override  
  217.     public OnPhotoTapListener getOnPhotoTapListener() {  
  218.         return mAttacher.getOnPhotoTapListener();  
  219.     }  
  220.   
  221.     @Override  
  222.     public void setOnViewTapListener(OnViewTapListener listener) {  
  223.         mAttacher.setOnViewTapListener(listener);  
  224.     }  
  225.   
  226.     @Override  
  227.     public OnViewTapListener getOnViewTapListener() {  
  228.         return mAttacher.getOnViewTapListener();  
  229.     }  
  230.   
  231.     @Override  
  232.     public void setScale(float scale) {  
  233.         mAttacher.setScale(scale);  
  234.     }  
  235.   
  236.     @Override  
  237.     public void setScale(float scale, boolean animate) {  
  238.         mAttacher.setScale(scale, animate);  
  239.     }  
  240.   
  241.     @Override  
  242.     public void setScale(float scale, float focalX, float focalY, boolean animate) {  
  243.         mAttacher.setScale(scale, focalX, focalY, animate);  
  244.     }  
  245.   
  246.     @Override  
  247.     public void setScaleType(ScaleType scaleType) {  
  248.         if (null != mAttacher) {  
  249.             mAttacher.setScaleType(scaleType);  
  250.         } else {  
  251.             mPendingScaleType = scaleType;  
  252.         }  
  253.     }  
  254.   
  255.     @Override  
  256.     public void setZoomable(boolean zoomable) {  
  257.         mAttacher.setZoomable(zoomable);  
  258.     }  
  259.   
  260.     @Override  
  261.     public Bitmap getVisibleRectangleBitmap() {  
  262.         return mAttacher.getVisibleRectangleBitmap();  
  263.     }  
  264.   
  265.     @Override  
  266.     public void setZoomTransitionDuration(int milliseconds) {  
  267.         mAttacher.setZoomTransitionDuration(milliseconds);  
  268.     }  
  269.   
  270.     @Override  
  271.     public IPhotoView getIPhotoViewImplementation() {  
  272.         return mAttacher;  
  273.     }  
  274.   
  275.     @Override  
  276.     public void setOnDoubleTapListener(GestureDetector.OnDoubleTapListener newOnDoubleTapListener) {  
  277.         mAttacher.setOnDoubleTapListener(newOnDoubleTapListener);  
  278.     }  
  279.   
  280.     @Override  
  281.     protected void onDetachedFromWindow() {  
  282.         mAttacher.cleanup();  
  283.         super.onDetachedFromWindow();  
  284.     }  
  285.   
  286. }  



接下来将lib 导入自己的项目中使用  


在自己的项目中使用  只需要在 xml 文件里面将  原有的imageview  替换为  uk.co.senab.photoview.PhotoView  

就能使用

如图:



非常方便快捷

github  下载地址:  https://github.com/chrisbanes/PhotoView


 转自:http://blog.csdn.net/aaawqqq/article/details/43128111#comments

谢谢大家

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android平台上,可以使用一些常用的手势操作来实现图片的平移、双和双放大缩小。 首先,为了实现平移功能,可以使用触摸事件的ACTION_MOVE来处理手在屏幕上滑动的操作。通过计算滑动距离,可以改变图片的位置从而实现平移效果。 其次,双可以使用触摸事件的ACTION_POINTER_DOWN和ACTION_POINTER_UP来追踪并处理触摸屏幕上第二个手按下和松开的操作。在处理时,可以通过计算两个手触摸点之间的距离来改变图片比例,从而实现双效果。 最后,双放大缩小可以通过设置一个双的监听器来实现。在双监听器的回调方法中,可以根据当前的图片状态来判断是进行放大操作还是缩小操作。并根据需要更改图片比例,实现双放大缩小功能。 在实现上述功能时,可以使用Android提供的一些核心类来辅助开发,如View、MotionEvent、GestureDetector等。同时,还可以结合自定义View和动画效果来提升用户体验,使图片的平移、和双动作更加流畅和自然。 总之,通过合理运用触摸事件、手势识别、双监听器等技术,可以在Android上实现图片的平移、双和双放大缩小功能,从而提升用户与应用程序的交互体验。 ### 回答2: 在Android开发中,可以通过使用ImageView控件来实现对图片的平移、双和双放大缩小操作。 1. 平移:可以通过使用Matrix类对ImageView进行变换来实现图片的平移。首先,我们需要为ImageView设置一个OnTouchListener来监听用户的手势操作。在手势操作的回调方法中,可以通过获取手按下和移动的位置差来计算出需要平移的距离,然后通过设置Matrix的平移矩阵来实现图片的平移效果。 2. 双:可以通过GestureDetector类来监听双手势。在手势操作的回调方法中,可以获取到两个手的起始位置和当前位置,通过计算两个手之间的距离差来判断的比例。然后,再通过设置Matrix的矩阵来实现图片效果。需要注意的是,在进行操作时,还需要考虑到手中心点的位置变化。 3. 双放大缩小:也可以通过GestureDetector类来监听双手势。在手势操作的回调方法中,可以判断是否发生了双事件,并获取到双的位置。当双事件发生时,可以通过判断当前图片比例来决定是放大还是缩小。通过设置Matrix的矩阵和平移矩阵来实现图片放大缩小效果。 需要注意的是,为了实现图片的平移、双和双放大缩小操作,我们需要对ImageView进行一系列的监听和处理操作。同时,为了方便管理和控制这些操作,可以将相关的代码封装成一个自定义的图片控件,并在该控件中进行处理。 ### 回答3: Android 提供了多种方法来实现图片的平移、双和双放大缩小功能。 首先,要实现图片的平移,我们可以使用 GestureDetector 类。可以通过重写 onScroll() 方法来检测用户的滑动手势,然后将图片的位置进行相应的调整,从而实现平移效果。 其次,要实现双功能,我们可以借助 ScaleGestureDetector 类。通过重写 onScale() 方法,我们可以获取用户的手势,并根据手势的比例调整图片的尺寸,从而实现双的效果。 最后,要实现双放大缩小功能,我们可以使用 GestureDetector 类。可以通过重写 onDoubleTap() 方法来检测用户的双手势,然后根据当前图片的尺寸和双事件的位置,来判断是进行放大还是缩小操作,最后将图片的尺寸进行相应的调整,实现双放大缩小的效果。 需要注意的是,以上的功能实现是基于 Android 的原生 API,还有其他第三方库也提供了更便捷的方法来实现这些功能,例如 PhotoView 库,它提供了更多灵活的选项和交互效果,可以更加方便地实现图片的平移、和双操作。 综上所述,Android 针对图片的平移、双和双放大缩小,可以通过重写相应的手势监听方法或使用第三方库来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值