Java 将ImageView中的图像缩放到高度,将纵横比保持在屏幕边界之外,并向右对齐

Java 将ImageView中的图像缩放到高度,将纵横比保持在屏幕边界之外,并向右对齐,java,android,xml,android-layout,Java,Android,Xml,Android Layout,我有一个图像,我想匹配屏幕的高度,延伸超过屏幕的左边缘,将图像的右侧与屏幕的右侧对齐 XML解决方案更好,但Java解决方案也可以 我该怎么做? 您需要使用矩阵缩放并自行设置矩阵。这并不难 您必须在布局视图后执行此操作,以便获得图像视图的尺寸。您还需要设置的可绘制或位图的尺寸 首先,您必须计算出图像的缩放(倍增)程度,以便高度与ImageView的高度相同。为此,只需将ImageView高度除以图像高度即可 现在您也知道了图像的宽度。要使图像的右边缘与ImageView对齐,需要将图像向左移动

我有一个图像,我想匹配屏幕的高度,延伸超过屏幕的左边缘,将图像的右侧与屏幕的右侧对齐

XML解决方案更好,但Java解决方案也可以

我该怎么做?

您需要使用矩阵缩放并自行设置矩阵。这并不难

您必须在布局视图后执行此操作,以便获得
图像视图的尺寸。您还需要设置的
可绘制
位图的尺寸

  • 首先,您必须计算出图像的缩放(倍增)程度,以便高度与
    ImageView
    的高度相同。为此,只需将
    ImageView
    高度除以图像高度即可

  • 现在您也知道了图像的宽度。要使图像的右边缘与
    ImageView
    对齐,需要将图像向左移动(平移)其宽度,然后将其移回
    ImageView
    的宽度。因此,转换只是图像宽度和
    ImageView
    宽度的差异

我是这样做的:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageView imageView = (ImageView) findViewById(R.id.imageview);

        imageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {

                BitmapDrawable drawable = null;
                if (Build.VERSION.SDK_INT >= 21) {
                    drawable = (BitmapDrawable) getResources().getDrawable(R.drawable.sunset, getTheme());
                } else {
                    drawable = (BitmapDrawable) getResources().getDrawable(R.drawable.sunset);
                }
                Bitmap bitmap = drawable.getBitmap();

                // get the scale factor that will have to be applied to
                // the image to make it the same height as your ImageView
                float factor = (float) imageView.getHeight() / (float) bitmap.getHeight();

                // now the image will have to be shifted over all of its
                // width minus the width of the ImageView.  This will make
                // the right edges line up.
                int scaledImageWidth = (int) (bitmap.getWidth() * factor);
                int translateX = imageView.getWidth() - scaledImageWidth;

                // you can also use drawable.getIntrinsicWidth() and
                //     drawable.getIntrinsicHeight()

                Matrix matrix = new Matrix();
                matrix.setScale(factor, factor);
                matrix.postTranslate(translateX, 0);

                imageView.setScaleType(ImageView.ScaleType.MATRIX);
                imageView.setImageMatrix(matrix);
                imageView.setImageBitmap(bitmap);
            }
        });
    }

您需要使用矩阵缩放并自行设置矩阵。这并不难

您必须在布局视图后执行此操作,以便获得
图像视图的尺寸。您还需要设置的
可绘制
位图的尺寸

  • 首先,您必须计算出图像的缩放(倍增)程度,以便高度与
    ImageView
    的高度相同。为此,只需将
    ImageView
    高度除以图像高度即可

  • 现在您也知道了图像的宽度。要使图像的右边缘与
    ImageView
    对齐,需要将图像向左移动(平移)其宽度,然后将其移回
    ImageView
    的宽度。因此,转换只是图像宽度和
    ImageView
    宽度的差异

我是这样做的:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageView imageView = (ImageView) findViewById(R.id.imageview);

        imageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {

                BitmapDrawable drawable = null;
                if (Build.VERSION.SDK_INT >= 21) {
                    drawable = (BitmapDrawable) getResources().getDrawable(R.drawable.sunset, getTheme());
                } else {
                    drawable = (BitmapDrawable) getResources().getDrawable(R.drawable.sunset);
                }
                Bitmap bitmap = drawable.getBitmap();

                // get the scale factor that will have to be applied to
                // the image to make it the same height as your ImageView
                float factor = (float) imageView.getHeight() / (float) bitmap.getHeight();

                // now the image will have to be shifted over all of its
                // width minus the width of the ImageView.  This will make
                // the right edges line up.
                int scaledImageWidth = (int) (bitmap.getWidth() * factor);
                int translateX = imageView.getWidth() - scaledImageWidth;

                // you can also use drawable.getIntrinsicWidth() and
                //     drawable.getIntrinsicHeight()

                Matrix matrix = new Matrix();
                matrix.setScale(factor, factor);
                matrix.postTranslate(translateX, 0);

                imageView.setScaleType(ImageView.ScaleType.MATRIX);
                imageView.setImageMatrix(matrix);
                imageView.setImageBitmap(bitmap);
            }
        });
    }