2

I'm loading the feed from the URL and getting text with images which I put in the TextView but images inside the TextView are small on displays more than 3.5 inches. I guess that the problem is in setBounds method. Here is my class:

public class URLImageParser implements Html.ImageGetter {
Context c;
TextView container;


/***
 * Construct the URLImageParser which will execute AsyncTask and refresh the container
 * @param t
 * @param c
 */



public URLImageParser(TextView t, Context c) {
    this.c = c;
    this.container = t;
}

public Drawable getDrawable(String source) {
    URLDrawable urlDrawable = new URLDrawable();

    // get the actual source
    ImageGetterAsyncTask asyncTask =
            new ImageGetterAsyncTask( urlDrawable);

    asyncTask.execute(source);

    // return reference to URLDrawable where I will change with actual image from
    // the src tag
    return urlDrawable;
}

public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {
    URLDrawable urlDrawable;

    public ImageGetterAsyncTask(URLDrawable d) {
        this.urlDrawable = d;
    }

    @Override
    protected Drawable doInBackground(String... params) {
        String source = params[0];
        return fetchDrawable(source);
    }

    @Override
    protected void onPostExecute(Drawable result) {
        try {
            // set the correct bound according to the result from HTTP call
            urlDrawable.setBounds(0, 0, result.getIntrinsicWidth(), result.getIntrinsicHeight());


            // change the reference of the current drawable to the result
            // from the HTTP call
            urlDrawable.drawable = result;


            // For ICS
            URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight()
                    + result.getIntrinsicHeight()));

            // redraw the image by invalidating the container
            URLImageParser.this.container.invalidate();
        } catch (NullPointerException ex){
            urlDrawable.setBounds(0,0,0,0);
            urlDrawable.drawable = result;

        }
        // Pre ICS
        URLImageParser.this.container.setEllipsize(null);
    }

    /***
     * Get the Drawable from URL
     * @param urlString
     * @return
     */
    public Drawable fetchDrawable(String urlString) {
        try {
            InputStream is = fetch(urlString);
            Drawable drawable = Drawable.createFromStream(is, "src");
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            return drawable;
        } catch (Exception e) {
            return null;
        }
    }

    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(urlString);
        HttpResponse response = httpClient.execute(request);
        return response.getEntity().getContent();
    }
  }
}

How can I solve my problem? I want to fill TextView with images use device screen width or any other width which can make pictures with big size.

vendettacore
  • 1,439
  • 1
  • 13
  • 28

2 Answers2

1

As stated elsewhere, you cannot use intrinsic measures to scale. You need to account for screen pixels and density. In other words, you need to calculate the width that you want the image to be when it is not in an object that auto-scales.

Here is a good reference:

Android: How to stretch an image to the screen width while maintaining aspect ratio?

Also, you should consider using "sp" instead of "dp" because your images are displayed in line with text. Read this:

What is the difference between "px", "dp", "dip" and "sp" on Android?

In other words your images should probably scale with the text as well as screen size and screen density.

Community
  • 1
  • 1
Jim
  • 10,172
  • 1
  • 27
  • 36
0

Your problem is about the resolution. When you are setting

setBounds(0, 0, result.getIntrinsicWidth(), result.getIntrinsicHeight());

your picture will be big in a device with a low resolution and small in a device with a high resolution.

So if you want to keep the size, set a hardcoded size:

setBounds(0, 0, 100, 100);

or calculate the width and height based on the device density

mromer
  • 1,867
  • 1
  • 13
  • 18