public void zoom(boolean flag){
if(flag){
int width=40;
int height=40;
}
else{
int width=20;
int height=20;
}
RelativeLayout.LayoutParams param=new RelativeLayout.LayoutParams(width,height); //use the parent layout of the ImageView;
imageView.setLayoutParams(param); //imageView is the view which needs zooming.
}
ZoomIn = zoom(true); ZoomOut = zoom(false);
0
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageDetail = (ImageView) findViewById(R.id.imageView1);
imageDetail.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
System.out.println("matrix=" + savedMatrix.toString());
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
startPoint.set(event.getX(), event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(midPoint, event);
mode = ZOOM;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y);
} else if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
}
}
break;
}
view.setImageMatrix(matrix);
return true;
}
@SuppressLint("FloatMath")
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
});
}
13 回答
更新
我刚刚给TouchImageView一个新的更新 . 它现在包括双击缩放和Fling以及平移和缩放缩放 . 下面的代码非常过时 . 您可以查看github project以获取最新代码 .
用法
将TouchImageView.java放在项目中 . 然后它可以像ImageView一样使用 . 例:
如果您在xml中使用TouchImageView,则必须提供完整的包名称,因为它是自定义视图 . 例:
注意:我已经删除了我之前的答案,其中包括一些非常旧的代码,现在直接链接到github上最新的代码 .
ViewPager
如果您有兴趣将TouchImageView放入ViewPager,refer to this answer.
我调整了一些代码来创建支持多点触控(> 2.1)的TouchImageView . 它的灵感来自于书Hello, Android! (3rd edition)
它包含在以下3个文件中TouchImageView.java WrapMotionEvent.java EclairMotionEvent.java
TouchImageView.java
WrapMotionEvent.java
EclairMotionEvent.java
我使用WebView并通过内存加载图像
WebView处理所有平移缩放和滚动 . 如果使用wrap_content,则webview不会大于图像,也不会显示白色区域 . WebView是更好的ImageView;)
在回答Janusz的原始问题时,有几种方法可以实现这一点,所有这些方法的难易程度各不相同,并在下面说明 . 使用Web视图很好,但在外观和可控性方面非常有限 . 如果您从画布中绘制位图,那么最常用的解决方案似乎是MikeOrtiz 's, Robert Foss'和/或Jacob Nordfalk建议的内容 . 有一个很好的例子可以通过PaulBourke整合android-multitouch-controller,非常适合拥有多点触控支持和自定义视图的所有类型 .
就个人而言,如果您只是将画布绘制到位图然后将其显示在内部和ImageView中并希望能够使用多点触控放大和移动,我发现MikeOrtiz的解决方案是最简单的 . 但是,出于我的目的,他提供的Git中的代码似乎只在他的TouchImageView自定义ImageView类是唯一的子项或提供布局参数时才起作用:
不幸的是由于我的布局设计,"layout_height"需要"wrap_content" . 当我将其更改为此时,图像在底部被裁剪,我无法滚动或缩放到裁剪区域 . 所以我看了一下ImageView的Source,看看Android是如何实现"onMeasure"并改变了MikeOrtiz的 .
这里resolveSize(int,int)是一个“实用程序,用于协调所需大小与MeasureSpec强加的约束,其中:
Parameters:
Returns:
因此,在加载图像时,本质上提供的行为与原始ImageView类更相似 . 可以进行一些更改以支持更多种改变宽高比的屏幕 . 但是现在我希望这会有所帮助 . 感谢MikeOrtiz的原始代码,非常棒的工作 .
你也可以试试http://code.google.com/p/android-multitouch-controller/
图书馆真的很棒,虽然最初有点难以掌握 .
我刚刚整合了Robert Foss的TouchImageView:开箱即用!谢谢!
我刚刚修改了一些代码,所以我可以从layout.xml中实例化它 .
只需添加两个构造函数
并将旧构造函数转换为init方法:
@Robert Foss,@ Mike Ortiz,非常感谢你的工作 . 我合并了你的工作,并完成了罗伯特课程的android> 2.0和Mike的额外工作 .
由于我的工作,我提出了基于ViewPager的Android Touch Gallery并使用了修改后的TouchImageView . 通过URL加载图像,您可以缩放和拖动它们 . 你可以在这里找到https://github.com/Dreddik/AndroidTouchGallery
尝试使用
ZoomView
来缩放任何其他视图 .http://code.google.com/p/android-zoom-view/使用简单,免费且有趣!
添加到@ Mike的答案 . 我还需要双击才能在首次观看时将图像恢复为原始尺寸 . 所以我添加了一大堆“orig ...”实例变量并添加了SimpleOnGestureListener,它完成了这一操作 .
这是这个帖子的一个非常晚的补充,但我在其他地方找到了 . 这开始是一种显示非常大的图像而不会导致
OutOfMemoryError
s的方法,通过在缩小时对图像进行二次采样并在放大时加载更高分辨率的图块 . 它现在支持在ViewPager
中使用,手动旋转或使用EXIF信息(90°停止) ),覆盖选定的触摸使用OnClickListener
或您自己的GestureDetector
或OnTouchListener
的子事件,子类化以添加叠加,平移时缩放以及动量 .它不是
ImageView
的一般用途替代品,因此不支持显示来自资源,仅资源和外部文件的图像 . 它需要SDK 10 .源代码在GitHub上,并且有一个示例说明
ViewPager
中的使用 .https://github.com/davemorrissey/subsampling-scale-image-view
您可以尝试使用LayoutParams
ZoomIn = zoom(true); ZoomOut = zoom(false);
和drawable文件夹应该有bticn图像文件 . 完美的工作:)
像下面这样的东西会做到这一点 .
查看完整程序,请参见此处:Program to zoom image in android