Android图像视图顶部裁剪
Posted
技术标签:
【中文标题】Android图像视图顶部裁剪【英文标题】:Android image view top crop 【发布时间】:2014-03-10 00:12:29 【问题描述】:我正在开发一个 android 应用程序,我需要在屏幕顶部使用一个类似于操作栏的标题.....我希望它是透明的,但是当您开始滚动视图时,所有内容视图在它后面所以我决定使用图像视图(它必须在任何片段中都不同,这就是我不使用操作栏的原因)所以我使用了框架布局并将图像视图固定在顶部的高度50 并且我使用了与图像视图源相同的主视图背景....寻找这样的东西:
这与中心裁剪完全相同,但从图像顶部裁剪。 我用了this link,但这不是我要找的......
【问题讨论】:
【参考方案1】:顶部裁剪图像视图:
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import android.widget.ImageView;
public class TopCropImageView extends ImageView
private Matrix mMatrix;
private boolean mHasFrame;
@SuppressWarnings("UnusedDeclaration")
public TopCropImageView(Context context)
this(context, null, 0);
@SuppressWarnings("UnusedDeclaration")
public TopCropImageView(Context context, AttributeSet attrs)
this(context, attrs, 0);
@SuppressWarnings("UnusedDeclaration")
public TopCropImageView(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
mHasFrame = false;
mMatrix = new Matrix();
// we have to use own matrix because:
// ImageView.setImageMatrix(Matrix matrix) will not call
// configureBounds(); invalidate(); because we will operate on ImageView object
@Override
protected boolean setFrame(int l, int t, int r, int b)
boolean changed = super.setFrame(l, t, r, b);
if (changed)
mHasFrame = true;
// we do not want to call this method if nothing changed
setupScaleMatrix(r-l, b-t);
return changed;
private void setupScaleMatrix(int width, int height)
if (!mHasFrame)
// we have to ensure that we already have frame
// called and have width and height
return;
final Drawable drawable = getDrawable();
if (drawable == null)
// we have to check if drawable is null because
// when not initialized at startup drawable we can
// rise NullPointerException
return;
Matrix matrix = mMatrix;
final int intrinsicWidth = drawable.getIntrinsicWidth();
final int intrinsicHeight = drawable.getIntrinsicHeight();
float factorWidth = width/(float) intrinsicWidth;
float factorHeight = height/(float) intrinsicHeight;
float factor = Math.max(factorHeight, factorWidth);
// there magic happen and can be adjusted to current
// needs
matrix.setTranslate(-intrinsicWidth/2.0f, 0);
matrix.postScale(factor, factor, 0, 0);
matrix.postTranslate(width/2.0f, 0);
setImageMatrix(matrix);
@Override
public void setImageDrawable(Drawable drawable)
super.setImageDrawable(drawable);
// We have to recalculate image after chaning image
setupScaleMatrix(getWidth(), getHeight());
@Override
public void setImageResource(int resId)
super.setImageResource(resId);
// We have to recalculate image after chaning image
setupScaleMatrix(getWidth(), getHeight());
@Override
public void setImageURI(Uri uri)
super.setImageURI(uri);
// We have to recalculate image after chaning image
setupScaleMatrix(getWidth(), getHeight());
// We do not have to overide setImageBitmap because it calls
// setImageDrawable method
【讨论】:
【参考方案2】:我设法使用可以在此处找到的 PhotoView 库来实现这一点: https://github.com/chrisbanes/PhotoView
您需要做的就是设置库并在您使用的图像视图中将比例类型设置为 CENTER_CROP。然后在库中转到 PhotoViewAttacher.java 文件,在 CENTER_CROP 代码所在的 updateBaseMatrix() 方法下,将其更改为以下内容:
else if (mScaleType == ScaleType.CENTER_CROP)
float scale = Math.max(widthScale, heightScale);
mBaseMatrix.postScale(scale, scale);
//Changed dy = 0 for top crop
mBaseMatrix.postTranslate((viewWidth - drawableWidth * scale) / 2F,
0);
基本上,您设置 dy=0 以使矩阵保持在 y 轴上图像的顶部并且不居中。 CENTER_CROP 比例类型的行为类似于 TOP_CROP
【讨论】:
非常感谢,它节省了我很多时间!【参考方案3】:你的方法有点老套,我建议你看看使用粘性片段(例如)。
视频、源码和样例可以在this Google+ Post找到
【讨论】:
这不是我需要的,但非常有帮助......谢谢:)以上是关于Android图像视图顶部裁剪的主要内容,如果未能解决你的问题,请参考以下文章