Android Stretch ImageView填充宽度,保持宽高比,对齐顶部

Android开发

我正在尝试展开一个ImageView位于内的RelativeLayout我希望宽度填充父级,同时仍保持图像的高宽比。这听起来很可怕,就像我只能在XML布局文件中使用centerCrop一样。不同之处在于我不希望图像居中对齐。我想要的是将图像与父对象的顶部对齐,并在图像的底部修剪掉多余的部分。

这是XML:

<RelativeLayout
        android:background="#f00"
        android:id="@+id/skyline_header"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="25">

        <ImageView
            android:id="@+id/bg_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/bg_img"/>
</RelativeLayout>

这是我的代码:

final RelativeLayout headerContainer = (RelativeLayout) view.findViewById(R.id.skyline_header);
final ImageView iv = (ImageView) view.findViewById(R.id.bg_image);

ViewTreeObserver vto = headerContainer.getViewTreeObserver();

vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {

        headerContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this);

        double imgAspectRatio = (double)iv.getMeasuredWidth() / (double)iv.getMeasuredHeight();

        int screenWidth = getActivity().getResources().getDisplayMetrics().widthPixels;

        Log.d("tag", Integer.toString(iv.getMeasuredWidth()));
        Log.d("tag", Integer.toString(iv.getMeasuredHeight()));
        Log.d("tag", Double.toString(imgAspectRatio));
        Log.d("tag", Integer.toString(screenWidth));

        int newHeight = (int) ((double)screenWidth * imgAspectRatio);

        img.setLayoutParams(new RelativeLayout.Layout(screenWidth, newHeight));
        img.requestLayout();
    }
});

如果您刚设置,此代码将产生与您看到的完全一样的结果scaleType="fitCenter"它填充了容器的高度,使图像居中,并在左右两侧留有边距。

输出是奇怪的。它显示图像视图具有与屏幕相同的宽度:

1440
562
2.5622775800711746
1440

希望这将在概念上传达我现在所拥有的:

在此处输入图片说明

我希望图片能延伸到整个水平空间(没有可见的红色残影),而又不会使游泳者看起来异常地宽(即保持长宽比不变)。可以根据需要修剪游泳者下方的水,以保持前两个要求。

法尔沙德·塔马斯比(Farshad Tahmasbi)

好吧,幸运的是android API提供了另一个scaleTypematrix,因此您可以自由显示想要的图像部分,将这些代码行添加到:的onCreate方法中Activity

    final ImageView iv = (ImageView) findViewById(R.id.iv);
    iv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int viewWidth = iv.getMeasuredWidth();
            int viewHeight = iv.getMeasuredHeight();
            Drawable src = iv.getDrawable();
            if (src != null) {
                int srcWidth = src.getIntrinsicWidth();
                int srcHeight = src.getIntrinsicHeight();
                float wRatio = (float) viewWidth / srcWidth;
                float hRatio = (float) viewHeight / srcHeight;
                float scaleFactor = Math.max(wRatio, hRatio);
                float hTranslate = (viewWidth - scaleFactor * srcWidth) / 2;
                Matrix matrix = new Matrix();
                matrix.setScale(scaleFactor, scaleFactor);
                matrix.postTranslate(hTranslate, 0);
                iv.setScaleType(ImageView.ScaleType.MATRIX);
                iv.setImageMatrix(matrix);

                Log.i("test", "srcWidth: " + srcWidth);
                Log.i("test", "srcHeight: " + srcHeight);
                Log.i("test", "viewWidth: " + viewWidth);
                Log.i("test", "viewHeight: " + viewHeight);
                Log.i("test", "wRatio: " + wRatio);
                Log.i("test", "hRatio: " + hRatio);
                Log.i("test", "scaleFactor: " + scaleFactor);
                Log.i("test", "hTranslate: " + hTranslate);
            }
            iv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    });

首先注册一个,OnGlobalLayoutListener这样您将在正确的时间访问视图的尺寸(我相信您已经知道了),然后使用提供的参数计算wRatio(宽度比)和hRatio(高度比),然后选择较大的作为scaleFactor(因此您确保drawable覆盖整个视图),还需要drawable水平居中对齐(这是角色hTranslate扮演),最后创建矩阵,我们就在这里!

原始图片:

在此处输入图片说明

centerCrop结果:

在此处输入图片说明

topCrop结果(我们通过代码执行的操作)

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android Stretch ImageView填充宽度,保持宽高比,对齐顶部

来自分类常见问题

缩放图像以填充ImageView宽度并保持宽高比

来自分类Dev

WPF Dockpanel 宽度 Stretch in xaml

来自分类Dev

使图像适合屏幕顶部,填充宽度,保持宽高比

来自分类Dev

Android XML-在保持任何宽度比的同时具有ImageView填充高度

来自分类Dev

图像未在ImageView Android中填充宽度

来自分类Dev

为什么UserControl不能填充VerticalContentAlignment'Stretch'?

来自分类Dev

相应地填充宽度和比例高度ImageView Android

来自分类Dev

Android调整大小的位图保持宽高比

来自分类Dev

Android:如何在保持宽高比的同时用图像填充屏幕并同时处理横向和纵向方向

来自分类Dev

如何将ImageView与底部对齐,填充其宽度和高度并保持其纵横比?

来自分类Dev

Android ListView项目在顶部对齐

来自分类Dev

Android ImageView setLayoutParams的宽度大于屏幕的宽度

来自分类Dev

Android Gallery子填充宽度

来自分类Dev

在Android中保持ImageView的比例

来自分类Dev

背景尺寸封面无法保持宽高比,Android chrome

来自分类Dev

背景尺寸的封面无法保持宽高比,Android chrome

来自分类Dev

如何使用百分比支持lib设置ImageView宽度并保持宽高比?

来自分类Dev

Segfault与Debian Stretch

来自分类Dev

在imageview android顶部动态添加textview

来自分类Dev

在ImageView的顶部设置TextView-Android布局

来自分类Dev

android ImageView:将图像放在顶部

来自分类Dev

在Android中将TextView放在ImageView的顶部

来自分类Dev

Android:TextView是否未设置在ImageView的顶部?

来自分类Dev

Android将ImageView放在Canvas顶部

来自分类Dev

Android图像以正确的高度填充可用宽度

来自分类Dev

Debian Stretch无法从Stretch-backports获得软件包

来自分类Dev

在Android中正确的宽高比

来自分类Dev

在Android中正确的宽高比

Related 相关文章

  1. 1

    Android Stretch ImageView填充宽度,保持宽高比,对齐顶部

  2. 2

    缩放图像以填充ImageView宽度并保持宽高比

  3. 3

    WPF Dockpanel 宽度 Stretch in xaml

  4. 4

    使图像适合屏幕顶部,填充宽度,保持宽高比

  5. 5

    Android XML-在保持任何宽度比的同时具有ImageView填充高度

  6. 6

    图像未在ImageView Android中填充宽度

  7. 7

    为什么UserControl不能填充VerticalContentAlignment'Stretch'?

  8. 8

    相应地填充宽度和比例高度ImageView Android

  9. 9

    Android调整大小的位图保持宽高比

  10. 10

    Android:如何在保持宽高比的同时用图像填充屏幕并同时处理横向和纵向方向

  11. 11

    如何将ImageView与底部对齐,填充其宽度和高度并保持其纵横比?

  12. 12

    Android ListView项目在顶部对齐

  13. 13

    Android ImageView setLayoutParams的宽度大于屏幕的宽度

  14. 14

    Android Gallery子填充宽度

  15. 15

    在Android中保持ImageView的比例

  16. 16

    背景尺寸封面无法保持宽高比,Android chrome

  17. 17

    背景尺寸的封面无法保持宽高比,Android chrome

  18. 18

    如何使用百分比支持lib设置ImageView宽度并保持宽高比?

  19. 19

    Segfault与Debian Stretch

  20. 20

    在imageview android顶部动态添加textview

  21. 21

    在ImageView的顶部设置TextView-Android布局

  22. 22

    android ImageView:将图像放在顶部

  23. 23

    在Android中将TextView放在ImageView的顶部

  24. 24

    Android:TextView是否未设置在ImageView的顶部?

  25. 25

    Android将ImageView放在Canvas顶部

  26. 26

    Android图像以正确的高度填充可用宽度

  27. 27

    Debian Stretch无法从Stretch-backports获得软件包

  28. 28

    在Android中正确的宽高比

  29. 29

    在Android中正确的宽高比

热门标签

归档