重写ImageGetter,让TextView异步加载包含图片的html内容

1、URLImageGetter类


  1. import java.net.URL;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.graphics.Rect;  
  5. import android.graphics.drawable.Drawable;  
  6. import android.os.AsyncTask;  
  7. import android.text.Html.ImageGetter;  
  8. import android.view.Display;  
  9. import android.widget.TextView;  
  10.   
  11. public class URLImageGetter implements ImageGetter {  
  12.     TextView textView;  
  13.     Context context;  
  14.   
  15.     public URLImageGetter(Context contxt, TextView textView) {  
  16.         this.context = contxt;  
  17.         this.textView = textView;  
  18.     }  
  19.   
  20.     @Override  
  21.     public Drawable getDrawable(String paramString) {  
  22.         URLDrawable urlDrawable = new URLDrawable(context);  
  23.   
  24.         ImageGetterAsyncTask getterTask = new ImageGetterAsyncTask(urlDrawable);  
  25.         getterTask.execute(paramString);  
  26.         return urlDrawable;  
  27.     }  
  28.   
  29.     public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {  
  30.         URLDrawable urlDrawable;  
  31.   
  32.         public ImageGetterAsyncTask(URLDrawable drawable) {  
  33.             this.urlDrawable = drawable;  
  34.         }  
  35.   
  36.         @Override  
  37.         protected void onPostExecute(Drawable result) {  
  38.             if (result != null) {  
  39.                 urlDrawable.drawable = result;  
  40.   
  41.                 URLImageGetter.this.textView.requestLayout();  
  42.             }  
  43.         }  
  44.   
  45.         @Override  
  46.         protected Drawable doInBackground(String… params) {  
  47.             String source = params[0];  
  48.             return fetchDrawable(source);  
  49.         }  
  50.   
  51.         public Drawable fetchDrawable(String url) {  
  52.             Drawable drawable = null;  
  53.             URL Url;  
  54.             try {  
  55.                 Url = new URL(url);  
  56.                 drawable = Drawable.createFromStream(Url.openStream(), ”“);  
  57.             } catch (Exception e) {  
  58.                 return null;  
  59.             }  
  60.             // 按比例缩放图片  
  61.             Rect bounds = getDefaultImageBounds(context);  
  62.             int newwidth = bounds.width();  
  63.             int newheight = bounds.height();  
  64.             double factor = 1;  
  65.             double fx = (double) drawable.getIntrinsicWidth()  
  66.                     / (double) newwidth;  
  67.             double fy = (double) drawable.getIntrinsicHeight()  
  68.                     / (double) newheight;  
  69.             factor = fx > fy ? fx : fy;  
  70.             if (factor < 1)  
  71.                 factor = 1;  
  72.             newwidth = (int) (drawable.getIntrinsicWidth() / factor);  
  73.             newheight = (int) (drawable.getIntrinsicHeight() / factor);  
  74.             drawable.setBounds(00, newwidth, newheight);  
  75.             return drawable;  
  76.         }  
  77.     }  
  78.   
  79.     // 预定图片宽高比例为 4:3  
  80.     @SuppressWarnings(“deprecation”)  
  81.     public Rect getDefaultImageBounds(Context context) {  
  82.         Display display = ((Activity) context).getWindowManager()  
  83.                 .getDefaultDisplay();  
  84.         int width = display.getWidth();  
  85.         int height = (int) (width * 3 / 4);  
  86.         Rect bounds = new Rect(00, width, height);  
  87.         return bounds;  
  88.     }  
  89. }  
import java.net.URL;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html.ImageGetter;
import android.view.Display;
import android.widget.TextView;

public class URLImageGetter implements ImageGetter {
    TextView textView;
    Context context;

    public URLImageGetter(Context contxt, TextView textView) {
        this.context = contxt;
        this.textView = textView;
    }

    @Override
    public Drawable getDrawable(String paramString) {
        URLDrawable urlDrawable = new URLDrawable(context);

        ImageGetterAsyncTask getterTask = new ImageGetterAsyncTask(urlDrawable);
        getterTask.execute(paramString);
        return urlDrawable;
    }

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

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

        @Override
        protected void onPostExecute(Drawable result) {
            if (result != null) {
                urlDrawable.drawable = result;

                URLImageGetter.this.textView.requestLayout();
            }
        }

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

        public Drawable fetchDrawable(String url) {
            Drawable drawable = null;
            URL Url;
            try {
                Url = new URL(url);
                drawable = Drawable.createFromStream(Url.openStream(), "");
            } catch (Exception e) {
                return null;
            }
            // 按比例缩放图片
            Rect bounds = getDefaultImageBounds(context);
            int newwidth = bounds.width();
            int newheight = bounds.height();
            double factor = 1;
            double fx = (double) drawable.getIntrinsicWidth()
                    / (double) newwidth;
            double fy = (double) drawable.getIntrinsicHeight()
                    / (double) newheight;
            factor = fx > fy ? fx : fy;
            if (factor < 1)
                factor = 1;
            newwidth = (int) (drawable.getIntrinsicWidth() / factor);
            newheight = (int) (drawable.getIntrinsicHeight() / factor);
            drawable.setBounds(0, 0, newwidth, newheight);
            return drawable;
        }
    }

    // 预定图片宽高比例为 4:3
    @SuppressWarnings("deprecation")
    public Rect getDefaultImageBounds(Context context) {
        Display display = ((Activity) context).getWindowManager()
                .getDefaultDisplay();
        int width = display.getWidth();
        int height = (int) (width * 3 / 4);
        Rect bounds = new Rect(0, 0, width, height);
        return bounds;
    }
}



2、URLDrawable类


  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Rect;  
  5. import android.graphics.drawable.BitmapDrawable;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.view.Display;  
  8.   
  9. public class URLDrawable extends BitmapDrawable {  
  10.     protected Drawable drawable;  
  11.   
  12.     @SuppressWarnings(“deprecation”)  
  13.     public URLDrawable(Context context) {  
  14.         this.setBounds(getDefaultImageBounds(context));  
  15.         drawable = context.getResources().getDrawable(R.drawable.ic_launcher);  
  16.         drawable.setBounds(getDefaultImageBounds(context));  
  17.     }  
  18.   
  19.     @Override  
  20.     public void draw(Canvas canvas) {  
  21.         if (drawable != null) {  
  22.             drawable.draw(canvas);  
  23.         }  
  24.     }  
  25.   
  26.     @SuppressWarnings(“deprecation”)  
  27.     public Rect getDefaultImageBounds(Context context) {  
  28.         Display display = ((Activity) context).getWindowManager()  
  29.                 .getDefaultDisplay();  
  30.         int width = display.getWidth();  
  31.         int height = (int) (width * 3 / 4);  
  32.         Rect bounds = new Rect(00, width, height);  
  33.         return bounds;  
  34.     }  
  35. }  
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.Display;

public class URLDrawable extends BitmapDrawable {
    protected Drawable drawable;

    @SuppressWarnings("deprecation")
    public URLDrawable(Context context) {
        this.setBounds(getDefaultImageBounds(context));
        drawable = context.getResources().getDrawable(R.drawable.ic_launcher);
        drawable.setBounds(getDefaultImageBounds(context));
    }

    @Override
    public void draw(Canvas canvas) {
        if (drawable != null) {
            drawable.draw(canvas);
        }
    }

    @SuppressWarnings("deprecation")
    public Rect getDefaultImageBounds(Context context) {
        Display display = ((Activity) context).getWindowManager()
                .getDefaultDisplay();
        int width = display.getWidth();
        int height = (int) (width * 3 / 4);
        Rect bounds = new Rect(0, 0, width, height);
        return bounds;
    }
}



3、主线程中调用方式

  1. TextView content = (TextView)rView.findViewById(R.id.review_content);  
  2. content.setMovementMethod(LinkMovementMethod.getInstance());//加这句才能让里面的超链接生效  
  3. URLImageGetter ReviewImgGetter = new URLImageGetter(MainActivity.this, content);//实例化URLImageGetter类  
  4. content.setText(Html.fromHtml(”包含有图片信息的html内容”,ReviewImgGetter,null));  
TextView content = (TextView)rView.findViewById(R.id.review_content);
content.setMovementMethod(LinkMovementMethod.getInstance());//加这句才能让里面的超链接生效
URLImageGetter ReviewImgGetter = new URLImageGetter(MainActivity.this, content);//实例化URLImageGetter类
content.setText(Html.fromHtml("包含有图片信息的html内容",ReviewImgGetter,null));


    
这样得出的图片和文字不会重叠,但是当图片尺寸小的时候,显示出来的图片周边空旷区域比较大,希望有更好的解决办法。


                </div>

转载至:http://blog.csdn.net/u013985004/article/details/34413457

1、URLImageGetter类


  1. import java.net.URL;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.graphics.Rect;  
  5. import android.graphics.drawable.Drawable;  
  6. import android.os.AsyncTask;  
  7. import android.text.Html.ImageGetter;  
  8. import android.view.Display;  
  9. import android.widget.TextView;  
  10.   
  11. public class URLImageGetter implements ImageGetter {  
  12.     TextView textView;  
  13.     Context context;  
  14.   
  15.     public URLImageGetter(Context contxt, TextView textView) {  
  16.         this.context = contxt;  
  17.         this.textView = textView;  
  18.     }  
  19.   
  20.     @Override  
  21.     public Drawable getDrawable(String paramString) {  
  22.         URLDrawable urlDrawable = new URLDrawable(context);  
  23.   
  24.         ImageGetterAsyncTask getterTask = new ImageGetterAsyncTask(urlDrawable);  
  25.         getterTask.execute(paramString);  
  26.         return urlDrawable;  
  27.     }  
  28.   
  29.     public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {  
  30.         URLDrawable urlDrawable;  
  31.   
  32.         public ImageGetterAsyncTask(URLDrawable drawable) {  
  33.             this.urlDrawable = drawable;  
  34.         }  
  35.   
  36.         @Override  
  37.         protected void onPostExecute(Drawable result) {  
  38.             if (result != null) {  
  39.                 urlDrawable.drawable = result;  
  40.   
  41.                 URLImageGetter.this.textView.requestLayout();  
  42.             }  
  43.         }  
  44.   
  45.         @Override  
  46.         protected Drawable doInBackground(String… params) {  
  47.             String source = params[0];  
  48.             return fetchDrawable(source);  
  49.         }  
  50.   
  51.         public Drawable fetchDrawable(String url) {  
  52.             Drawable drawable = null;  
  53.             URL Url;  
  54.             try {  
  55.                 Url = new URL(url);  
  56.                 drawable = Drawable.createFromStream(Url.openStream(), ”“);  
  57.             } catch (Exception e) {  
  58.                 return null;  
  59.             }  
  60.             // 按比例缩放图片  
  61.             Rect bounds = getDefaultImageBounds(context);  
  62.             int newwidth = bounds.width();  
  63.             int newheight = bounds.height();  
  64.             double factor = 1;  
  65.             double fx = (double) drawable.getIntrinsicWidth()  
  66.                     / (double) newwidth;  
  67.             double fy = (double) drawable.getIntrinsicHeight()  
  68.                     / (double) newheight;  
  69.             factor = fx > fy ? fx : fy;  
  70.             if (factor < 1)  
  71.                 factor = 1;  
  72.             newwidth = (int) (drawable.getIntrinsicWidth() / factor);  
  73.             newheight = (int) (drawable.getIntrinsicHeight() / factor);  
  74.             drawable.setBounds(00, newwidth, newheight);  
  75.             return drawable;  
  76.         }  
  77.     }  
  78.   
  79.     // 预定图片宽高比例为 4:3  
  80.     @SuppressWarnings(“deprecation”)  
  81.     public Rect getDefaultImageBounds(Context context) {  
  82.         Display display = ((Activity) context).getWindowManager()  
  83.                 .getDefaultDisplay();  
  84.         int width = display.getWidth();  
  85.         int height = (int) (width * 3 / 4);  
  86.         Rect bounds = new Rect(00, width, height);  
  87.         return bounds;  
  88.     }  
  89. }  
import java.net.URL;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html.ImageGetter;
import android.view.Display;
import android.widget.TextView;

public class URLImageGetter implements ImageGetter {
    TextView textView;
    Context context;

    public URLImageGetter(Context contxt, TextView textView) {
        this.context = contxt;
        this.textView = textView;
    }

    @Override
    public Drawable getDrawable(String paramString) {
        URLDrawable urlDrawable = new URLDrawable(context);

        ImageGetterAsyncTask getterTask = new ImageGetterAsyncTask(urlDrawable);
        getterTask.execute(paramString);
        return urlDrawable;
    }

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

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

        @Override
        protected void onPostExecute(Drawable result) {
            if (result != null) {
                urlDrawable.drawable = result;

                URLImageGetter.this.textView.requestLayout();
            }
        }

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

        public Drawable fetchDrawable(String url) {
            Drawable drawable = null;
            URL Url;
            try {
                Url = new URL(url);
                drawable = Drawable.createFromStream(Url.openStream(), "");
            } catch (Exception e) {
                return null;
            }
            // 按比例缩放图片
            Rect bounds = getDefaultImageBounds(context);
            int newwidth = bounds.width();
            int newheight = bounds.height();
            double factor = 1;
            double fx = (double) drawable.getIntrinsicWidth()
                    / (double) newwidth;
            double fy = (double) drawable.getIntrinsicHeight()
                    / (double) newheight;
            factor = fx > fy ? fx : fy;
            if (factor < 1)
                factor = 1;
            newwidth = (int) (drawable.getIntrinsicWidth() / factor);
            newheight = (int) (drawable.getIntrinsicHeight() / factor);
            drawable.setBounds(0, 0, newwidth, newheight);
            return drawable;
        }
    }

    // 预定图片宽高比例为 4:3
    @SuppressWarnings("deprecation")
    public Rect getDefaultImageBounds(Context context) {
        Display display = ((Activity) context).getWindowManager()
                .getDefaultDisplay();
        int width = display.getWidth();
        int height = (int) (width * 3 / 4);
        Rect bounds = new Rect(0, 0, width, height);
        return bounds;
    }
}



2、URLDrawable类


  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Rect;  
  5. import android.graphics.drawable.BitmapDrawable;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.view.Display;  
  8.   
  9. public class URLDrawable extends BitmapDrawable {  
  10.     protected Drawable drawable;  
  11.   
  12.     @SuppressWarnings(“deprecation”)  
  13.     public URLDrawable(Context context) {  
  14.         this.setBounds(getDefaultImageBounds(context));  
  15.         drawable = context.getResources().getDrawable(R.drawable.ic_launcher);  
  16.         drawable.setBounds(getDefaultImageBounds(context));  
  17.     }  
  18.   
  19.     @Override  
  20.     public void draw(Canvas canvas) {  
  21.         if (drawable != null) {  
  22.             drawable.draw(canvas);  
  23.         }  
  24.     }  
  25.   
  26.     @SuppressWarnings(“deprecation”)  
  27.     public Rect getDefaultImageBounds(Context context) {  
  28.         Display display = ((Activity) context).getWindowManager()  
  29.                 .getDefaultDisplay();  
  30.         int width = display.getWidth();  
  31.         int height = (int) (width * 3 / 4);  
  32.         Rect bounds = new Rect(00, width, height);  
  33.         return bounds;  
  34.     }  
  35. }  
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.Display;

public class URLDrawable extends BitmapDrawable {
    protected Drawable drawable;

    @SuppressWarnings("deprecation")
    public URLDrawable(Context context) {
        this.setBounds(getDefaultImageBounds(context));
        drawable = context.getResources().getDrawable(R.drawable.ic_launcher);
        drawable.setBounds(getDefaultImageBounds(context));
    }

    @Override
    public void draw(Canvas canvas) {
        if (drawable != null) {
            drawable.draw(canvas);
        }
    }

    @SuppressWarnings("deprecation")
    public Rect getDefaultImageBounds(Context context) {
        Display display = ((Activity) context).getWindowManager()
                .getDefaultDisplay();
        int width = display.getWidth();
        int height = (int) (width * 3 / 4);
        Rect bounds = new Rect(0, 0, width, height);
        return bounds;
    }
}



3、主线程中调用方式

  1. TextView content = (TextView)rView.findViewById(R.id.review_content);  
  2. content.setMovementMethod(LinkMovementMethod.getInstance());//加这句才能让里面的超链接生效  
  3. URLImageGetter ReviewImgGetter = new URLImageGetter(MainActivity.this, content);//实例化URLImageGetter类  
  4. content.setText(Html.fromHtml(”包含有图片信息的html内容”,ReviewImgGetter,null));  
TextView content = (TextView)rView.findViewById(R.id.review_content);
content.setMovementMethod(LinkMovementMethod.getInstance());//加这句才能让里面的超链接生效
URLImageGetter ReviewImgGetter = new URLImageGetter(MainActivity.this, content);//实例化URLImageGetter类
content.setText(Html.fromHtml("包含有图片信息的html内容",ReviewImgGetter,null));


    
这样得出的图片和文字不会重叠,但是当图片尺寸小的时候,显示出来的图片周边空旷区域比较大,希望有更好的解决办法。


                </div>

转载至:http://blog.csdn.net/u013985004/article/details/34413457

猜你喜欢

转载自blog.csdn.net/wzgbgz/article/details/79384886