Android 截击缩放图像

Android 截击缩放图像,android,android-volley,Android,Android Volley,我试图拉伸截击时加载的图像。XML没有多大帮助,虽然它可以缩小它们,但无助于扩大它们。我对这个主题的探索使我得出结论,这只能通过编程实现 我的想法是什么 要扩展volley库并覆盖其中一个方法,请在下载后和显示之前调整位图的大小 我用这段代码来调整手机上已经存在的图像大小,但这对我处理来自互联网的随机图像没有多大帮助 Point outSize=new Point(); float destWidth=1; float destHeight=1

我试图拉伸截击时加载的图像。XML没有多大帮助,虽然它可以缩小它们,但无助于扩大它们。我对这个主题的探索使我得出结论,这只能通过编程实现

我的想法是什么

要扩展volley库并覆盖其中一个方法,请在下载后和显示之前调整位图的大小

我用这段代码来调整手机上已经存在的图像大小,但这对我处理来自互联网的随机图像没有多大帮助

        Point outSize=new Point();
        float  destWidth=1;
        float  destHeight=1;

        @SuppressWarnings("deprecation")
        @TargetApi(13)
        private Bitmap scaleBitmap(int mFile){
            Display display = getActivity().getWindowManager().getDefaultDisplay();
            if (android.os.Build.VERSION.SDK_INT >= 13){
                display.getSize(outSize);
                destWidth = outSize.x;
                destHeight = outSize.y;
            }else{
                destWidth=display.getWidth();
                destWidth=display.getHeight();
            }

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            Bitmap orig = BitmapFactory.decodeResource(getResources(), mFile);
            float srcWidth = orig.getWidth();
            float srcHeight = orig.getHeight();
            float inSampleSize = 1;
            if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                inSampleSize=(destHeight/2)/srcHeight;
            }else{
            inSampleSize=(destHeight/4)/srcHeight;}
            options = new BitmapFactory.Options();
            Bitmap resized=Bitmap.createScaledBitmap(orig, (int)Math.round(orig.getWidth()*inSampleSize), (int)Math.round(orig.getHeight()*inSampleSize), true);
            destWidth=1;
            destHeight=1;
            return resized;
        }
基本上,我想把下载的图像分配给orig,然后调整它的大小,然后显示它。 我的问题是:我要扩展什么课程?我看了一下那里,但由于我没有经验,我不知道到底要找什么。是图像加载器吗?更具体地说:我应该重写getBitmap()方法并添加用于缩放的代码的编辑版本吗


免责声明:我非常缺乏经验,我也会接受其他想法。

我认为您看到的问题是由NetworkImageView底层代码工作方式的默认行为造成的

请查看NetworkImageView使用的代码。那里有一个叫做getResizedDimension的函数,它表示类似“缩放矩形的一侧以适应纵横比”。这可能导致您的问题,因为您正在下载的图像可能没有针对特定设备每次计算的完美纵横比

您是在显示单个图像,还是在网格中显示图像?如果它只是一个图像,可能会有一个解决方案。我还没有看到您在哪里设置图像或图像url的完整代码,因此我将在这里假设流程:

1.)使用常规图像视图

2.)使用指向图像URL的常规截击请求

3.)当您收到响应(parseNetworkResponse)时,请使用上述适合您的方法自行解码(字节数组)。关于如何做到这一点,也可以在此处找到一些提示:

4.)解码后,以编程方式使用解码结果设置ImageView的位图

如果这是一个网格类型的东西,那么您可能需要创建自己版本的NetworkImageView及其底层支持类(子类)

建议:


如果你有选择图书馆的自由,也可以看看。看起来非常简单,可以满足您的需求。

我几天前解决了这个问题。以下是常规ImageView处理图像大小调整的方式:如果使用Match_parent作为宽度,使用wrap_内容作为高度(我将两者都作为Match_parent进行测试,结果相同),则如果图片的高度低于宽度(这非常典型),它将不会缩放图像。这意味着图像视图基于较小的一侧进行缩放。这意味着有两种解决方案:

  • 做我最初想做的事情,包括编写一个扩展imageview/networkimageview的新类,然后以编程方式添加我列出的代码以放大图片
  • 或者简单地以编程方式指定所需的视图高度,然后imageview将简单地缩放图像以适应新视图的高度。此选项将使宽度的换行内容无效,并且只需输入所需的内容即可
以下是我使用的代码:

 Display display = getActivity().getWindowManager().getDefaultDisplay();
 Point outSize=new Point();
 int destWidth;
 if (android.os.Build.VERSION.SDK_INT >= 13){
    display.getSize(outSize);
    destWidth = outSize.x;
 }else{
    destWidth=display.getWidth();
 }
 img.setLayoutParams(new RelativeLayout.LayoutParams( LayoutParams.MATCH_PARENT,destWidth*5625/10000));

在我的例子中,我需要适合640x360的图像,所以我使用了05625的比率。如果您不知道图片的参数,但必须事先获取参数并将其放置到位,则此方法将起作用,因此我想使用第一种策略可能更有用,但由于我解决了问题,因此没有第一种方法的示例。

您使用的是NetworkImageView吗?它应该为你做缩放。是的。我尝试使用linearlayout设置androdi_权重,但图片保持不变。但是,视图会变大(意味着背景图像会被拉伸以适应)。正如我所说的,如果我降低重量,图片会变小,但在达到原始尺寸后,图片会停止。这就是我要添加大小调整的地方。您需要更改NetworkImageView的scaleType。试试android:scaleType=“fitCenter”我已经尝试了所有8个scaleType选项,没有一个能满足我的需要。我需要的图片,以配合家长的宽度和采取尽可能多的空间,因为它需要的高度(包装内容)。但是scaleType中没有一个选项可以做到这一点。它们要么在父对象内部不匹配,要么扭曲或剪切图像。对于布局的宽度和高度,我分别使用了match/wrap。它适合X轴,但在Y轴上扭曲。它不能保持相同的比率。