我必须实现图像缩放,我尝试过这么多代码。但我并没有充分了解手势事件。我想实现当我们应用双击时,图像将根据触摸位置(事件x和y)进行缩放。我必须实现此时只有缩放没有泛。可以任何身体建议我吗?
编辑: 实际上我已经用图像实现了viewflipper,如果我尝试应用平移和缩放效果,有时图像会被更改。我想在点击用户的位置实现缩放效果。
让我对此有所了解......
答案 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)
答案 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的答案)
如果您想在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;
}
}
}