如何在不调整大小的情况下从流创建Drawable?

时间:2011-09-09 12:58:39

标签: android

如果我的应用程序的最小目标SDK设置为4,则所有对Drawable.createFromStream的调用都会调整图像大小。

e.g。如果源图像宽度为480px且运行我的应用程序的Android设备的密度为1.5,则以下代码返回宽度为320的BitmapDrawable

URL url = new URL("http://www.examples.com/something.png");

Drawable d = Drawable.createFromStream(url.openStream(), "something.png");

是否有方法强制它不变或指定比例(ldpi / mdpi / hdpi etC)从InputStream返回图像?

编辑:来自下方的解决方案。

Bitmap b = BitmapFactory.decodeStream(inputStream);
b.setDensity(Bitmap.DENSITY_NONE);
Drawable d = new BitmapDrawable(b);

3 个答案:

答案 0 :(得分:11)

您可以将图片加载为位图。这样它的大小就不会改变。

BitmapFactory.decodeStream(...)

或者您可以尝试BitmapDrawable(InputStream is)构造函数。它已被弃用,但我想它应该可以胜任。

答案 1 :(得分:2)

从ImageView适配器中的本地资源加载图像

我被Koushik Dutta的OOM错误所困,因为从资源文件夹中加载了2张图像。即使他提到它可能会发生,因为它们不是数据流。并建议将它们加载为InputStream。

我放弃了离子库,因为我只需要来自当地的4张图片。

这是使用简单ImageView的解决方案。

在RecyclerViewAdapter /或任何

<!DOCTYPE HTML>
    <html>
    <head>
        <title>
            Scroll upto Div with jQuery.
        </title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
        <script>
            $(document).ready(function () {
                $("#button1").click(function () {
                    var x = $("#element").position(); //gets the position of the div element...
                    window.scrollTo(x.left, x.top); //window.scrollTo() scrolls the page upto certain position....
                    //it takes 2 parameters : (x axis cordinate, y axis cordinate);
                });
            });
            </script>
    </head>
    <body>
        <button id="button1">
            Click here to scroll
        </button>

        <div id="element" style="position:absolute;top:200%;left:0%;background-color:orange;height:100px;width:200px;">
            The DIV element.
            </div>
        </body>
    </html>

虽然 Drawable d = new BitmapDrawable(b); 已弃用,但工作做得很好。

所以我们可以直接通过这一行从InputStream中获取drawable。

 InputStream inputStream = mContext.getResources().openRawResource(R.drawable.your_id);

    Bitmap b = BitmapFactory.decodeStream(inputStream);
    b.setDensity(Bitmap.DENSITY_NONE);
    Drawable d = new BitmapDrawable(b);
    holder.mImageView.setImageDrawable(d);

希望它有所帮助。

答案 2 :(得分:1)

经过很长一段时间,我遇到了以下解决方案。有用。它从locallink的文件中检索创建位图。

private Drawable getDrawableForStore(String localLink) {
    Bitmap thumbnail = null;
    try {
        File filePath = this.getFileStreamPath(localLink);
        FileInputStream fi = new FileInputStream(filePath);
        thumbnail = BitmapFactory.decodeStream(fi);
    } catch (Exception ex) {
        Log.e("getThumbnail() on internal storage", ex.getMessage());
        return null;
    }

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    float scaledDensity = metrics.density;
    int width = thumbnail.getWidth();
    int height = thumbnail.getHeight();

    if(scaledDensity<1){

        width = (int) (width *scaledDensity);
        height = (int) (height *scaledDensity);
    }else{
        width = (int) (width +width *(scaledDensity-1));
        height = (int) (height +height *(scaledDensity-1));
    }

    thumbnail = Bitmap.createScaledBitmap(thumbnail, width, height, true);
    Drawable d = new BitmapDrawable(getResources(),thumbnail);

    return d;

}