我正在设计一个必须在所有 android 设备上看起来都不错的应用程序。在我想设置背景的活动中。我要使用的图像在右下角有一个重要人物我想要什么: - 保持纵横比 - 原始图像的右下角必须可见 - 全屏 - 必须在纵向和横向上工作
我已经尝试了所有的 scaletype 选项,fit 选项不会填满整个屏幕,并且 centercrop 会在所有侧面进行裁剪(因此它会切掉右下角的一部分)。
首先为您的drawable创建一个imageView并通过更改<ImageView>
为自定义它<com.packagename.CenterCropShiftsUp>
,并将scaleType设置为centerCrop。在我刚刚提到的包中创建 CenterCropShiftsUp.java,并使用此代码将 drawable 向上移动:
package nl.mijnverzekering.views;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
public class CenterCropShiftsUp extends ImageView
{
public CenterCropShiftsUp(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
protected boolean setFrame(int l, int t, int r, int b)
{
int drawableWidth = getDrawable().getIntrinsicWidth();
int drawableHeight = getDrawable().getIntrinsicHeight();
int viewWidth = r - getPaddingLeft() - getPaddingRight();
int viewHeight = b - getPaddingTop() - getPaddingBottom();
float heightRatio = 1 / ((float) drawableHeight / (float) viewHeight);
float widthRatio = 1 / ((float) drawableWidth / (float) viewWidth);
// Choose the biggest ratio as scaleFactor
// (centerCrop does the same: the drawable never scales down to leave part of the screen empty)
float scale = heightRatio > widthRatio ? heightRatio : widthRatio;
int newDrawableHeight = (int) (scale * (float) drawableHeight);
// Shifts the t (top) of the imageFrame up (t -=)
// This calculation aligns the bottom of the drawable to the bottom of the screen
t -= (newDrawableHeight - b);
return super.setFrame(l, t, r, b);
}
}
它首先计算图像的 scaleFactor,然后使用这个比例来计算新的 drawableHeight(就像 centerCrop 一样)。使用这个高度,您可以计算 ImageView 的框架应该向上移动多远(setFrame()
用于使可绘制对象的底部与屏幕底部对齐)。
由于 centerCrop 本身的属性,您还要求的右侧对齐当然是自动修复的。
似乎有点晚了,但我想发布我的答案。我需要有一个左上角的视图,而宽度总是被裁剪的。我找到了这个库(https://github.com/cesards/CropImageView),但我决定只使用它的一部分。它最终在我的自定义图像视图的构造函数中覆盖setFrame
并将比例类型设置为。Matrix
@Override
protected boolean setFrame(int l, int t, int r, int b) {
boolean changed = super.setFrame(l, t, r, b);
int viewWidth = r - getPaddingLeft() - getPaddingRight();
int viewHeight = b - getPaddingTop() - getPaddingBottom();
if (viewHeight > 0 && viewWidth > 0) {
final Matrix matrixCopy = new Matrix();
matrixCopy.set(getImageMatrix());
final Drawable drawable = getDrawable();
int drawableWidth = drawable.getIntrinsicWidth();
int drawableHeight = drawable.getIntrinsicHeight();
float scaleY = (float) viewHeight / (float) drawableHeight;
float scaleX = (float) viewWidth / (float) drawableWidth;
float scale = scaleX > scaleY ? scaleX : scaleY;
matrixCopy.setScale(scale, scale);
setImageMatrix(matrixCopy);
}
return changed;
}