編輯:關於Android編程
今天介紹如何使用Volley加載網絡圖片:
理論知識介紹:
(1)緩存功能簡單介紹:
LruCache,和ImageCache實現圖片的緩存
(2)加載網絡圖片及監聽
ImageRequest
ImageLoader
NatWorkImageView(顯示網絡圖片)
我們從簡單到復雜,先實現一個不帶緩存的加載:
package com.example.volley; import com.android.volley.Response; import com.android.volley.Response.Listener; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageRequest; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageView; public class VolleyImageActivity extends Activity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_volley_image); imageView = (ImageView) findViewById(R.id.myImage); String url = "http://p2.so.qhimg.com/bdm/326_204_/t01b6d53e067d888f92.jpg"; //參數依次代表:圖片請求成功回調,圖片加載允許的最大高度和寬度並壓縮處理,如果設置為0原圖顯示不壓縮,加載格式,請求失敗的回調 ImageRequest request = new ImageRequest(url, new Listener() { @Override public void onResponse(Bitmap response) { // TODO Auto-generated method stub imageView.setImageBitmap(response);//加載成功顯示網絡圖片 } },0 , 0, Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub imageView.setBackgroundResource(R.drawable.ic_launcher);//加載失敗,顯示加載失敗的圖片 } }); request.setTag("mytag");//給請求設置標簽,方便加入隊列後查找 MyApplication.getHttpRequestQueues().add(request);//添加到請求隊列 } }
先創建一個圖片緩存類:
package com.example.volley; import android.graphics.Bitmap; import android.support.v4.util.LruCache; import com.android.volley.toolbox.ImageLoader.ImageCache; /** *實現圖片 緩存 * @author Administrator * */ public class BitmapCache implements ImageCache{ /** * ImageCache單獨使用不能起到緩存效果需要使用LruCache配合 */ public LruCachecache; public int max = 10 * 1024 * 1024;//設置最大緩存大小 public BitmapCache(){ cache = new LruCache (max){ @Override protected int sizeOf(String key, Bitmap value) { // TODO Auto-generated method stub return value.getRowBytes()*value.getHeight(); } }; } @Override public Bitmap getBitmap(String url) { // TODO Auto-generated method stub return cache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { // TODO Auto-generated method stub cache.put(url, bitmap); } }
//方式二imageLoader加載方式 private void imageLoaderImage(){ String url = "http://p2.so.qhimg.com/bdm/326_204_/t01b6d53e067d888f92.jpg"; ImageLoader loader = new ImageLoader(MyApplication.getHttpRequestQueues(), new BitmapCache()); ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.ic_launcher, R.drawable.ic_launcher);//參數:控件,默認圖片,出錯圖片 loader.get(url, listener); //loader.get(url, listener, 0, 0);//後兩個參數圖片加載允許的最大高度和寬度並壓縮處理,如果設置為0原圖顯示不壓縮 }下面使用NetWorkImageVIew 顯示圖片
//方式三使用NetWorkImageView顯示加載圖片 private void netWorkImageView(){ String url = "http://p2.so.qhimg.com/bdm/326_204_/t01b6d53e067d888f92.jpg"; ImageLoader loader = new ImageLoader(MyApplication.getHttpRequestQueues(), new BitmapCache()); networkImageView.setDefaultImageResId(R.drawable.ic_launcher);//設置默認顯示圖片 networkImageView.setErrorImageResId(R.drawable.ic_launcher);//設置加載失敗顯示圖片 networkImageView.setImageUrl(url, loader); }
package com.example.volley; import com.android.volley.Response; import com.android.volley.Response.Listener; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.ImageRequest; import com.android.volley.toolbox.ImageLoader.ImageContainer; import com.android.volley.toolbox.ImageLoader.ImageListener; import com.android.volley.toolbox.NetworkImageView; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageView; public class VolleyImageActivity extends Activity { private ImageView imageView; private NetworkImageView networkImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_volley_image); imageView = (ImageView) findViewById(R.id.myImage); networkImageView = (NetworkImageView) findViewById(R.id.networkImageview); //imageResponseImage(); //imageLoaderImage(); netWorkImageView(); } //方式一:ImageResponseImage(不帶緩存的加載方式) private void imageResponseImage(){ //參數依次代表:圖片請求成功回調,圖片加載允許的最大高度和寬度並壓縮處理,如果設置為0原圖顯示不壓縮,加載格式,請求失敗的回調 String url = "http://p2.so.qhimg.com/bdm/326_204_/t01b6d53e067d888f92.jpg"; ImageRequest request = new ImageRequest(url, new Listener() { @Override public void onResponse(Bitmap response) { // TODO Auto-generated method stub imageView.setImageBitmap(response);//加載成功顯示網絡圖片 } },0 , 0, Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub imageView.setBackgroundResource(R.drawable.ic_launcher);//加載失敗,顯示加載失敗的圖片 } }); request.setTag("mytag");//給請求設置標簽,方便加入隊列後查找 MyApplication.getHttpRequestQueues().add(request);//添加到請求隊列 } //方式二imageLoader加載方式 private void imageLoaderImage(){ String url = "http://p2.so.qhimg.com/bdm/326_204_/t01b6d53e067d888f92.jpg"; ImageLoader loader = new ImageLoader(MyApplication.getHttpRequestQueues(), new BitmapCache()); ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.ic_launcher, R.drawable.ic_launcher);//參數:控件,默認圖片,出錯圖片 loader.get(url, listener); //loader.get(url, listener, 0, 0);//後兩個參數圖片加載允許的最大高度和寬度並壓縮處理,如果設置為0原圖顯示不壓縮 } //方式三使用NetWorkImageView顯示加載圖片 private void netWorkImageView(){ String url = "http://p2.so.qhimg.com/bdm/326_204_/t01b6d53e067d888f92.jpg"; ImageLoader loader = new ImageLoader(MyApplication.getHttpRequestQueues(), new BitmapCache()); networkImageView.setDefaultImageResId(R.drawable.ic_launcher);//設置默認顯示圖片 networkImageView.setErrorImageResId(R.drawable.ic_launcher);//設置加載失敗顯示圖片 networkImageView.setImageUrl(url, loader); } }
復制代碼 代碼如下:filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + /A
之前的幾篇博客,我測試了View事件分發機制中的一些知識點,我們理解事件分發機制的目的就是為了能夠更好了知道View中事件的傳遞過程進而能夠對於滑動沖突有針對性的解決措施
這篇文章寫的非常好,深入淺出,關鍵還是一位大三學生自己剖析的心得。這是我喜歡此文的原因。下面請看正文:作為一個大三的預備程序員,我學習android的一大樂趣是可以通過源
這兩天學習了使用Path繪制貝塞爾曲線相關,然後自己動手做了一個類似QQ未讀消息可拖拽的小氣泡,效果圖如下:最終效果圖接下來一步一步的實現整個過程。基本原理其實就是使用P