欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android 實(shí)現(xiàn)WebView點(diǎn)擊圖片查看大圖列表及圖片保存功能

 更新時(shí)間:2017年02月21日 09:40:39   作者:Eyas-  
這篇文章主要介紹了Android 實(shí)現(xiàn)WebView點(diǎn)擊圖片查看大圖列表及圖片保存功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

 在日常開發(fā)過(guò)程中,有時(shí)候會(huì)遇到需要在app中嵌入網(wǎng)頁(yè),此時(shí)使用WebView實(shí)現(xiàn)效果,但在默認(rèn)情況下是無(wú)法點(diǎn)擊圖片查看大圖的,更無(wú)法保存圖片。本文將就這一系列問(wèn)題的實(shí)現(xiàn)進(jìn)行說(shuō)明。

圖示:

項(xiàng)目的知識(shí)點(diǎn):

加載網(wǎng)頁(yè)后如何捕捉網(wǎng)頁(yè)中的圖片點(diǎn)擊事件;

獲取點(diǎn)擊的圖片資源后進(jìn)行圖片顯示,獲取整個(gè)頁(yè)面所有的圖片;

支持查看上下一張的圖片以及對(duì)圖片縮放顯示;

對(duì)圖片進(jìn)行保存;

其他:圖片緩存的處理(不用每次都重新加載已查看過(guò)的圖片)

項(xiàng)目代碼結(jié)構(gòu):

前期準(zhǔn)備(添加權(quán)限、依賴和混淆設(shè)置):

添加權(quán)限:

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

添加依賴:

 compile 'com.bm.photoview:library:1.4.1'
 compile 'com.github.bumptech.glide:glide:3.7.0'
 compile 'com.android.support:support-v4:25.0.0'

混淆文件設(shè)置:

-keep public class * implements com.bumptech.glide.module.GlideModule 
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { 
 **[] $VALUES; 
 public *; 
} 

代碼解析:

MainActivity很簡(jiǎn)單,代碼如下:

@Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  contentWebView = (WebView) findViewById(R.id.webView); 
  contentWebView.getSettings().setJavaScriptEnabled(true); 
  contentWebView.loadUrl("http://a.mp.uc.cn/article.html?uc_param_str=frdnsnpfvecpntnwprdssskt&client=ucweb&wm_aid=c51bcf6c1553481885da371a16e33dbe&wm_id=482efebe15ed4922a1f24dc42ab654e6&pagetype=share&btifl=100"); 
  contentWebView.addJavascriptInterface(new MJavascriptInterface(this,imageUrls), "imagelistener"); 
  contentWebView.setWebViewClient(new MyWebViewClient()); 
 } 

很顯然,就是WebView的基本初始化操作。其中1.自定義了MJavascriptInterface的類用來(lái)實(shí)現(xiàn)js調(diào)用本地的方法;2.自定義MyWebViewClient來(lái)實(shí)現(xiàn)對(duì)WebView的監(jiān)聽(tīng)管理。

MyWebViewClient代碼如下:

public class MyWebViewClient extends WebViewClient { 
 @Override 
 public void onPageFinished(WebView view, String url) { 
  view.getSettings().setJavaScriptEnabled(true); 
  super.onPageFinished(view, url); 
  addImageClickListener(view);//待網(wǎng)頁(yè)加載完全后設(shè)置圖片點(diǎn)擊的監(jiān)聽(tīng)方法 
 } 
 @Override 
 public void onPageStarted(WebView view, String url, Bitmap favicon) { 
  view.getSettings().setJavaScriptEnabled(true); 
  super.onPageStarted(view, url, favicon); 
 } 
 private void addImageClickListener(WebView webView) { 
  webView.loadUrl("javascript:(function(){" + 
    "var objs = document.getElementsByTagName(\"img\"); " + 
    "for(var i=0;i<objs.length;i++) " + 
    "{" 
    + " objs[i].onclick=function() " + 
    " { " 
    + "  window.imagelistener.openImage(this.src); " +//通過(guò)js代碼找到標(biāo)簽為img的代碼塊,設(shè)置點(diǎn)擊的監(jiān)聽(tīng)方法與本地的openImage方法進(jìn)行連接 
    " } " + 
    "}" + 
    "})()"); 
 } 
} 

該類繼承自WebViewClient,在onPageFinished方法中設(shè)置addImageClickListener的監(jiān)聽(tīng)方法——>當(dāng)整個(gè)WebView頁(yè)面加載完畢后,為每張圖片設(shè)置監(jiān)聽(tīng)事件——>這意味著,整個(gè)頁(yè)面未加載完畢時(shí),點(diǎn)擊是無(wú)效的。
addImageClickListener的代碼實(shí)現(xiàn)也很簡(jiǎn)單,通過(guò)js找到相應(yīng)的img標(biāo)簽,這樣就知道是圖片了,然后為這些圖片設(shè)置點(diǎn)擊監(jiān)聽(tīng)事件——>每當(dāng)點(diǎn)擊時(shí)調(diào)用自定義的openImage(url)方法。這個(gè)openImage(url)方法與MJavascriptInterface中對(duì)應(yīng)的方法交相輝映,這樣就形成了js調(diào)用本地的方法。

MJavascriptInterface代碼(主要為與js對(duì)應(yīng)的本地方法的實(shí)現(xiàn)):

public class MJavascriptInterface { 
 private Context context; 
 private String [] imageUrls; 
 public MJavascriptInterface(Context context,String[] imageUrls) { 
  this.context = context; 
  this.imageUrls = imageUrls; 
 } 
 @android.webkit.JavascriptInterface 
 public void openImage(String img) { 
  Intent intent = new Intent(); 
  intent.putExtra("imageUrls", imageUrls); 
  intent.putExtra("curImageUrl", img); 
  intent.setClass(context, PhotoBrowserActivity.class); 
  context.startActivity(intent); 
 } 
} 

可以看到,openImage(url)方法實(shí)現(xiàn)的邏輯是:通過(guò)傳遞當(dāng)前圖片的url與該WebView整個(gè)頁(yè)面的圖片列表(imageUrls)進(jìn)行跳轉(zhuǎn)至PhotoBrowserActivity中。PhotoBrowserActivity就是用來(lái)顯示大圖的圖片列表的頁(yè)面。

此處的疑問(wèn):imageUrls怎么獲得呢?

方式:1.服務(wù)器端直接將WebView中所有的圖片按照順序組合成String數(shù)組傳遞過(guò)來(lái);2.或者直接將所有含img標(biāo)簽的html代碼傳遞過(guò)來(lái),從而讓客戶端自己解析出所有圖片地址組合成的String數(shù)組。(此處是采用的第二種,具體如何解析,可以下載源碼查看。)

OK,到了這里算是完成了項(xiàng)目知識(shí)點(diǎn)的第1點(diǎn):1.加載網(wǎng)頁(yè)后如何捕捉網(wǎng)頁(yè)中的圖片點(diǎn)擊事件;

接下來(lái)就說(shuō)明后面的幾點(diǎn):

2.獲取點(diǎn)擊的圖片資源后進(jìn)行圖片顯示,獲取整個(gè)頁(yè)面所有的圖片;

3.支持查看上下一張的圖片以及對(duì)圖片縮放顯示;

4.對(duì)圖片進(jìn)行保存;

其他所有的幾點(diǎn)實(shí)現(xiàn)均在PhotoBrowserActivity中,代碼如下:主要就是將圖片放進(jìn)ViewPager中進(jìn)行顯示:

mPager = (ViewPager) findViewById(R.id.pager); 
  mPager.setPageMargin((int) (getResources().getDisplayMetrics().density * 15)); 
  mPager.setAdapter(new PagerAdapter() { 
   @Override 
   public int getCount() { 
    return imageUrls.length; 
   } 
   @Override 
   public boolean isViewFromObject(View view, Object object) { 
    return view == object; 
   } 
   @Override 
   public Object instantiateItem(ViewGroup container, final int position) { 
    if (imageUrls[position] != null && !"".equals(imageUrls[position])) { 
     final PhotoView view = new PhotoView(PhotoBrowserActivity.this); 
     view.enable(); 
     view.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     Glide.with(PhotoBrowserActivity.this).load(imageUrls[position]).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).fitCenter().crossFade().listener(new RequestListener<String, GlideDrawable>() { 
      @Override 
      public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
       if (position == curPosition) { 
        hideLoadingAnimation(); 
       } 
       showErrorLoading(); 
       return false; 
      } 
      @Override 
      public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
       occupyOnePosition(position); 
       if (position == curPosition) { 
        hideLoadingAnimation(); 
       } 
       return false; 
      } 
     }).into(view); 
     container.addView(view); 
     return view; 
    } 
    return null; 
   } 
   @Override 
   public void destroyItem(ViewGroup container, int position, Object object) { 
    releaseOnePosition(position); 
    container.removeView((View) object); 
   } 
  }); 
  curPosition = returnClickedPosition() == -1 ? 0 : returnClickedPosition(); 
  mPager.setCurrentItem(curPosition); 
  mPager.setTag(curPosition); 
  if (initialedPositions[curPosition] != curPosition) {//如果當(dāng)前頁(yè)面未加載完畢,則顯示加載動(dòng)畫,反之相反; 
   showLoadingAnimation(); 
  } 
  photoOrderTv.setText((curPosition + 1) + "/" + imageUrls.length);//設(shè)置頁(yè)面的編號(hào) 
  mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
   @Override 
   public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
   } 
   @Override 
   public void onPageSelected(int position) { 
    if (initialedPositions[position] != position) {//如果當(dāng)前頁(yè)面未加載完畢,則顯示加載動(dòng)畫,反之相反; 
     showLoadingAnimation(); 
    } else { 
     hideLoadingAnimation(); 
    } 
    curPosition = position; 
    photoOrderTv.setText((position + 1) + "/" + imageUrls.length);//設(shè)置頁(yè)面的編號(hào) 
    mPager.setTag(position);//為當(dāng)前view設(shè)置tag 
   } 
   @Override 
   public void onPageScrollStateChanged(int state) { 
   } 
  }); 
 } 
 private int returnClickedPosition() { 
  if (imageUrls == null || curImageUrl == null) { 
   return -1; 
  } 
  for (int i = 0; i < imageUrls.length; i++) { 
   if (curImageUrl.equals(imageUrls[i])) { 
    return i; 
   } 
  } 
  return -1; 
 } 

1.首先通過(guò)returnClickedPosition方法來(lái)獲得用戶點(diǎn)擊的是哪一張圖片的位置并設(shè)置當(dāng)前是哪一個(gè)page——>通過(guò)遍歷當(dāng)前url與所有url來(lái)匹配獲取;

2.通過(guò)addOnPageChangeListener來(lái)實(shí)現(xiàn)對(duì)頁(yè)面滑動(dòng)事件的監(jiān)聽(tīng)——>此處主要用來(lái)處理設(shè)置當(dāng)前頁(yè)面的position、動(dòng)畫、頁(yè)面序號(hào)顯示的邏輯;

3.PagerAdapter的實(shí)現(xiàn)——>每一頁(yè)內(nèi)容的初始化,主要為instantiateItem,核心代碼再次拖出來(lái)如下;

if (imageUrls[position] != null && !"".equals(imageUrls[position])) { 
     final PhotoView view = new PhotoView(PhotoBrowserActivity.this); 
     view.enable(); 
     view.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     Glide.with(PhotoBrowserActivity.this).load(imageUrls[position]).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).fitCenter().crossFade().listener(new RequestListener<String, GlideDrawable>() { 
      @Override 
      public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
       if (position == curPosition) { 
        hideLoadingAnimation(); 
       } 
       showErrorLoading(); 
       return false; 
      } 
      @Override 
      public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
       occupyOnePosition(position); 
       if (position == curPosition) { 
        hideLoadingAnimation(); 
       } 
       return false; 
      } 
     }).into(view); 
     container.addView(view); 
     return view; 
    } 

大體思路:

1.通過(guò)PhotoView來(lái)實(shí)現(xiàn)圖片的伸縮顯示;2.通過(guò)Glide來(lái)加載圖片等處理;

PhotoView是什么——>就是圖片組件,對(duì)圖片的伸縮、動(dòng)效、緩存等方面進(jìn)行了處理,點(diǎn)擊地址查看GitHub介紹>>:

Gilde是什么——>Google推薦的圖片加載庫(kù),此處用它的理由是好用、簡(jiǎn)單,點(diǎn)擊地址查看GitHub介紹>>:

Glide的簡(jiǎn)化形式——>Glide.with(...).load(圖片地址).override(加載圖片的大小).listener(設(shè)置監(jiān)聽(tīng)方法).into(某個(gè)一個(gè)組件,此處是PhotoView),此處使用的是原圖加載,監(jiān)聽(tīng)方法中有兩個(gè)回調(diào)方法:

onException和onResourceReady,此處在onResourceReady做的處理是:當(dāng)資源加載完畢時(shí)調(diào)用——>此時(shí)取消加載動(dòng)畫的顯示。

頁(yè)面中的“頁(yè)面編號(hào)”和“保存”的組件顯示是通過(guò)寫在整個(gè)Activity的布局文件中實(shí)現(xiàn)的,而不是通過(guò)在每一頁(yè)中寫入這些組件。以下為獲取圖片資源對(duì)象的代碼:

private void savePhotoToLocal() { 
  ViewGroup containerTemp = (ViewGroup) mPager.findViewWithTag(mPager.getCurrentItem()); 
  if (containerTemp == null) { 
   return; 
  } 
  PhotoView photoViewTemp = (PhotoView) containerTemp.getChildAt(0); 
  if (photoViewTemp != null) { 
   GlideBitmapDrawable glideBitmapDrawable = (GlideBitmapDrawable) photoViewTemp.getDrawable(); 
   if (glideBitmapDrawable == null) { 
    return; 
   } 
   Bitmap bitmap = glideBitmapDrawable.getBitmap(); 
   if (bitmap == null) { 
    return; 
   } 
   FileUtils.savePhoto(this, bitmap, new FileUtils.SaveResultCallback() { 
    @Override 
    public void onSavedSuccess() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(PhotoBrowserActivity.this, "保存成功", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
    @Override 
    public void onSavedFailed() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(PhotoBrowserActivity.this, "保存失敗", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
   }); 
  } 
 } 

因?yàn)橄螺d圖片需要知道當(dāng)前處于哪一頁(yè),所以在ViewPager初始化顯示和滑動(dòng)時(shí)都給每一頁(yè)設(shè)置了tag,此時(shí)就派上了用場(chǎng)——>mPager.findViewWithTag獲取當(dāng)前page中的布局對(duì)象,然后獲得對(duì)應(yīng)的PhotoView對(duì)象,從而經(jīng)過(guò)處理最終獲取到Bitmap對(duì)象。這樣已經(jīng)很簡(jiǎn)單了,接下來(lái)只要將Bitmap對(duì)象保存至本地即可,代碼如下:

public class FileUtils { 
 public static void savePhoto(final Context context, final Bitmap bmp , final SaveResultCallback saveResultCallback) { 
  new Thread(new Runnable() { 
   @Override 
   public void run() { 
    File appDir = new File(Environment.getExternalStorageDirectory(), "out_photo"); 
    if (!appDir.exists()) { 
     appDir.mkdir(); 
    } 
    SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//設(shè)置以當(dāng)前時(shí)間格式為圖片名稱 
    String fileName = df.format(new Date()) + ".png"; 
    File file = new File(appDir, fileName); 
    try { 
     FileOutputStream fos = new FileOutputStream(file); 
     bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     fos.flush(); 
     fos.close(); 
     saveResultCallback.onSavedSuccess(); 
    } catch (FileNotFoundException e) { 
     saveResultCallback.onSavedFailed(); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     saveResultCallback.onSavedFailed(); 
     e.printStackTrace(); 
    } 
    //保存圖片后發(fā)送廣播通知更新數(shù)據(jù)庫(kù) 
    Uri uri = Uri.fromFile(file); 
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri)); 
   } 
  }).start(); 
 } 
 public interface SaveResultCallback{ 
  void onSavedSuccess(); 
  void onSavedFailed(); 
 } 
} 

圖片如何保存已經(jīng)如代碼所示,但要注意的是需要將已經(jīng)保存的圖片進(jìn)行廣播通知數(shù)據(jù)庫(kù)更新——>這樣立馬進(jìn)入微信或者扣扣點(diǎn)擊發(fā)送圖片,就可以看到剛剛保存的圖片。

緩存的處理:

使用Glide其中的一個(gè)好處是會(huì)將圖片默認(rèn)緩存,在需要清除緩存時(shí),只需要執(zhí)行下面的代碼(此處是放在MainActivity中,退出頁(yè)面即清除緩存):

@Override 
 protected void onDestroy() { 
  new Thread(new Runnable() { 
   @Override 
   public void run() { 
    Glide.get(MainActivity.this).clearDiskCache();//清理磁盤緩存需要在子線程中執(zhí)行 
   } 
  }).start(); 
  Glide.get(this).clearMemory();//清理內(nèi)存緩存可以在UI主線程中進(jìn)行 
  super.onDestroy(); 
 } 

特別注意:

1.若項(xiàng)目配置中將targetSdkVersion 指定為22以上,則要加入動(dòng)態(tài)權(quán)限申請(qǐng)的模塊,否則在進(jìn)行保存操作時(shí)則會(huì)提示失??!

2.項(xiàng)目中暴露的js接口類:MJavascriptInterface不能混淆,其調(diào)用的方法的聲明也不能混淆,所以還要添加如下混淆設(shè)置代碼(代碼因包名而變化):

-keepclassmembers class com.example.administrator.webviewpagescannerapp.other.MJavascriptInterface{ 
 public *; 
} 
-keepattributes *Annotation* 
-keepattributes *JavascriptInterface* 

源碼已經(jīng)上傳至GitHub,點(diǎn)擊此處查看>>

以上所述是小編給大家介紹的Android 實(shí)現(xiàn)WebView點(diǎn)擊圖片查看大圖列表及圖片保存功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • android開機(jī)自動(dòng)啟動(dòng)app的解決方法

    android開機(jī)自動(dòng)啟動(dòng)app的解決方法

    這篇文章主要為大家詳細(xì)介紹了android開機(jī)自動(dòng)啟動(dòng)app的解決方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android4.4 訪問(wèn)外部存儲(chǔ)詳解及實(shí)例

    Android4.4 訪問(wèn)外部存儲(chǔ)詳解及實(shí)例

    這篇文章主要介紹了Android4.4 訪問(wèn)外部存儲(chǔ)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 輕松實(shí)現(xiàn)安卓(Android)九宮格解鎖

    輕松實(shí)現(xiàn)安卓(Android)九宮格解鎖

    在平常使用手機(jī)的過(guò)程中,九宮格解鎖是我們經(jīng)常接觸到的。常見(jiàn)的比如有鎖屏中的九宮格,還有支付寶中的九宮格等。因?yàn)榫艑m格可以保護(hù)用戶的隱私,所以它的應(yīng)用面很廣泛。那么今天我們就來(lái)自定義一個(gè)屬于自己的九宮格吧!
    2016-08-08
  • Android自定義鍵盤的實(shí)現(xiàn)(數(shù)字鍵盤和字母鍵盤)

    Android自定義鍵盤的實(shí)現(xiàn)(數(shù)字鍵盤和字母鍵盤)

    本篇文章主要介紹了Android自定義鍵盤的實(shí)現(xiàn)(數(shù)字鍵盤和字母鍵盤),具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • 拯救強(qiáng)迫癥Android Builder模式

    拯救強(qiáng)迫癥Android Builder模式

    這篇文章主要為大家介紹了拯救強(qiáng)迫癥Android Builder模式的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Android四大組件之broadcast廣播詳解

    Android四大組件之broadcast廣播詳解

    Android開發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù),本篇著重介紹廣播組件
    2022-10-10
  • Android 環(huán)境變量的配置方法

    Android 環(huán)境變量的配置方法

    本文主要介紹Android 環(huán)境變量的配置方法,這里詳細(xì)講解了如何實(shí)現(xiàn)環(huán)境變量的配置方法,有興趣的小伙伴可以參考下
    2016-09-09
  • 詳解Android ViewPager2中的緩存和復(fù)用機(jī)制

    詳解Android ViewPager2中的緩存和復(fù)用機(jī)制

    最近接觸到豎向整頁(yè)滑動(dòng)的需求,發(fā)現(xiàn)了viewpager2,viewpager2支持fragment,保留了viewpager的特性,下面這篇文章主要給大家介紹了關(guān)于ViewPager2中的緩存和復(fù)用機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Flutter 常用插件匯總

    Flutter 常用插件匯總

    Flutter 有了谷歌強(qiáng)大后盾加持,加上跨平臺(tái)的特性,生態(tài)日益豐富,目前大部分應(yīng)用能夠用到的插件在 pub.flutter-io.cn上都可以找得到。本篇介紹 Flutter 最為常見(jiàn)的插件,以避免重復(fù)造輪子和新手少走彎路。
    2021-05-05
  • Kotlin學(xué)習(xí)教程之協(xié)程Coroutine

    Kotlin學(xué)習(xí)教程之協(xié)程Coroutine

    這篇文章主要給大家介紹了關(guān)于Kotlin學(xué)習(xí)教程之協(xié)程Coroutine的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05

最新評(píng)論