如何在安卓中实现图片视图的缩放效果?

65

我需要实现图片缩放,已经尝试了许多代码,但是对于手势事件的完整理解还不够。我想要实现双击时,根据触摸点(事件x和y)缩放图像。这一次只需要实现缩放,而无需平移。有没有人能给我提供一些建议呢?

编辑: 实际上,我已经实现了带有图像的ViewFlipper,如果我尝试应用平移和缩放效果,有时候图像会被更改。 我想要在用户单击的地方实现缩放效果。

请给我一些想法......


1
这里提供的代码可能会有所帮助:https://dev59.com/8VbTa4cB1Zd3GeqP_opr#5935382 - Omar Rehman
利用 https://github.com/rahulkapoor1/ZommableLoadingImageView 的优势。 - Rahul
这个答案非常有用。我测试过了,非常强大。 - DanialAbdi
9个回答

68

懒人可以使用这个库,只需将其导入到您的项目中即可。

ImageView mImageView;
PhotoViewAttacher mAttacher;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Any implementation of ImageView can be used!
    mImageView = (ImageView) findViewById(R.id.iv_photo);

    // Set the Drawable displayed
    Drawable bitmap = getResources().getDrawable(R.drawable.wallpaper);
    mImageView.setImageDrawable(bitmap);

    // Attach a PhotoViewAttacher, which takes care of all of the zooming functionality.
    mAttacher = new PhotoViewAttacher(mImageView);
}


// If you later call mImageView.setImageDrawable/setImageBitmap/setImageResource/etc then you just need to call
mAttacher.update();

如何在Eclipse中导入此库,因为在导入后我遇到了错误。 - Pravesh
4
@pks,你可以在这里下载库文件:http://grepcode.com/snapshot/repo1.maven.org/maven2/com.github.chrisbanes.photoview/library/1.2.1直接链接:http://repo1.maven.org/maven2/com/github/chrisbanes/photoview/library/1.2.1/library-1.2.1.jar只需将jar文件放入你的lib文件夹中即可享用 :) - Zeeshan
1
@star18bit非常感谢分享这个绝妙的库。它的效果非常棒 :) - Zeeshan
@Umar 你怎么知道它已经过时了? - OneWorld
1
这个在安卓6.0上会崩溃。 - Sachchidanand
显示剩余3条评论

61

这是一种非常高效的方法,它可以顺畅地工作:

https://github.com/MikeOrtiz/TouchImageView

TouchImageView.java放置在您的项目中。然后可以像使用ImageView一样使用它。

示例:

TouchImageView img = (TouchImageView) findViewById(R.id.img);
如果您在xml中使用TouchImageView,则必须提供完整的包名称,因为它是一个自定义视图。 示例:
    <com.example.touch.TouchImageView
            android:id="@+id/img”
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

它给我一个错误:“android.widget.ImageView无法转换为pl.company.project.TouchImageView”。 - PolGraphic
1
@PolGraphic,你能告诉我你是如何使用TouchImageView的吗? - Vikas Mane
它是否使用了Gradle? - Choletski
@Choletski - 我没有听懂你的意思。您是指可以使用gradle吗?您只需要添加一个Java类即可。对于相同的情况,gradle将是不必要的。 - Vikas Mane
这个库仍然活跃。 - Bryan Acuña Núñez
@BryanAcuñaNúñez - 最后一次拉取请求是25天前,所以看起来它是活跃的。 - Vikas Mane

16

希望你一切顺利。当我们想要在应用中添加新功能时,通常会搜索库,这并不是一个好的策略,因为你不知道那个库中包含什么样的代码。所以我总是喜欢 fork 库并将有用的类和方法添加到我的应用程序代码中。

所以当我遇到同样的问题时,我进行了大量的研究和开发,然后找到了一个能够实现缩放、放大和缩小的类。你可以在这里查看这个类。

正如我之前所说,它只是一个单独的类,你可以将这个类放在项目中的任何地方,比如utils文件夹。然后在你的 XML 文件中添加以下行:

<your_packege_name.TouchImageView
        android:id="@+id/frag_imageview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitCenter"
        android:src="@drawable/default_flag"
        android:transitionName="@string/transition_name_phone" /> 

你可以像处理其他视图一样在你的Activity中找到该图片视图,例如:

TouchImageView tv=(TouchImageView)findViewById(R.id.frag_imageview); 
tv.setImageResource(R.drawable.ic_play);

这就是关于TouchImageView的全部内容。 享受我们的代码吧 :)


1
这对我来说是最好的解决方案。谢谢! - F0r3v3r-A-N00b

12

非常简单的方法(已测试):-

PhotoViewAttacher pAttacher;
pAttacher = new PhotoViewAttacher(Your_Image_View);
pAttacher.update();
在 build.gradle 文件中添加以下行:
compile 'com.commit451:PhotoView:1.2.4'

10

您可以通过以下链接获取Image Zoom-In和Zoom-out使用zoomageView的代码示例:- https://dev59.com/SGw15IYBdhLWcg3wYasx#58074642 - Pramesh Bhalala

5

其实我也在使用同样的代码,但问题是我必须检测两次双击,第一件事是在单击的位置缩放图像,第二步是恢复图像。我不知道如何实现第一步,请帮帮我好吗? - Android Developer World

4
以下是ImageFullViewActivity类的代码:
 public class ImageFullViewActivity extends AppCompatActivity {

        private ScaleGestureDetector mScaleGestureDetector;
        private float mScaleFactor = 1.0f;
        private ImageView mImageView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.image_fullview);

            mImageView = (ImageView) findViewById(R.id.imageView);
            mScaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener());

        }

        @Override
        public boolean onTouchEvent(MotionEvent motionEvent) {
            mScaleGestureDetector.onTouchEvent(motionEvent);
            return true;
        }

        private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
            @Override
            public boolean onScale(ScaleGestureDetector scaleGestureDetector) {
                mScaleFactor *= scaleGestureDetector.getScaleFactor();
                mScaleFactor = Math.max(0.1f,
                        Math.min(mScaleFactor, 10.0f));
                mImageView.setScaleX(mScaleFactor);
                mImageView.setScaleY(mScaleFactor);
                return true;
            }
        }
    }

如何在ImageView上应用此功能?我的意思是我正在以编程方式添加ImageView。 - Muhammad Hassaan
我更喜欢使用简单的Android API实现,而不是像其他人一样使用外部库。然而,您的答案应该包括拖动缩放图像的逻辑。 - DoruChidean
适当缩放并不那么轻松,因为缩放应该围绕指针(手指)之间的点进行,并且添加柔和的动画也不是那么容易的事情。如果这不是您应用程序的核心逻辑,利用外部解决方案可能是一个不错的选择。 - Efi G

3

我更喜欢库davemorrissey/subsampling-scale-image-view而不是chrisbanes/PhotoView(star18bit的回答)。

  • 两个项目都很活跃(都有一些2015年的提交)
  • 两者都在PlayStore上提供演示
  • subsampling-scale-image-view支持大图像(超过1080p),由于子抽样导致内存异常,但PhotoView不支持此功能
  • subsampling-scale-image-view似乎具有更大的API和更好的文档

如果您想在Eclipse / ADT中使用subsampling-scale-image-view,请参见如何将AAR转换为JAR


2
您可以在相关问题中查看答案。 https://dev59.com/pGQn5IYBdhLWcg3wW2H3#16894324 只需导入库https://github.com/jasonpolites/gesture-imageview到您的项目中,并在布局文件中添加以下内容:
<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:gesture-image="http://schemas.polites.com/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">

<com.polites.android.GestureImageView
   android:id="@+id/image"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:src="@drawable/image"
   gesture-image:min-scale="0.1"
   gesture-image:max-scale="10.0"
   gesture-image:strict="false"/>`

这是我之前针对此问题发布的帖子https://dev59.com/rVjUa4cB1Zd3GeqPVuiV#47861501 - user2288580

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接