如何在android中实现图像视图的缩放效果?

Posted

技术标签:

【中文标题】如何在android中实现图像视图的缩放效果?【英文标题】:How to implement zoom effect for image view in android? 【发布时间】:2012-01-14 00:26:57 【问题描述】:

我必须实现图像缩放,我尝试了很多代码。但我没有完全了解手势事件。我想在我们应用双击时实现,图像将根据触摸位置(事件 x 和 y)进行缩放。此时我只需要实现缩放,没有平移。任何人都可以建议我吗?

编辑: 实际上我已经用图像实现了那个viewflipper,如果我尝试应用平移和缩放效果,有时图像会改变。我想在用户点击的地方实现缩放效果

给我一​​些想法......

【问题讨论】:

这里提供的代码可能对***.com/questions/5778532/…有帮助 利用github.com/rahulkapoor1/ZommableLoadingImageView 这个答案很有用。我对其进行了测试,并且非常强大。 ***.com/a/6650484/395093 【参考方案1】:

懒人可以用this lib,直接导入到你的项目里面

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 中导入这个库,因为在导入后我得到了错误... @pks 你可以从这里下载库grepcode.com/snapshot/repo1.maven.org/maven2/… 直接链接:repo1.maven.org/maven2/com/github/chrisbanes/photoview/library/… 只需将 jar 文件放到你的 lib 文件夹中即可:) @star18bit 非常感谢您分享这个很棒的图书馆。它的作用就像魅力:) @Umar 你怎么知道,它已被弃用? 这个在 android 6.0 上崩溃【参考方案2】:

这是最有效的方法之一,它工作顺利:

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_
            android:layout_ />

【讨论】:

它给了我一个错误android.widget.ImageView cannot be cast to pl.company.project.TouchImageView @PolGraphic 你能告诉我你是如何使用 TouchImageView 的吗? 有gradle的用法吗? @Choletski - 我没听懂你。你的意思是可以使用gradle吗?你只需要添加一个java类。就是这样。对于相同的 gradle 将是不必要的。 这个库仍然有效【参考方案3】:

我希望你做得很好。当他们想在你的应用程序中添加新功能时,通常会发生这种情况,然后通常他们都会搜索不是好的策略的库,因为你不知道其中有什么样的代码图书馆。所以我总是喜欢派生库并在我的应用程序代码中添加有用的类和方法。

所以当我遇到同样的问题时,我做了很多研发工作,然后我找到了一个能够放大、缩小和 pinIn 和 out 的类。所以你可以看到那个类here.。

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

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

并且您可以在您尊重的活动中找到该图像视图,就像您对所有视图所做的那样 -:

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

TouchImageView 就是这样。 享受我们的代码:)

【讨论】:

这对我来说是最好的解决方案。谢谢!【参考方案4】:

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

PhotoViewAttacher pAttacher;
pAttacher = new PhotoViewAttacher(Your_Image_View);
pAttacher.update();

在 build.gradle 中添加下面一行:-

compile 'com.commit451:PhotoView:1.2.4'

【讨论】:

【参考方案5】:

这是一个很好的例子,说明如何在触摸图像视图时实现缩放效果

Zoom effect on imageview

编辑:

还有一个很棒的。

Pinch to zoom tutorial

【讨论】:

您可以通过此链接使用 zoomageView 获取图像放大和缩小:- ***.com/a/58074642/11613683【参考方案6】:

这实际上是 Android 中图像缩放和平移的最佳示例,

http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/

【讨论】:

其实我也在使用相同的代码,但问题是我必须检测双击两次,第一件事是放大你点击的图像,第二个恢复图像。我不知道如何实现第一件事。你能帮帮我吗?【参考方案7】:

下面是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;
            
        
    

【讨论】:

如何在图像视图上应用这个?我的意思是我正在以编程方式添加图像视图。 我更喜欢使用 android api 的简单实现,而不是像其他人一样使用外部库。但是,您的答案将通过拖动缩放图像的逻辑来完成。 正确缩放并不是那么简单,因为缩放应该围绕指针(手指)之间的点进行,并且添加柔和的动画也不是那么容易,我认为拥有它非常好。如果这不是您的应用程序的核心逻辑,那么利用外部解决方案可能是个好主意。【参考方案8】:

我更喜欢图书馆davemorrissey/subsampling-scale-image-view 结束 chrisbanes/PhotoView (star18bit的回答)

两个都是活跃的项目(在 2015 年都有一些提交) 两者在 PlayStore 上都有演示 subsampling-scale-image-view 支持大图像(1080p 以上),不会由于子采样导致内存异常,which PhotoView doesn't support subsampling-scale-image-view 似乎有更大的 API 和更好的文档

如果您想在 Eclipse/ADT 中使用 subsampling-scale-image-view,请参阅 How to convert AAR to JAR

【讨论】:

【参考方案9】:

您可以在相关问题中查看答案。 https://***.com/a/16894324/1465756

只需导入库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_
   android:layout_>

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

【讨论】:

这是我之前针对这个问题发布的帖子***.com/questions/6578320/…

以上是关于如何在android中实现图像视图的缩放效果?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现在动态布局中添加更多视图在android中实现滚动视图

如何在寻呼机中实现图像视图和按钮

如何在android中实现视图滑动

如何在 android 中实现 Drag Distortion Image 过滤器?

如何在android中实现Drag Distortion Image过滤器?

如何在android中实现这种折叠效果?