Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ImageView配合宽度,从顶部开始_Android_Imageview_Resize - Fatal编程技术网

Android ImageView配合宽度,从顶部开始

Android ImageView配合宽度,从顶部开始,android,imageview,resize,Android,Imageview,Resize,我有一个图像,希望它适合宽度,但由于它很长,我需要保持最顶部可见,我尝试使用ImageView: <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@mipmap/day_length_background" android:scaleType="centerCrop" android:adjustViewB

我有一个图像,希望它适合宽度,但由于它很长,我需要保持最顶部可见,我尝试使用ImageView:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@mipmap/day_length_background"
    android:scaleType="centerCrop"
    android:adjustViewBounds="true"
    />

但结果是:

我不能使用fitXY,因为它会改变纵横比

我需要这样
中心裁剪是您的问题。试试fitXY,如果纵横比大致相同,它应该可以工作。

试试
scaleType=“fitStart”

使用Matrix.ScaleToFit.START缩放图像

Matrix.ScaleToFit.START:计算一个将保持 原始src纵横比,但也将确保src完全适合 在dst内部。至少有一个轴(X或Y)将精确匹配。开始对齐 结果显示在dst的左边缘和上边缘


此处参考:

将图像放入可绘制的文件夹,然后将图像放入布局背景,即

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/image">

您还可以将视图一分为二

或者在java中使用自定义矩阵

if (imageView.getScaleType() != ImageView.ScaleType.MATRIX) {
                    imageView.setScaleType(ImageView.ScaleType.MATRIX);
                }
                Matrix m = imageView.getImageMatrix();
                int dw = imageView.getDrawable().getIntrinsicWidth();
                int dh = imageView.getDrawable().getIntrinsicHeight();
                int msWidth, msHeight;
                float scalew, scaleh;

                Display display = activity.getWindowManager().getDefaultDisplay();
                Point size = new Point();
                display.getSize(size);
                msWidth = size.x;
                if (imageView.getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT) {
                    msWidth = dw < msWidth ? dw : msWidth;
                }
                scalew = (float) msWidth / dw;
                msHeight = size.y;
                if (imageView.getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) {
                    msHeight = dh < msHeight ? dh : msHeight;
                }
                scaleh = (float) msHeight / dh;
                float scale = Math.max(scalew, scaleh);

                m.setScale(scale, scale);
                m.postTranslate(0, 0);
                imageView.setImageMatrix(m);
            }
if(imageView.getScaleType()!=imageView.ScaleType.MATRIX){
imageView.setScaleType(imageView.ScaleType.MATRIX);
}
矩阵m=imageView.getImageMatrix();
int dw=imageView.getDrawable().getIntrinsicWidth();
int dh=imageView.getDrawable().getIntrinsicHeight();
int msWidth,msHeight;
浮动scalew,scaleh;
Display Display=activity.getWindowManager().getDefaultDisplay();
点大小=新点();
display.getSize(size);
msWidth=size.x;
if(imageView.getLayoutParams().width==ViewGroup.LayoutParams.WRAP_内容){
msWidth=dw
您可以使用TopCropImageView的此实现:

class TopCropImageView : AppCompatImageView {
    constructor(context: Context) : super(context) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        init()
    }

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        super.onLayout(changed, left, top, right, bottom)
        recomputeImgMatrix()
    }

    override fun setFrame(l: Int, t: Int, r: Int, b: Int): Boolean {
        recomputeImgMatrix()
        return super.setFrame(l, t, r, b)
    }

    private fun init() {
        scaleType = ScaleType.MATRIX
    }

    private fun recomputeImgMatrix() {
        val drawable = drawable ?: return
        val matrix = imageMatrix
        val scale: Float
        val viewWidth = width - paddingLeft - paddingRight
        val viewHeight = height - paddingTop - paddingBottom
        val drawableWidth = drawable.intrinsicWidth
        val drawableHeight = drawable.intrinsicHeight
        scale = if (drawableWidth * viewHeight > drawableHeight * viewWidth) {
            viewHeight.toFloat() / drawableHeight.toFloat()
        } else {
            viewWidth.toFloat() / drawableWidth.toFloat()
        }
        matrix.setScale(scale, scale)
        imageMatrix = matrix
    }
}

顶部会对齐,底部会裁剪视图。

不,fitXY会破坏纵横比。我可以尝试一下。如果您只需要宽度来匹配手机,可以更改高度来包装内容。如果要保持纵横比并匹配屏幕宽度(如果图像因此必须比屏幕长),则可能必须将其置于滚动视图中。请尝试将其设置为imageView的背景。它不起作用。您能否提供指向正在使用的实际图像的链接。fitStart不起作用,因为图像的高度大于屏幕高度,因此它适合高度而不是宽度:|