android listview分页异步加载图片及图片缓存

我是开发android的新手,参考了很多大牛的资料,才完成这个demo的,分享出来和大家一同学习


如图:



AsyncImageLoader.java
Java代码   收藏代码
  1. package cn.anycall.testlist;  
  2.   
  3. import java.lang.ref.SoftReference;  
  4. import java.util.HashMap;  
  5.   
  6. import android.graphics.drawable.Drawable;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.widget.ImageView;  
  10.   
  11.   
  12. public class AsyncImageLoader {  
  13.   
  14.      //SoftReference是软引用,是为了更好的为了系统回收变量  
  15.     private static HashMap<String, SoftReference<Drawable>> imageCache;  
  16.       
  17.     static {  
  18.         imageCache = new HashMap<String, SoftReference<Drawable>>();  
  19.     }  
  20.       
  21.       
  22.     public AsyncImageLoader() {  
  23.           
  24.     }  
  25.     public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){  
  26.         if (imageCache.containsKey(imageUrl)) {  
  27.             //从缓存中获取  
  28.             SoftReference<Drawable> softReference = imageCache.get(imageUrl);  
  29.             Drawable drawable = softReference.get();  
  30.             System.out.println("111111111111111111111111111111");  
  31.             if (drawable != null) {  
  32.                  System.out.println("11111111111122222222211111111111111111");  
  33.                 return drawable;  
  34.             }  
  35.         }  
  36.         final Handler handler = new Handler() {  
  37.             public void handleMessage(Message message) {  
  38.                 imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);  
  39.             }  
  40.         };  
  41.         //建立新一个新的线程下载图片  
  42.         new Thread() {  
  43.             @Override  
  44.             public void run() {  
  45.                 System.out.println("11111111111133333333333211111111111111111");  
  46.                 Drawable drawable = null;  
  47.                 try {  
  48.                     drawable = ImageUtil.geRoundDrawableFromUrl(imageUrl, 20);  
  49.                 } catch (Exception e) {  
  50.                     e.printStackTrace();  
  51.                 }  
  52.                 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));  
  53.                 Message message = handler.obtainMessage(0, drawable);  
  54.                 handler.sendMessage(message);  
  55.             }  
  56.         }.start();  
  57.         return null;  
  58.     }  
  59.     //回调接口  
  60.     public interface ImageCallback {  
  61.         public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);  
  62.     }  
  63. }  



ImageUtil.java
Java代码   收藏代码
  1. package cn.anycall.testlist;  
  2.   
  3.   
  4.   
  5. import java.io.ByteArrayInputStream;  
  6. import java.io.ByteArrayOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.MalformedURLException;  
  11. import java.net.URL;  
  12.   
  13. import android.graphics.Bitmap;  
  14. import android.graphics.Bitmap.Config;  
  15. import android.graphics.BitmapFactory;  
  16. import android.graphics.Canvas;  
  17. import android.graphics.ColorMatrix;  
  18. import android.graphics.ColorMatrixColorFilter;  
  19. import android.graphics.Paint;  
  20. import android.graphics.PixelFormat;  
  21. import android.graphics.PorterDuff.Mode;  
  22. import android.graphics.PorterDuffXfermode;  
  23. import android.graphics.Rect;  
  24. import android.graphics.RectF;  
  25. import android.graphics.drawable.BitmapDrawable;  
  26. import android.graphics.drawable.Drawable;  
  27.   
  28. public class ImageUtil {  
  29.   
  30.     public static InputStream getRequest(String path) throws Exception {  
  31.         URL url = new URL(path);  
  32.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  33.         conn.setRequestMethod("GET");  
  34.         conn.setConnectTimeout(5000);  
  35.         if (conn.getResponseCode() == 200){  
  36.             return conn.getInputStream();  
  37.         }  
  38.         return null;  
  39.     }  
  40.   
  41.     public static byte[] readInputStream(InputStream inStream) throws Exception {  
  42.         ByteArrayOutputStream outSteam = new ByteArrayOutputStream();  
  43.         byte[] buffer = new byte[4096];  
  44.         int len = 0;  
  45.         while ((len = inStream.read(buffer)) != -1) {  
  46.             outSteam.write(buffer, 0, len);  
  47.         }  
  48.         outSteam.close();  
  49.         inStream.close();  
  50.         return outSteam.toByteArray();  
  51.     }  
  52.       
  53.     public static Drawable loadImageFromUrl(String url){  
  54.         URL m;  
  55.         InputStream i = null;  
  56.         try {  
  57.             m = new URL(url);  
  58.             i = (InputStream) m.getContent();  
  59.         } catch (MalformedURLException e1) {  
  60.             e1.printStackTrace();  
  61.         } catch (IOException e) {  
  62.             e.printStackTrace();  
  63.         }  
  64.         Drawable d = Drawable.createFromStream(i, "src");  
  65.         return d;  
  66.     }  
  67.       
  68.     public static Drawable getDrawableFromUrl(String url) throws Exception{  
  69.          return Drawable.createFromStream(getRequest(url),null);  
  70.     }  
  71.       
  72.     public static Bitmap getBitmapFromUrl(String url) throws Exception{  
  73.         byte[] bytes = getBytesFromUrl(url);  
  74.         return byteToBitmap(bytes);  
  75.     }  
  76.       
  77.     public static Bitmap getRoundBitmapFromUrl(String url,int pixels) throws Exception{  
  78.         byte[] bytes = getBytesFromUrl(url);  
  79.         Bitmap bitmap = byteToBitmap(bytes);  
  80.         return toRoundCorner(bitmap, pixels);  
  81.     }   
  82.       
  83.     public static Drawable geRoundDrawableFromUrl(String url,int pixels) throws Exception{  
  84.         byte[] bytes = getBytesFromUrl(url);  
  85.         BitmapDrawable bitmapDrawable = (BitmapDrawable)byteToDrawable(bytes);  
  86.         return toRoundCorner(bitmapDrawable, pixels);  
  87.     }   
  88.       
  89.     public static byte[] getBytesFromUrl(String url) throws Exception{  
  90.          return readInputStream(getRequest(url));  
  91.     }  
  92.       
  93.     public static Bitmap byteToBitmap(byte[] byteArray){  
  94.         if(byteArray.length!=0){   
  95.             return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);   
  96.         }   
  97.         else {   
  98.             return null;   
  99.         }    
  100.     }  
  101.       
  102.     public static Drawable byteToDrawable(byte[] byteArray){  
  103.         ByteArrayInputStream ins = new ByteArrayInputStream(byteArray);  
  104.         return Drawable.createFromStream(ins, null);  
  105.     }  
  106.       
  107.     public static byte[] Bitmap2Bytes(Bitmap bm){   
  108.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  109.         bm.compress(Bitmap.CompressFormat.PNG, 100, baos);  
  110.         return baos.toByteArray();  
  111.     }  
  112.       
  113.     public static Bitmap drawableToBitmap(Drawable drawable) {  
  114.   
  115.         Bitmap bitmap = Bitmap  
  116.                 .createBitmap(  
  117.                         drawable.getIntrinsicWidth(),  
  118.                         drawable.getIntrinsicHeight(),  
  119.                         drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
  120.                                 : Bitmap.Config.RGB_565);  
  121.         Canvas canvas = new Canvas(bitmap);  
  122.         drawable.setBounds(00, drawable.getIntrinsicWidth(),  
  123.                 drawable.getIntrinsicHeight());  
  124.         drawable.draw(canvas);  
  125.         return bitmap;  
  126.     }  
  127.       
  128.         /** 
  129.           * 图片去色,返回灰度图片 
  130.           * @param bmpOriginal 传入的图片 
  131.          * @return 去色后的图片 
  132.          */  
  133.         public static Bitmap toGrayscale(Bitmap bmpOriginal) {  
  134.             int width, height;  
  135.             height = bmpOriginal.getHeight();  
  136.             width = bmpOriginal.getWidth();      
  137.       
  138.             Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
  139.             Canvas c = new Canvas(bmpGrayscale);  
  140.             Paint paint = new Paint();  
  141.             ColorMatrix cm = new ColorMatrix();  
  142.             cm.setSaturation(0);  
  143.             ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);  
  144.             paint.setColorFilter(f);  
  145.             c.drawBitmap(bmpOriginal, 00, paint);  
  146.             return bmpGrayscale;  
  147.         }  
  148.           
  149.           
  150.         /** 
  151.          * 去色同时加圆角 
  152.          * @param bmpOriginal 原图 
  153.          * @param pixels 圆角弧度 
  154.          * @return 修改后的图片 
  155.          */  
  156.         public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) {  
  157.             return toRoundCorner(toGrayscale(bmpOriginal), pixels);  
  158.         }  
  159.           
  160.         /** 
  161.          * 把图片变成圆角 
  162.          * @param bitmap 需要修改的图片 
  163.          * @param pixels 圆角的弧度 
  164.          * @return 圆角图片 
  165.          */  
  166.         public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {  
  167.       
  168.             Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);  
  169.             Canvas canvas = new Canvas(output);  
  170.       
  171.             final int color = 0xff424242;  
  172.             final Paint paint = new Paint();  
  173.             final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());  
  174.             final RectF rectF = new RectF(rect);  
  175.             final float roundPx = pixels;  
  176.       
  177.             paint.setAntiAlias(true);  
  178.             canvas.drawARGB(0000);  
  179.             paint.setColor(color);  
  180.             canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
  181.       
  182.             paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  183.             canvas.drawBitmap(bitmap, rect, rect, paint);  
  184.       
  185.             return output;  
  186.         }  
  187.       
  188.           
  189.        /** 
  190.          * 使圆角功能支持BitampDrawable 
  191.          * @param bitmapDrawable  
  192.          * @param pixels  
  193.          * @return 
  194.          */  
  195.         public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable, int pixels) {  
  196.             Bitmap bitmap = bitmapDrawable.getBitmap();  
  197.             bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));  
  198.             return bitmapDrawable;  
  199.         }  
  200. }  


TestListViewActivity.java
Java代码   收藏代码
  1. package cn.anycall.testlist;  
  2.   
  3.   
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import android.app.ListActivity;  
  10. import android.content.Context;  
  11. import android.graphics.drawable.Drawable;  
  12. import android.os.Bundle;  
  13. import android.os.Handler;  
  14. import android.os.Looper;  
  15. import android.os.Message;  
  16. import android.view.LayoutInflater;  
  17. import android.view.View;  
  18. import android.view.ViewGroup;  
  19. import android.widget.BaseAdapter;  
  20. import android.widget.Button;  
  21. import android.widget.ImageView;  
  22. import android.widget.LinearLayout;  
  23. import android.widget.ListView;  
  24. import android.widget.TextView;  
  25. import cn.anycall.testlist.AsyncImageLoader.ImageCallback;  
  26.   
  27. public class TestListViewActivity extends ListActivity {  
  28.   
  29.     private List<Map<String, Object>> mData = new ArrayList<Map<String, Object>>();   
  30.     public final class ViewHolder {  
  31.         public ImageView img;  
  32.         public TextView title;  
  33.         public TextView info;  
  34.     }  
  35.        
  36.     public List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();  
  37.     public int a = 0;  
  38.     public Button button;  
  39.     public LinearLayout layloading;  
  40.     public MyHandler myHandler;  
  41.     public  MyAdapter adapter ;   
  42.     private AsyncImageLoader asyncImageLoader;  
  43.       
  44.       
  45.       
  46.     public void onCreate(Bundle savedInstanceState) {  
  47.         super.onCreate(savedInstanceState);  
  48.         setContentView(R.layout.main);  
  49.           
  50.         myHandler = new MyHandler();  
  51.           
  52.           
  53.         ListView listView = getListView();// 得到ListView  
  54.         LinearLayout listFooter = (LinearLayout) LayoutInflater.from(this)  
  55.                 .inflate(R.layout.main_foot, null);  
  56.         listView.addFooterView(listFooter);// 添加FooterView  
  57.         button = (Button) findViewById(R.id.more);  
  58.         layloading = (LinearLayout) findViewById(R.id.loading);  
  59.         button.setVisibility(View.VISIBLE);  
  60.         layloading.setVisibility(View.GONE);  
  61.         adapter =  new MyAdapter(this);   
  62.         setListAdapter(adapter);  
  63.         button.setOnClickListener(new Button.OnClickListener() {  
  64.             public void onClick(View v) {  
  65.                 //起一个线程更新后台数据  
  66.                 MyThread m = new MyThread();  
  67.                 new Thread(m).start();  
  68.                   
  69.             }  
  70.         });  
  71.         for(int i=0;i<20;i++){  
  72.             a++;  
  73.             Map<String, Object> map = new HashMap<String, Object>();   
  74.             map.put("img", R.drawable.icon);   
  75.              map.put("title""G"+a);    
  76.              map.put("info""google"+a);    
  77.              mData.add(map);   
  78.         }  
  79.     }  
  80.     public class MyAdapter extends BaseAdapter {  
  81.         private LayoutInflater mInflater;  
  82.           
  83.         public MyAdapter(Context context) {  
  84.             this.mInflater = LayoutInflater.from(context);  
  85.         }  
  86.         public int getCount() {  
  87.             return mData.size();  
  88.         }  
  89.         public Object getItem(int arg0) {  
  90.             return null;  
  91.         }  
  92.         public long getItemId(int arg0) {  
  93.             return 0;  
  94.         }  
  95.         public View getView(int position, View convertView, ViewGroup parent) {  
  96.             asyncImageLoader = new AsyncImageLoader();  
  97.             ViewHolder holder = null;  
  98.             if (convertView == null) {  
  99.                 holder = new ViewHolder();  
  100.                 convertView = mInflater.inflate(R.layout.main_list, null);  
  101.                   
  102.                 holder.img = (ImageView)convertView.findViewById(R.id.img);   
  103.                 holder.title = (TextView) convertView  
  104.                         .findViewById(R.id.listtitle);  
  105.                 holder.info = (TextView) convertView  
  106.                         .findViewById(R.id.listtext);  
  107.                 convertView.setTag(holder);  
  108.             } else {  
  109.                 holder = (ViewHolder) convertView.getTag();  
  110.             }  
  111.               
  112.               
  113.               
  114.             //holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));   
  115.             holder.title.setText((String) mData.get(position).get("title"));  
  116.             holder.info.setText((String) mData.get(position).get("info"));  
  117.               
  118.   
  119.             //异步加载图片  
  120.             Drawable cachedImage = asyncImageLoader.loadDrawable("http://www.1860.cn/tuangou/groupon/img/logo_v4.png",holder.img, new ImageCallback(){  
  121.                   
  122.                 public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl) {  
  123.                     imageView.setImageDrawable(imageDrawable);  
  124.                 }  
  125.             });  
  126.             System.out.println(cachedImage);  
  127.             if (cachedImage == null) {  
  128.                 holder.img.setImageResource(R.drawable.icon);  
  129.             } else {  
  130.                 holder.img.setImageDrawable(cachedImage);  
  131.             }  
  132.               
  133.               
  134.               
  135.               
  136.               
  137.             return convertView;  
  138.   
  139.         }  
  140.   
  141.     }  
  142.       
  143.       
  144.       
  145.     //更新后台数据  
  146.     class MyThread implements Runnable {  
  147.         public void run() {  
  148.   
  149.               
  150.             String msglist = "1";  
  151.             Message msg = new Message();  
  152.             Bundle b = new Bundle();// 存放数据  
  153.             b.putString("rmsg", msglist);  
  154.             msg.setData(b);  
  155.             TestListViewActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI  
  156.               
  157.             try {  
  158.                 Thread.sleep(5000);  
  159.             } catch (InterruptedException e) {  
  160.                 // TODO Auto-generated catch block  
  161.                 e.printStackTrace();  
  162.             }  
  163.               
  164.               
  165.              msglist = "2";  
  166.              msg = new Message();  
  167.              b = new Bundle();// 存放数据  
  168.             b.putString("rmsg", msglist);  
  169.             msg.setData(b);  
  170.             TestListViewActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI  
  171.               
  172.   
  173.         }  
  174.     }  
  175.       
  176.       
  177.       
  178.     class MyHandler extends Handler {  
  179.         public MyHandler() {  
  180.         }  
  181.   
  182.         public MyHandler(Looper L) {  
  183.             super(L);  
  184.         }  
  185.   
  186.         // 子类必须重写此方法,接受数据  
  187.         @Override  
  188.         public void handleMessage(Message msg) {  
  189.             // TODO Auto-generated method stub  
  190.             super.handleMessage(msg);  
  191.             // 此处可以更新UI  
  192.             Bundle b = msg.getData();  
  193.             String rmsg = b.getString("rmsg");  
  194.             if ("1".equals(rmsg)) {  
  195.                 // do nothing  
  196.                 button.setVisibility(View.GONE);  
  197.                 layloading.setVisibility(View.VISIBLE);  
  198.               
  199.             }else if ("2".equals(rmsg)) {   
  200.                   
  201.                 try {  
  202.                     Thread.sleep(3000);  
  203.                 } catch (InterruptedException e) {  
  204.                     // TODO Auto-generated catch block  
  205.                     e.printStackTrace();  
  206.                 }  
  207.                 for(int i=0;i<20;i++){  
  208.                     a++;  
  209.                     Map<String, Object> map = new HashMap<String, Object>();   
  210.                     map.put("img", R.drawable.icon);   
  211.                      map.put("title""G"+a);    
  212.                      map.put("info""google"+a);    
  213.                      mData.add(map);   
  214.                 }  
  215.                 button.setVisibility(View.VISIBLE);  
  216.                 layloading.setVisibility(View.GONE);  
  217.                 adapter.notifyDataSetChanged();  
  218.             }  
  219.   
  220.         }  
  221.     }  
  222.   
  223. }  


布局文件:
main.xml
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.         android:orientation="vertical"    
  4.         android:layout_width="fill_parent"    
  5.         android:layout_height="wrap_content"    
  6.           
  7.           
  8.         >    
  9.    
  10.     <ListView android:id="@id/android:list"    
  11.               android:layout_width="fill_parent"    
  12.               android:layout_height="wrap_content"    
  13.               android:drawSelectorOnTop="false"  
  14.               android:footerDividersEnabled="false"  
  15.               android:scrollbars="vertical"  
  16.               />    
  17.       
  18. </LinearLayout>    



main_list.xml
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout   
  3.     android:id="@+id/RelativeLayout01"   
  4.     android:layout_width="fill_parent"   
  5.     xmlns:android="http://schemas.android.com/apk/res/android"   
  6.     android:layout_height="wrap_content"   
  7.     android:paddingBottom="4dip"   
  8.     android:paddingLeft="12dip"  
  9.     android:paddingRight="12dip"  
  10.     android:background="#FFFFFF"  
  11.     >  
  12. <ImageView   
  13.     android:paddingTop="12dip"  
  14.     android:layout_alignParentLeft="true"  
  15.      android:layout_alignParentTop="true"  
  16.     android:layout_width="100dp"   
  17.     android:layout_height="100dp"   
  18.     android:id="@+id/img"  
  19.     />   
  20. <TextView   
  21.     android:text="TextView01"   
  22.     android:layout_height="wrap_content"   
  23.     android:textSize="20dip"   
  24.     android:layout_width="fill_parent"   
  25.     android:id="@+id/listtitle"  
  26.     android:layout_toRightOf="@id/img"  
  27.     />  
  28. <TextView   
  29.     android:text="TextView02"   
  30.     android:layout_height="wrap_content"   
  31.     android:layout_width="fill_parent"   
  32.     android:id="@+id/listtext"  
  33.     android:layout_toRightOf="@id/img"  
  34.     android:layout_below="@id/listtitle"  
  35.     />  
  36. </RelativeLayout>  

main_foot.xml
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout android:layout_width="fill_parent"  
  3.     android:layout_height="wrap_content" android:minHeight="?android:listPreferredItemHeight"  
  4.     xmlns:android="http://schemas.android.com/apk/res/android"  
  5.     android:background="#FFFFFF"  
  6.     >  
  7.   
  8.     <Button android:textSize="16.0sp" android:textColor="#ff545454"  
  9.     android:gravity="center" android:id="@+id/more" android:layout_width="fill_parent"  
  10.     android:layout_height="fill_parent" android:text="加载下20条" />  
  11.   
  12.     <LinearLayout android:gravity="center"  
  13.         android:layout_gravity="center" android:orientation="horizontal"  
  14.         android:id="@+id/loading" android:layout_width="fill_parent"  
  15.         android:layout_height="fill_parent">  
  16.   
  17.         <ProgressBar android:layout_gravity="center_vertical"  
  18.             android:id="@+id/footprogress" android:layout_width="wrap_content"  
  19.             android:layout_height="wrap_content" android:indeterminateBehavior="repeat"  
  20.             style="?android:progressBarStyleSmallInverse" />  
  21.   
  22.         <TextView android:textColor="#ff000000" android:gravity="left|center"  
  23.             android:padding="3.0px" android:layout_width="wrap_content"  
  24.             android:layout_height="wrap_content" android:text="加载中" />  
  25.      
  26.     </LinearLayout>  
  27.   
  28. </LinearLayout>  



AndroidManifest.xml

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="cn.anycall.testlist"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <uses-sdk android:minSdkVersion="4" />  
  7.   
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  9.         <activity android:name=".TestListViewActivity"  
  10.                   android:label="@string/app_name">  
  11.             <intent-filter>  
  12.                 <action android:name="android.intent.action.MAIN" />  
  13.                 <category android:name="android.intent.category.LAUNCHER" />  
  14.             </intent-filter>  
  15.         </activity>  
  16.     </application>  
  17.     <!-- 允许应用打开网络套接口 -->  
  18.     <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  19. </manifest>  源文件下载在附件中:
本文出自:http://yafei.iteye.com/blog/1160207
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值