Як ви використовуєте зображення, на яке посилається URL-адреса в ImageView
?
Як ви використовуєте зображення, на яке посилається URL-адреса в ImageView
?
Відповіді:
Від розробника Android :
// show The Image in a ImageView
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
public void onClick(View v) {
startActivity(new Intent(this, IndexActivity.class));
finish();
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
Переконайтеся, що у вас встановлені такі дозволи AndroidManifest.xml
для доступу до Інтернету.
<uses-permission android:name="android.permission.INTERNET" />
1. Пікассо дозволяє без проблем завантажувати зображення у вашій програмі - часто в одному рядку коду!
Використовуйте Gradle:
implementation 'com.squareup.picasso:picasso:2.71828'
Всього один рядок коду!
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
2. Glide Бібліотека завантаження та кешування зображень для Android, орієнтована на плавне прокручування
Використовуйте Gradle:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}
// Для простого перегляду:
Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);
3. fresco - це потужна система для відображення зображень у додатках для Android.
Потрібно спочатку завантажити зображення
public static Bitmap loadBitmap(String url) {
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;
try {
in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = 1;
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
} catch (IOException e) {
Log.e(TAG, "Could not load Bitmap from: " + url);
} finally {
closeStream(in);
closeStream(out);
}
return bitmap;
}
Потім використовуйте Imageview.setImageBitmap для встановлення растрових зображень у ImageView
Я написав клас для вирішення цього питання, оскільки, здається, виникає потреба в моїх різних проектах:
https://github.com/koush/UrlImageViewHelper
UrlImageViewHelper заповнить ImageView зображенням, знайденим за URL-адресою.
Зразок виконує пошук зображень Google і завантажує / показує результати асинхронно.
UrlImageViewHelper автоматично завантажує, зберігає та кешує всі зображення URL-адрес BitmapDrawables. Дублікати URL-адрес не завантажуватимуться в пам'ять двічі. Пам’яткою бітових карт керується за допомогою слабкої хеш-таблиці таблиць, тому щойно ви більше не використовуєте зображення, воно сміття збирається автоматично.
У будь-якому випадку люди просять мій коментар, щоб опублікувати його як відповідь. я дописую.
URL newurl = new URL(photo_url_str);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
Прийнята вище відповідь чудова, якщо ви завантажуєте зображення на основі натискання кнопки, однак, якщо ви робите це в новій діяльності, він заморожує інтерфейс користувача на секунду-дві. Озирнувшись, я виявив, що проста асинтакція усунула цю проблему.
Щоб використовувати асинтакт, додайте цей клас наприкінці своєї діяльності:
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
І дзвоніть зі свого методу onCreate (), використовуючи:
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute(MY_URL_STRING);
Результатом є операція, що швидко завантажується, і перегляд зображення, який відображається на частку секунди пізніше, залежно від швидкості роботи користувача.
Ви також можете використовувати цей перегляд LoadingImageView для завантаження зображення з URL-адреси:
http://blog.blundellapps.com/imageview-with-loading-spinner/
Після додавання файлу класу із цього посилання ви можете створити перегляд образу URL-адреси:
в xml:
<com.blundell.tut.LoaderImageView
android:id="@+id/loaderImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
image="http://developer.android.com/images/dialog_buttons.png"
/>
У коді:
final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");
І оновіть його, використовуючи:
image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
public class LoadWebImg extends Activity {
String image_URL=
"http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView bmImage = (ImageView)findViewById(R.id.image);
BitmapFactory.Options bmOptions;
bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
Bitmap bm = LoadImage(image_URL, bmOptions);
bmImage.setImageBitmap(bm);
}
private Bitmap LoadImage(String URL, BitmapFactory.Options options)
{
Bitmap bitmap = null;
InputStream in = null;
try {
in = OpenHttpConnection(URL);
bitmap = BitmapFactory.decodeStream(in, null, options);
in.close();
} catch (IOException e1) {
}
return bitmap;
}
private InputStream OpenHttpConnection(String strURL) throws IOException{
InputStream inputStream = null;
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
try{
HttpURLConnection httpConn = (HttpURLConnection)conn;
httpConn.setRequestMethod("GET");
httpConn.connect();
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
inputStream = httpConn.getInputStream();
}
}
catch (Exception ex)
{
}
return inputStream;
}
}
Привіт, у мене найпростіший код спробуйте це
public class ImageFromUrlExample extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView imgView =(ImageView)findViewById(R.id.ImageView01);
Drawable drawable = LoadImageFromWebOperations("http://www.androidpeople.com/wp-content/uploads/2010/03/android.png");
imgView.setImageDrawable(drawable);
}
private Drawable LoadImageFromWebOperations(String url)
{
try{
InputStream is = (InputStream) new URL(url).getContent();
Drawable d = Drawable.createFromStream(is, "src name");
return d;
}catch (Exception e) {
System.out.println("Exc="+e);
return null;
}
}
}
main.xml
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/ImageView01"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
спробуйте це
Найкраща сучасна бібліотека для такого завдання, на мою думку, - Пікассо від Квадрат. Це дозволяє завантажувати зображення в ImageView за URL-адресою за допомогою одного вкладиша:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Нещодавно я знайшов тут нитку , оскільки мені доводиться робити подібну річ для перегляду списків із зображеннями, але принцип простий, як ви можете прочитати в першому класі зразків, показаному там (від jleedev). Ви отримуєте вхідний потік зображення (з Інтернету)
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();
}
Потім ви зберігаєте зображення як Dravable і можете передати його ImageView (через setImageDravable). Знову з верхнього фрагмента коду подивіться на всю нитку.
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Тут багато хорошої інформації ... Нещодавно я знайшов клас під назвою SmartImageView, який, здається, працює дуже добре до цих пір. Дуже простий у використанні та використанні.
http://loopj.com/android-smart-image-view/
https://github.com/loopj/android-smart-image-view
ОНОВЛЕННЯ : Я закінчив писати повідомлення про це , тому перегляньте його для отримання довідки щодо використання SmartImageView.
ОНОВНЕ ОНОВЛЕННЯ : Тепер я завжди використовую для цього Picasso (див. Вище) і дуже рекомендую його. :)
Це пізня відповідь, як було запропоновано вище AsyncTask
, буде і після поглиблення трохи я знайшов ще один спосіб вирішення цієї проблеми.
Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
imageView.setImageDrawable(drawable);
Ось повна функція:
public void loadMapPreview () {
//start a background thread for networking
new Thread(new Runnable() {
public void run(){
try {
//download the drawable
final Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
//edit the view in the UI thread
imageView.post(new Runnable() {
public void run() {
imageView.setImageDrawable(drawable);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
Не забудьте додати наступні дозволи у AndroidManifest.xml
доступ до Інтернету.
<uses-permission android:name="android.permission.INTERNET" />
Я сам спробував це, і я ще не стикався з жодним питанням.
Thread
оскільки потік інтерфейсу не дозволяє здійснювати мережеві операції.
Це допоможе вам ...
Визначте перегляд зображення та завантажте в нього зображення .....
Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));
Потім визначте цей метод:
public Bitmap DownloadFullFromUrl(String imageFullURL) {
Bitmap bm = null;
try {
URL url = new URL(imageFullURL);
URLConnection ucon = url.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
bm = BitmapFactory.decodeByteArray(baf.toByteArray(), 0,
baf.toByteArray().length);
} catch (IOException e) {
Log.d("ImageManager", "Error: " + e);
}
return bm;
}
String img_url= //url of the image
URL url=new URL(img_url);
Bitmap bmp;
bmp=BitmapFactory.decodeStream(url.openConnection().getInputStream());
ImageView iv=(ImageView)findviewById(R.id.imageview);
iv.setImageBitmap(bmp);
Версія із завданням обробки та асинхронізації винятків:
AsyncTask<URL, Void, Boolean> asyncTask = new AsyncTask<URL, Void, Boolean>() {
public Bitmap mIcon_val;
public IOException error;
@Override
protected Boolean doInBackground(URL... params) {
try {
mIcon_val = BitmapFactory.decodeStream(params[0].openConnection().getInputStream());
} catch (IOException e) {
this.error = e;
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean success) {
super.onPostExecute(success);
if (success) {
image.setImageBitmap(mIcon_val);
} else {
image.setImageBitmap(defaultImage);
}
}
};
try {
URL url = new URL(url);
asyncTask.execute(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
private Bitmap getImageBitmap(String url) {
Bitmap bm = null;
try {
URL aURL = new URL(url);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch (IOException e) {
Log.e(TAG, "Error getting bitmap", e);
}
return bm;
}
Простий і чистий спосіб зробити це - використовувати бібліотеку з відкритим кодом Prime .
Працює для imageView в будь-якому контейнері, наприклад, перегляд сітки списку перегляду, звичайний макет
private class LoadImagefromUrl extends AsyncTask< Object, Void, Bitmap > {
ImageView ivPreview = null;
@Override
protected Bitmap doInBackground( Object... params ) {
this.ivPreview = (ImageView) params[0];
String url = (String) params[1];
System.out.println(url);
return loadBitmap( url );
}
@Override
protected void onPostExecute( Bitmap result ) {
super.onPostExecute( result );
ivPreview.setImageBitmap( result );
}
}
public Bitmap loadBitmap( String url ) {
URL newurl = null;
Bitmap bitmap = null;
try {
newurl = new URL( url );
bitmap = BitmapFactory.decodeStream( newurl.openConnection( ).getInputStream( ) );
} catch ( MalformedURLException e ) {
e.printStackTrace( );
} catch ( IOException e ) {
e.printStackTrace( );
}
return bitmap;
}
/** Usage **/
new LoadImagefromUrl( ).execute( imageView, url );
Спробуйте таким чином, сподіваюся, що це допоможе вам вирішити свою проблему.
Тут я пояснюю, як використовувати зовнішню бібліотеку "AndroidQuery" для завантаження зображення з URL / сервера в asyncTask способом, також завантажуючи кеш зображення в файл пристрою або область кешу.
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageFromUrl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"/>
<ProgressBar
android:id="@+id/pbrLoadImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout>
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
private AQuery aQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aQuery = new AQuery(this);
aQuery.id(R.id.imageFromUrl).progress(R.id.pbrLoadImage).image("http://itechthereforeiam.com/wp-content/uploads/2013/11/android-gone-packing.jpg",true,true);
}
}
Note : Here I just implemented common method to load image from url/server but you can use various types of method which can be provided by "AndroidQuery"to load your image easily.
Android Query може вирішити це для вас та багато іншого (наприклад, кеш і прогрес завантаження).
Погляньте тут .
Я думаю, що це найкращий підхід.