我想放大和缩小 Android ImageView。我尝试了大多数示例,但在所有示例中,ImageView 本身的图像都被放大和缩小,而我想放大和缩小 ImageView。我想在放大时增加 ImageView 的宽度和高度,并在缩小时减少 ImageView 的宽度和高度。我如何做到这一点?
最佳答案
请按照下面的类,用于 ImageView 的放大和缩小。
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class ZoomInZoomOut extends Activity implements OnTouchListener
{
private static final String TAG = "Touch";
@SuppressWarnings("unused")
private static final float MIN_ZOOM = 1f,MAX_ZOOM = 1f;
// These matrices will be used to scale points of the image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
// The 3 states (events) which the user is trying to perform
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
// these PointF objects are used to record the point(s) the user is touching
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView view = (ImageView) findViewById(R.id.imageView);
view.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event)
{
ImageView view = (ImageView) v;
view.setScaleType(ImageView.ScaleType.MATRIX);
float scale;
dumpEvent(event);
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN: // first finger down only
matrix.set(view.getImageMatrix());
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG"); // write to LogCat
mode = DRAG;
break;
case MotionEvent.ACTION_UP: // first finger lifted
case MotionEvent.ACTION_POINTER_UP: // second finger lifted
mode = NONE;
Log.d(TAG, "mode=NONE");
break;
case MotionEvent.ACTION_POINTER_DOWN: // first and second finger down
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 5f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM");
}
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG)
{
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // create the transformation in the matrix of points
}
else if (mode == ZOOM)
{
// pinch zooming
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 5f)
{
matrix.set(savedMatrix);
scale = newDist / oldDist; // setting the scaling of the
// matrix...if scale > 1 means
// zoom in...if scale < 1 means
// zoom out
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
view.setImageMatrix(matrix); // display the transformation on screen
return true; // indicate event was handled
}
/*
* --------------------------------------------------------------------------
* Method: spacing Parameters: MotionEvent Returns: float Description:
* checks the spacing between the two fingers on touch
* ----------------------------------------------------
*/
private float spacing(MotionEvent event)
{
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return (float) Math.sqrt(x * x + y * y);
}
/*
* --------------------------------------------------------------------------
* Method: midPoint Parameters: PointF object, MotionEvent Returns: void
* Description: calculates the midpoint between the two fingers
* ------------------------------------------------------------
*/
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);
}
/** Show an event in the LogCat view, for debugging */
private void dumpEvent(MotionEvent event)
{
String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE","POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
StringBuilder sb = new StringBuilder();
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
sb.append("event ACTION_").append(names[actionCode]);
if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP)
{
sb.append("(pid ").append(action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append(")");
}
sb.append("[");
for (int i = 0; i < event.getPointerCount(); i++)
{
sb.append("#").append(i);
sb.append("(pid ").append(event.getPointerId(i));
sb.append(")=").append((int) event.getX(i));
sb.append(",").append((int) event.getY(i));
if (i + 1 < event.getPointerCount())
sb.append(";");
}
sb.append("]");
Log.d("Touch Events ---------", sb.toString());
}
}
关于Android ImageView 放大和缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6650398/
我有一个模块,其中包含名为String的类(以及其他类。)我需要按名称查找该类,如果没有这样的类,则优雅地回退。moduleMod1moduleStringendendMod1.const_get'String'#⇒Mod1::StringKernel.const_get'::Mod1::String'#⇒Mod1::String到目前为止,还不错。当我尝试查找不存在的类时,我预计会收到NameError,这很好。问题是如果在全局命名空间中存在一个具有给定名称的类,它将被返回:Mod1.const_get'Fixnum'#⇒Fixnum我明白其中的原因,但我的问题是:是否有现成的方法仅
据我们所知,有很多工具或库可以缩小javascript、css,有没有缩小ruby文件的工具或库?在谷歌搜索后,该问题没有正确答案。非常感谢。 最佳答案 使用Jruby!当把你的应用程序打包成war或jar时,你可以给它传递一个compiled标志,它将把.rb文件编译成java的.class字节码文件Warblerdocumentation 关于ruby-如何缩小ruby文件,我们在StackOverflow上找到一个类似的问题: https://s
我尝试了以下方法,但是我查看了CSS源代码,它并没有缩小!我重新启动了服务器几十次。我关闭了浏览器中的缓存。我还尝试了'yui-compressor'gem。配置/环境/development.rbconfig.assets.debug=falseconfig.assets.css_compressor=:sassconfig.assets.compile=truegem文件group:assetsdo#Addanycompassextensionshere#UseSCSSforstylesheetsgem'sass-rails','~>4.0.0'引用http://edgeguide
我正在从事一个不会在生产中缩小CSS或JS的项目。不幸的是,我从来没有遇到过这个问题,我只是不太熟悉Assets管道如何详细工作以调试问题。我的问题是,我需要检查哪些要点/设置以确保它已启用?它正确地将不同的文件组合成一个JS和CSS文件……只是没有缩小。到目前为止,我已将config.assets.js_compressor=:uglifier添加到production.rb,并将uglifier添加到Gemfile,但仍然没有骰子。我正在使用从Rails2升级的Rails3.2.12 最佳答案 此答案适用于rails4rails
为了在svg多边形或圆上有两个笔划和模糊,我创建了一个滤镜来执行此操作,尽管第二个“笔划”(使用滤镜创建)被剪裁或不像一个完美的圆。知道如何以正确的方式解决这个问题吗? 最佳答案 feMorphology在执行扩张时使用方形搜索框,因此它将创建这些裁剪效果。另一种扩大形状并保留原始形状的方法是进行高斯模糊,然后使用feComposite/feFuncA/table将模糊区域转换为完全不透明的形状。像这样: 关于javascript-SVGfeOffset过滤器放大/缩放,我们在Stack
我试图获得相同的行为WilLinssen'simplementation但在d3.js版本4上。我对版本4中的zoomapi很困惑。我在原始实现中所做的更改是:zoom.translate()替换为d3.zoomTransform(selection.node())并添加了适当的点:svg.attr("transform","translate("+t.x+","+t.y+")"+"scale("+t.k+")");这个:zoom.scale(iScale(t)).translate(iTranslate(t));替换为varfoo=iTranslate(t);zoom.transla
我正在尝试通过两个缩放按钮(+)和(-)放大和缩小图像。问题是当图像为全屏尺寸(宽度100%)时“放大”停止。我需要将图像放大到比屏幕尺寸大得多。只是不知道该怎么做。我是Javascript的初学者,所以我希望有人有动力帮助我解决这个Javascript小问题。我想知道是否有任何简单的放大/缩小/重置插件可以与缩放按钮一起使用?图像抓取也很酷。再次感谢!functionzoomin(){varmyImg=document.getElementById("map");varcurrWidth=myImg.clientWidth;if(currWidth==2500)returnfalse
我目前正在重构一个项目,之前所有缩小的JavaScript文件都放在一个特定的目录中。现在我需要将缩小版本保留在与其源文件相同的目录中。目前我这样做:gulp.task('scripts',function(){returngulp.src(source_paths.scripts).pipe(uglify({preserveComments:'false'})).pipe(rename({suffix:".min"})).pipe(gulp.dest('./build/js')).pipe(notify({message:'Scriptstaskcomplete!',onLast:t
我可以使用VisualStudio快捷方式(Ctrl+K+D)取消缩小CSS。同样的技巧不适用于JS文件。如何使用像(Ctrl+K+D)快捷方式那样使用VisualStudio取消缩小JS。我知道网上有很多工具,但我正在搜索VisualStudio。 最佳答案 TooltoUnminify/DecompressJavaScript您不能真正取消缩小javascript,因为缩小后的javascript会用字母替换变量名,并删除代码注释-这些无法“撤消”,因为原始信息不再存在。看来您至少可以重新创建适当的间距,但无法撤消“真正的”缩小
我有一个带有以下代码摘录的Vue.js应用程序:(function(){initApp();})();functioninitApp(){window.myApp=newVue({el:'#wrapper',data(){ return{ somedata:[]}}});}当我尝试缩小它时,它失败并显示错误Error:Unexpectedtoken:punc(()但应用程序运行成功。我不确定为什么? 最佳答案 那些压缩器只支持旧版本的JavaScript。他们最多支持ES5。要使您的代码工作,请转换它:(function(){i