- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我关于 stackoverflow 的第一个问题,所以请放轻松。
让我给你一些背景知识:
我创建了一个应用程序来处理 View 中的位图(本例中的图像是设施的 map ),我使用位图上点的实际 x 和 y 坐标在 map 上放置点。我跟踪位图左上角相对于屏幕左上角的偏移量,方法是根据手势对图像位置所做的更改修改此偏移量值。这实际上非常适合平移,这使我可以轻松地将屏幕坐标(从长按手势)转换为位图上的实际坐标。有了这个,我在 map 上画了一个圆圈,并允许用户创建一个我推送到数据库的“兴趣点”。
问题出现在处理缩放的时候。我正在用一个简单的
缩放 canvas.scale(scalefastor,scalefactor);
在绘制中。使用此缩放时,实际缩放比例是相对于图像的左上角进行的,因此捏合缩放并不直观,因为您尝试放大的实际位置很快就会跑到屏幕外。然而,以这种方式缩放图像不会影响图像的实际偏移,因此我的点放置仍然准确。我使用以下简单的数学来完成这个:
bitmapXCoordinate = (event.getX() - xOffset) /scaleFactor;
我想用
canvas.scale(scalefactor, scalefactor, gestureFocusX, gestureFocusY);
为了使缩放对用户直观,但这对位图的实际矩阵进行了转换,因此我的点放置不再起作用。似乎位图上的点现在以某种方式相对于比例尺的焦点,并且所有放置的点都关闭并趋向于该焦点。我知道我需要考虑矩阵上的这种转换才能正确放置我的点,但显然,这需要比我更聪明的人。解决方案可能很简单,但我已经为此工作了好几天试图解释这个新的抵消,但我无法取得任何真正的进展。对此解决方案的任何见解都将不胜感激。
最佳答案
我为此苦苦挣扎了一个多星期,尝试了各种解决方案,然后我发现了一些东西,虽然我不完全理解它 ;),但对工作有好处。您将需要一个双指缩放(或其他) ImageView 的有效实现,您可以从中获取当前的缩放和平移值。
我认为这个问题的困难在于有两个问题需要解决:1,解码对可能缩放和平移的图像的点击,以及 2,渲染存储的点击位置。
无论如何,到代码。注册触摸:
private Float[] getNormalizedTouchLocation(MotionEvent event) {
float xpos = getOffsetX();
float ypos = getOffsetY();
float scale = getScaleFactor();
Drawable drawable = getDrawable();
Rect image_bounds = drawable.getBounds();
Matrix matrix = new Matrix(getImageMatrix());
matrix.postScale(scale, scale, mPivotX, mPivotY);
matrix.postTranslate(xpos, ypos);
RectF image_rect = new RectF(image_bounds);
matrix.mapRect(image_rect);
float x = ((event.getX() - image_rect.left) / scale);
float y = ((event.getY() - image_rect.top) / scale);
return new Float[]{x, y};
}
然后渲染:
public void onDraw(Canvas canvas) {
// Ensure parent leaves the canvas *unscaled* and *untranslated*.
super.onDraw(canvas);
float xpos = getOffsetX();
float ypos = getOffsetY();
float scale = getScaleFactor();
canvas.save();
Matrix matrix = canvas.getMatrix();
matrix.postScale(scale, scale, mPivotX, mPivotY);
matrix.postTranslate(xpos, ypos);
Drawable drawable = getDrawable();
Rect image_bounds = drawable.getBounds();
RectF image_rect = new RectF(image_bounds);
Matrix image_matrix = new Matrix(getImageMatrix());
image_matrix.postScale(scale, scale, mPivotX, mPivotY);
image_matrix.postTranslate(xpos, ypos);
image_matrix.mapRect(image_rect);
// mPoints is a list of float[2] coordinates.
for (Float[] coord: mPoints) {
// Draw a bitmap centered on each touch position.
float x = (scale * coord[0] + image_rect.left) - mBitmap.getWidth() / 2;
float y = (scale * coord[1] + image_rect.top) - mBitmap.getHeight() / 2;
canvas.drawBitmap(mBitmap, x, y, mPaint);
}
canvas.restore();
}
希望这对你有用!显然,这里的解决方案只能正确渲染以相同屏幕分辨率等在相同渲染尺寸图像上注册的点 - 它可能会被修改为存储图像宽度/高度的分数,以用于跨图像/分辨率工作的解决方案。
关于Android 聚焦canvas.scale 操作后难以放置点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15381482/
我正在尝试在 View 中同时使用 scalegesture 监听器和 gesturelistener。如果比例为 1,则一切正常,但如果将比例设置为其他值,图像会跳到一个新位置,然后平滑缩放。 我的
我在使用 Canvas 和 canvas.scale(Scale, Scale) 时遇到图像质量问题;它们看起来完全像下面这样: android:运行时调整大小的图像质量 我相信我已经阅读了所有关于调
我有一个使用 svg 过滤器附加阴影的 svg 图形。我需要缩放阴影,但找不到可以执行此操作的过滤器。有谁知道这是否可能?
我正在构建一个逻辑回归分类器。 我从一组 500.000 条记录开始,我只想使用其中的一个样本。 你有什么建议: 1) 缩放总体然后采样2)缩放样本3) 仅缩放样本的 X_TRAIN 分割? 为什么?
我有一个功能,我用它在鼠标进入时放大图片并在鼠标离开时返回到正常大小。问题是,如果我在允许图片返回正常大小之前快速将鼠标移出然后将鼠标移入,那么图片将从鼠标输入时当前的任何大小放大(x2.7) (并且
可以在 scale-y-2 中使用 zoomtovalues 吗?我在多个 y 轴上有几个系列,我想将每个 scale-y-n 缩放到特定值,但我不知道如何... 谢谢和问候, 最佳答案 我们在最近的
我正在尝试在 Android 中创建(我认为是)一个相对简单的动画。也就是说,我想让某个 TextView 在单击按钮时缩小到 0 并返回到 1。当我单击该按钮时实际发生的是 TextView 立即缩
我有一个元素需要缩放到父元素的 100%。因为该元素包含基于像素的动画和可以缩放的图像,所以我不能使用百分比。有没有办法使用 css transform scale 来做到这一点? 最佳答案 相对 c
我在 ChartJS 中遇到一个奇怪的错误并且不知道如何修复它,由于这个错误我无法更改比例的任何内容。 我的代码(Sensor.tsx): import { useParams } from "sol
我有一些数据,我正试图通过不断增加的分母来准确和精确地处理这些数据。 请假设分子总是有小数。 我在 docs 中看到divide(BigDecimal divisor) 实际上会减小比例,这看起来很奇
喂, https://jsfiddle.net/jbwq6y87/7/ #box { width: 500px; height: 500px; transition: 0.5s; ov
几个 Tk 小部件也存在于 Ttk 版本中。通常它们具有相同的一般行为,但使用“样式”和“主题”而不是每个实例的外观属性(例如 bg 等)。这很好,因为 Ttk 小部件默认采用操作系统窗口管理器的“标
我尝试转换视频并使用 scale=-1:720 调整其大小,但出现错误“宽度不能被 2 整除”。我解决了这个问题:scale=-2:720。 之间有什么区别 scale=-1:720 和 scale=
我正在尝试重新创建此 codepen变换:我网站上特定页面的缩放转换,但它没有按预期工作 - 正如您在此代码片段中看到的那样(在整页上查看) - 图像覆盖/覆盖不足和不稳定而不是平滑。 /* Part
我有 3 个 Scale 小部件 scale1、scale2 和 scale3。我想使用 scale1 按以下方式控制 scale2 和 scale3 的值: 我不希望 scale2 和 scale3
我目前正在将我的数据分析从 R 转移到 Python。在 R 中缩放数据集时,我会使用 R.scale(),据我所知,它会执行以下操作:(x-mean(x))/sd(x) 为了替换该函数,我尝试使用
从文档中,定义为: 量化 ..a variant of linear scales with a discrete rather than continuous range. The input do
我有一个时基折线图,我正在尝试获取点击坐标处每个刻度的值。 我在 ChartJS 选项中指定的 onClick 函数: onClick: function(event, elementsAtEvent
我见过这样写的代码: ,但我也看到过这样写的代码: initial-scale=1 和 initial-scale=1.0 有区别吗? 最佳答案 没有。 specification描述视口(viewp
给定 y 轴 (s) 上的缩放和 x 轴 (t) 上的平移参数,当目的是最大化曲线叠加(而不是最小化距离)时,如何缩放和对齐两条不重合的曲线? 正如 @DWin 所指出的,这可能会被重新命名为“如何使
我是一名优秀的程序员,十分优秀!