คุณจะทำอย่างไรใช้ภาพอ้างอิงโดย 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. Picassoอนุญาตให้โหลดภาพที่ไม่ยุ่งยากในแอปพลิเคชันของคุณ - บ่อยครั้งในโค้ดหนึ่งบรรทัด!
ใช้ 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 Frescoดูแลการโหลดและการแสดงภาพดังนั้นคุณไม่จำเป็นต้องทำอะไร
คุณจะต้องดาวน์โหลดภาพก่อน
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 จะดาวน์โหลดบันทึกและแคชรูปภาพทั้งหมดโดยอัตโนมัติที่เรียกว่า BitmapDrawables URL ซ้ำจะไม่ถูกโหลดในหน่วยความจำสองครั้ง หน่วยความจำบิตแมปได้รับการจัดการโดยใช้ตารางแฮชอ้างอิงอ่อนดังนั้นทันทีที่คุณไม่ใช้รูปภาพอีกต่อไปรูปภาพจะถูกรวบรวมโดยอัตโนมัติ
อย่างไรก็ตามมีคนถามความคิดเห็นของฉันเพื่อโพสต์เป็นคำตอบ ฉันกำลังโพสต์
URL newurl = new URL(photo_url_str);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
คำตอบที่ได้รับการยอมรับข้างต้นนั้นยอดเยี่ยมถ้าคุณกำลังโหลดรูปภาพโดยคลิกปุ่ม แต่ถ้าคุณทำในกิจกรรมใหม่มันจะหยุดค้าง UI เป็นเวลาหนึ่งหรือสองวินาที เมื่อมองไปรอบ ๆ ฉันพบว่า asynctask ง่าย ๆ กำจัดปัญหานี้
ในการใช้ asynctask ให้เพิ่มคลาสนี้ที่ท้ายกิจกรรมของคุณ:
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"/>
ลองนี้
ห้องสมุดที่ทันสมัยที่สุดสำหรับงานในความคิดของฉันคือPicasso by Square มันช่วยให้การโหลดภาพไปยัง 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();
}
จากนั้นคุณเก็บรูปภาพเป็น Drawable และคุณสามารถส่งไปยัง ImageView (ผ่าน setImageDrawable) อีกครั้งจากตัวอย่างโค้ดด้านบนลองดูที่หัวข้อทั้งหมด
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
ปรับปรุงครั้งที่ 2 : ตอนนี้ฉันใช้ Picasso เสมอ (ดูด้านบน) และแนะนำเป็นอย่างยิ่ง :)
นี่คือการตอบกลับล่าช้าตามที่แนะนำข้างต้นAsyncTask
จะและหลังจาก googling บิตฉันพบวิธีหนึ่งเพิ่มเติมสำหรับปัญหานี้
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
เนื่องจากเธรด UI ไม่อนุญาตสำหรับการดำเนินการเครือข่าย
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
สิ่งนี้จะช่วยคุณ ...
กำหนด imageview และโหลดภาพลงไป
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);
เวอร์ชันที่มีการจัดการข้อยกเว้นและงาน async:
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;
}
วิธีที่ง่ายและสะอาดในการทำเช่นนี้คือการใช้ไลบรารีโอเพนซอร์ซไพร์ม
รหัสนี้ได้รับการทดสอบว่าใช้งานได้สมบูรณ์
URL req = new URL(
"http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png"
);
Bitmap mIcon_val = BitmapFactory.decodeStream(req.openConnection()
.getInputStream());
ทำงานกับ imageView ในคอนเทนเนอร์ใด ๆ เช่น listview grid view, เค้าโครงปกติ
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 สามารถจัดการสิ่งนั้นให้คุณและอีกมากมาย (เช่นแคชและความคืบหน้าในการโหลด)
ลองดูที่นี่นี่
ฉันคิดว่าเป็นวิธีที่ดีที่สุด