我正在尝试做一个图像查看器,当用户单击图像时,图像被“裁剪”并显示完整的图像。
例如,在下面的屏幕截图中,用户最初只能看到小狗的一部分。但是在用户点击图片后,整只小狗就会被显示出来。第一个后面的图像褪色显示了动画的结果。
最初,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)。但是,如果我在动画期间线性缩放矩阵,则视图在动画期间是挤压的。最终结果看起来不错,但在动画过程中图像看起来很难看。