缩放的缩放图像

时间:2014-11-11 21:29:13

标签: android android-volley

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

我的想法是什么?

要扩展凌空库并覆盖其中一个方法,请在下载后立即调整位图大小。

我使用此代码调整手机上已有的图片大小,但这对我的互联网随机图片没有多大帮助。

        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分配下载的图像,然后调整大小然后显示它。 我的问题是:我会延伸什么课?我看了一眼,但由于我没有经验,我无法弄清楚到底要找什么。是ImageLoader吗?更具体地说:我应该覆盖getBitmap()方法并添加编辑版本的代码以进行缩放吗?

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

2 个答案:

答案 0 :(得分:0)

我认为您所看到的问题是由 NetworkImageView 的基础代码的默认行为引起的。

查看 NetworkImageView 使用的 ImageRequest 的代码。有一个名为 getResizedDimension 的函数,它表示类似"缩放矩形的一边以适应宽高比" 。这可能会导致您的问题,因为您下载的图像可能无法为每个特定设备计算完美的宽高比。

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

1。)使用常规ImageView。

2。)使用指向图像网址

的常规排球请求

3。)当你收到响应(parseNetworkResponse)时,使用上面提到的适合你的方法自己解码(字节数组)。有关如何操作的一些提示也可以在此处找到:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

4。)解码后,以解码结果编程设置ImageView的位图

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

<强>建议:

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

答案 1 :(得分:0)

我几天前解决了。以下是常规ImageView处理图像大小调整的方法:如果您使用Match_parent作为宽度并使用wrap_content作为高度(我使用match_parent进行测试且结果相同),如果图片的高度较低,则不会缩放图像比宽度(这是非常典型的)。意味着图像视图基于较小的一侧进行缩放。这意味着有两种解决方案:

  • 做我原本想做的事情,包括编写一个扩展了imageview / networkimageview的新类,然后以编程方式添加我列出的代码以放大图片。
  • 或者只是以编程方式指定所需的视图高度,然后imageview将简单地缩放图像以适应新视图的高度。这个选项使得宽度的wrap_content无效,只需根据需要输入。

以下是我使用的代码:

 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图像,所以我使用的比率为0,5625。如果您不知道图片的参数,这个方法将起作用但是您必须事先获得参数并将它们放到位,所以我想使用第一个策略可能更有用,但是因为我解决了我的问题所以我没有有一个第一种方法的例子。