- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试做一个图像查看器,当用户点击图像时,图像被“裁剪”并显示完整图像。
例如在下面的屏幕截图中,用户最初只能看到小狗的部分。但在用户点击图像后,整只小狗就会显示出来。在第一个后面褪色的图像显示了动画的结果。
最初,ImageView 在 X 和 Y 方向缩放到 50%。当用户单击图像时,ImageView 缩放回 100%,并重新计算 ImageView 矩阵。
我尝试了各种方法来计算矩阵。但我似乎无法找到适用于所有类型裁剪和图像的工具:裁剪横向到纵向、裁剪横向到横向、裁剪纵向到纵向以及裁剪纵向到横向。这可能吗?
这是我的代码。我试图找到要放入 setImageCrop()
的内容。
public class MainActivity extends Activity {
private ImageView img;
private float translateCropX;
private float translateCropY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.img);
Drawable drawable = img.getDrawable();
translateCropX = -drawable.getIntrinsicWidth() / 2F;
translateCropY = -drawable.getIntrinsicHeight() / 2F;
img.setScaleX(0.5F);
img.setScaleY(0.5F);
img.setScaleType(ScaleType.MATRIX);
Matrix matrix = new Matrix();
matrix.postScale(2F, 2F); //zoom in 2X
matrix.postTranslate(translateCropX, translateCropY); //translate to the center of the image
img.setImageMatrix(matrix);
img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final PropertyValuesHolder animScaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1F);
final PropertyValuesHolder animScaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1F);
final ObjectAnimator objectAnim = ObjectAnimator.ofPropertyValuesHolder(img, animScaleX, animScaleY);
final PropertyValuesHolder animMatrixCrop = PropertyValuesHolder.ofFloat("imageCrop", 0F, 1F);
final ObjectAnimator cropAnim = ObjectAnimator.ofPropertyValuesHolder(MainActivity.this, animMatrixCrop);
final AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(objectAnim).with(cropAnim);
animatorSet.start();
}
});
}
public void setImageCrop(float value) {
// No idea how to calculate the matrix depending on the scale
Matrix matrix = new Matrix();
matrix.postScale(2F, 2F);
matrix.postTranslate(translateCropX, translateCropY);
img.setImageMatrix(matrix);
}
}
编辑:值得一提的是,线性缩放矩阵是行不通的。 ImageView 是线性缩放的(0.5 到 1)。但是,如果我在动画期间线性缩放 Matrix,则 View 在动画期间会被挤压。最终结果看起来不错,但在动画过程中图像看起来很丑。
最佳答案
我知道你(和其他答案)一直在尝试使用矩阵操作来解决这个问题,但我想提出一种与你的问题中概述的视觉效果相同的不同方法。
为什么不使用矩阵来操作图像的可见区域( View ),为什么不根据裁剪定义这个可见区域?这是一个很容易解决的问题:我们需要做的就是定义可见矩形,并简单地忽略落在其边界之外的任何内容。如果我们随后为这些边界设置动画,视觉效果就像裁剪边界按比例放大和缩小一样。
幸运的是,一个Canvas
支持通过各种 clip*()
方法进行裁剪来帮助我们解决这个问题。动画裁剪边界很容易,可以用与您自己的代码 fragment 类似的方式完成。
如果你把所有东西放在一个普通 ImageView
的简单扩展中(为了封装),你会得到看起来像这样的东西:
public class ClippingImageView extends ImageView {
private final Rect mClipRect = new Rect();
public ClippingImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initClip();
}
public ClippingImageView(Context context, AttributeSet attrs) {
super(context, attrs);
initClip();
}
public ClippingImageView(Context context) {
super(context);
initClip();
}
private void initClip() {
// post to message queue, so it gets run after measuring & layout
// sets initial crop area to half of the view's width & height
post(new Runnable() {
@Override public void run() {
setImageCrop(0.5f);
}
});
}
@Override protected void onDraw(Canvas canvas) {
// clip if needed and let super take care of the drawing
if (clip()) canvas.clipRect(mClipRect);
super.onDraw(canvas);
}
private boolean clip() {
// true if clip bounds have been set aren't equal to the view's bounds
return !mClipRect.isEmpty() && !clipEqualsBounds();
}
private boolean clipEqualsBounds() {
final int width = getWidth();
final int height = getHeight();
// whether the clip bounds are identical to this view's bounds (which effectively means no clip)
return mClipRect.width() == width && mClipRect.height() == height;
}
public void toggle() {
// toggle between [0...0.5] and [0.5...0]
final float[] values = clipEqualsBounds() ? new float[] { 0f, 0.5f } : new float[] { 0.5f, 0f };
ObjectAnimator.ofFloat(this, "imageCrop", values).start();
}
public void setImageCrop(float value) {
// nothing to do if there's no drawable set
final Drawable drawable = getDrawable();
if (drawable == null) return;
// nothing to do if no dimensions are known yet
final int width = getWidth();
final int height = getHeight();
if (width <= 0 || height <= 0) return;
// construct the clip bounds based on the supplied 'value' (which is assumed to be within the range [0...1])
final int clipWidth = (int) (value * width);
final int clipHeight = (int) (value * height);
final int left = clipWidth / 2;
final int top = clipHeight / 2;
final int right = width - left;
final int bottom = height - top;
// set clipping bounds
mClipRect.set(left, top, right, bottom);
// schedule a draw pass for the new clipping bounds to take effect visually
invalidate();
}
}
真正的“魔法”是添加到覆盖的 onDraw()
方法中的行,其中给定的 Canvas
被剪切到由 mClipRect 定义的矩形区域
。所有其他代码和方法主要用于帮助计算裁剪边界、确定裁剪是否合理以及动画。
在 Activity
中使用它现在简化为:
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image_activity);
final ClippingImageView img = (ClippingImageView) findViewById(R.id.img);
img.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
img.toggle();
}
});
}
}
布局文件将指向我们自定义的 ClippingImageView
,如下所示:
<mh.so.img.ClippingImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/dog" />
让您了解视觉转换:
关于android - 如何将矩阵动画化为 "crop-out"图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18305219/
我正在尝试学习 Knockout 并尝试创建一个照片 uploader 。我已成功将一些图像存储在数组中。现在我想回帖。在我的 knockout 码(Javascript)中,我这样做: 我在 Jav
我正在使用 php 编写脚本。我的典型问题是如何在 mysql 中添加一个有很多替代文本和图像的问题。想象一下有机化学中具有苯结构的描述。 最有效的方法是什么?据我所知,如果我有一个图像,我可以在数据
我在两个图像之间有一个按钮,我想将按钮居中到图像高度。有人可以帮帮我吗? Entrar
下面的代码示例可以在这里查看 - http://dev.touch-akl.com/celebtrations/ 我一直在尝试做的是在 Canvas 上绘制 2 个图像(发光,然后耀斑。这些图像的链接
请检查此https://jsfiddle.net/rhbwpn19/4/ 图像预览对于第一篇帖子工作正常,但对于其他帖子则不然。 我应该在这里改变什么? function readURL(input)
我对 Canvas 有疑问。我可以用单个图像绘制 Canvas ,但我不能用单独的图像绘制每个 Canvas 。- 如果数据只有一个图像,它工作正常,但数据有多个图像,它不工作你能帮帮我吗? va
我的问题很简单。如何获取 UIImage 的扩展类型?我只能将图像作为 UIImage 而不是它的名称。图像可以是静态的,也可以从手机图库甚至文件路径中获取。如果有人可以为此提供一点帮助,将不胜感激。
我有一个包含 67 个独立路径的 SVG 图像。 是否有任何库/教程可以为每个路径创建单独的光栅图像(例如 PNG),并可能根据路径 ID 命名它们? 最佳答案 谢谢大家。我最终使用了两个答案的组合。
我想将鼠标悬停在一张图片(音乐专辑)上,然后播放一张唱片,所以我希望它向右移动并旋转一点,当它悬停时我希望它恢复正常动画片。它已经可以向右移动,但我无法让它随之旋转。我喜欢让它尽可能简单,因为我不是编
Retina iOS 设备不显示@2X 图像,它显示 1X 图像。 我正在使用 Xcode 4.2.1 Build 4D502,该应用程序的目标是 iOS 5。 我创建了一个测试应用(主/细节)并添加
我正在尝试从头开始以 Angular 实现图像 slider ,并尝试复制 w3school基于图像 slider 。 下面我尝试用 Angular 实现,谁能指导我如何使用 Angular 实现?
我正在尝试获取图像的图像数据,其中 w= 图像宽度,h = 图像高度 for (int i = x; i imageData[pos]>0) //Taking data (here is the pr
我的网页最初通过在 javascript 中动态创建图像填充了大约 1000 个缩略图。由于权限问题,我迁移到 suPHP。现在不用标准 标签本身 我正在通过这个 php 脚本进行检索 $file
我正在尝试将 python opencv 图像转换为 QPixmap。 我按照指示显示Page Link我的代码附在下面 img = cv2.imread('test.png')[:,:,::1]/2
我试图在这个 Repository 中找出语义分割数据集的 NYU-v2 . 我很难理解图像标签是如何存储的。 例如,给定以下图像: 对应的标签图片为: 现在,如果我在 OpenCV 中打开标签图像,
import java.util.Random; class svg{ public static void main(String[] args){ String f="\"
我有一张 8x8 的图片。 (位图 - 可以更改) 我想做的是能够绘制一个形状,给定一个 Path 和 Paint 对象到我的 SurfaceView 上。 目前我所能做的就是用纯色填充形状。我怎样才
要在页面上显示图像,你需要使用源属性(src)。src 指 source 。源属性的值是图像的 URL 地址。 定义图像的语法是: 在浏览器无法载入图像时,替换文本属性告诉读者她们失去的信息。此
**MMEditing是基于PyTorch的图像&视频编辑开源工具箱,支持图像和视频超分辨率(super-resolution)、图像修复(inpainting)、图像抠图(matting)、
我正在尝试通过资源文件将图像插入到我的程序中,如下所示: green.png other files 当我尝试使用 QImage 或 QPixm
我是一名优秀的程序员,十分优秀!