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

时间:2011-12-06 11:38:47

标签: android image zooming

我必须实现图像缩放,我尝试过这么多代码。但我并没有充分了解手势事件。我想实现当我们应用双击时,图像将根据触摸位置(事件x和y)进行缩放。我必须实现此时只有缩放没有泛。可以任何身体建议我吗?

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

让我对此有所了解......

9 个答案:

答案 0 :(得分:58)

懒人可以使用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();

答案 1 :(得分:53)

这是最有效的方法之一,它运作顺畅:

https://github.com/MikeOrtiz/TouchImageView

TouchImageView.java放入您的项目中。然后可以使用它 ImageView

示例:

TouchImageView img = (TouchImageView) findViewById(R.id.img);

如果您在xml中使用TouchImageView,则必须提供完整的包 name,因为它是自定义视图。

示例:

    <com.example.touch.TouchImageView
            android:id="@+id/img”
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

答案 2 :(得分:10)

以下是关于如何使用imageview实现缩放影响的一个很好的示例

Zoom effect on imageview

编辑:

此外,这是另一个伟大的。

Pinch to zoom tutorial

答案 3 :(得分:10)

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

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

在build.gradle中添加bellow行: -

compile 'com.commit451:PhotoView:1.2.4'

答案 4 :(得分:9)

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

所以当我遇到同样的问题时,我会做很多R&amp; D然后我找到一个能够进行zoomIn,zoomOut和pinIn和out的类。所以你可以看到班级Image Here

正如我之前所说,这是一个单一的课程。因此,您可以将此类放在项目中的任何位置,例如 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" /> 

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

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

它是TouchImageView的。 享受我们的代码:)

答案 5 :(得分:5)

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

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

答案 6 :(得分:2)

您可以在相关问题中查看答案。 https://stackoverflow.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_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"/>`

答案 7 :(得分:2)

我更喜欢图书馆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

答案 8 :(得分:2)

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