亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android高效安全加載圖片的方法詳解

2019-10-21 21:25:10
字體:
供稿:網(wǎng)友

1. 概述

在 Android 應(yīng)用程序的設(shè)計中,幾乎不可避免地都需要加載和顯示圖片,由于不同的圖片在大小上千差萬別,有些圖片可能只需要幾十KB的內(nèi)存空間,有些圖片卻需要占用幾十MB的內(nèi)存空間;或者一張圖片不需要占用太多的內(nèi)存,但是需要同時加載和顯示多張圖片。

在這些情況下,加載圖片都需要占用大量的內(nèi)存,而 Android系統(tǒng)分配給每個進(jìn)程的內(nèi)存空間是有限的,如果加載的圖片所需要的內(nèi)存超過了限制,進(jìn)程就會出現(xiàn) OOM,即內(nèi)存溢出。

本文針對加載大圖片或者一次加載多張圖片等兩種不同的場景,采用不同的加載方式,以盡量避免可能導(dǎo)致的內(nèi)存溢出問題。

下面話不多說了,來一起看看詳細(xì)的介紹吧

2. 加載大圖片

有時一張圖片的加載和顯示就需要占用大量的內(nèi)存,例如圖片的大小是 2592x1936 ,同時采用的位圖配置是 ARGB_8888 ,其在內(nèi)存中需要的大小是 2592x1936x4字節(jié),大概是 19MB。僅僅加載這樣一張圖片就可能會超過進(jìn)程的內(nèi)存限制,進(jìn)而導(dǎo)致內(nèi)存溢出,所以在實際使用時肯定無法直接加載到內(nèi)存中。

為了避免內(nèi)存溢出,根據(jù)不同的顯示需求,采取不同的加載方式:

  • 顯示一張圖片的全部內(nèi)容:對原圖片進(jìn)行 壓縮顯示。
  • 顯示一張圖片的部分內(nèi)容:對原圖片進(jìn)行 局部顯示。

2.1 圖片壓縮顯示

圖片的壓縮顯示指的是對原圖片進(jìn)行長寬的壓縮,以減少圖片的內(nèi)存占用,使其能夠在應(yīng)用上正常顯示,同時保證在加載和顯示過程中不會出現(xiàn)內(nèi)存溢出的情況。

BitmapFactory 是一個創(chuàng)建Bitmap 對象的工具類,使用它可以利用不同來源的數(shù)據(jù)生成Bitamp對象,在創(chuàng)建過的過程中還可以對需要生成的對象進(jìn)行不同的配置和控制,BitmapFactory的類聲明如下:

Creates Bitmap objects from various sources, including files, streams,and byte-arrays.

由于在加載圖片前,是無法提前預(yù)知圖片大小的,所以在實際加載前必須根據(jù)圖片的大小和當(dāng)前進(jìn)程的內(nèi)存情況來決定是否需要對圖片進(jìn)行壓縮,如果加載原圖片所需的內(nèi)存空間已經(jīng)超過了進(jìn)程打算提供或可以提供的內(nèi)存大小,就必須考慮壓縮圖片。

2.1.1 確定原圖片長寬

簡單來說,壓縮圖片就是對原圖的長寬按照一定的比例進(jìn)行縮小,所以首先要確定原圖的長寬信息。為了獲得圖片的長寬信息,利用 BitmapFactory.decodeResource(Resources res, int id, Options opts) 接口,其聲明如下:

 /** * Synonym for opening the given resource and calling * {@link #decodeResourceStream}. * * @param res The resources object containing the image data * @param id The resource id of the image data * @param opts null-ok; Options that control downsampling and whether the *  image should be completely decoded, or just is size returned. * @return The decoded bitmap, or null if the image data could not be *  decoded, or, if opts is non-null, if opts requested only the *  size be returned (in opts.outWidth and opts.outHeight) * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} *  is {@link android.graphics.Bitmap.Config#HARDWARE} *  and {@link BitmapFactory.Options#inMutable} is set, if the specified color space *  is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer *  function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} */ public static Bitmap decodeResource(Resources res, int id, Options opts) {

通過這個函數(shù)聲明,可以看到通過這個接口可以得到圖片的長寬信息,同時由于返回 null并不申請內(nèi)存空間,避免了不必要的內(nèi)存申請。

為了得到圖片的長寬信息,必須傳遞一個 Options 參數(shù),其中的 inJustDecodeBounds 設(shè)置為 true,其聲明如下:

 /** * If set to true, the decoder will return null (no bitmap), but * the <code>out...</code> fields will still be set, allowing the caller to * query the bitmap without having to allocate the memory for its pixels. */ public boolean inJustDecodeBounds;

下面給出得到圖片長寬信息的示例代碼:

 BitmapFactory.Options options = new BitmapFactory.Options(); // 指定在解析圖片文件時,僅僅解析邊緣信息而不創(chuàng)建 bitmap 對象。 options.inJustDecodeBounds = true; // R.drawable.test 是使用的 2560x1920 的測試圖片資源文件。 BitmapFactory.decodeResource(getResources(), R.drawable.test, options); int width = options.outWidth; int height = options.outHeight; Log.i(TAG, "width: " + width + ", height: " + height);

在實際測試中,得到的長寬信息如下:

    01-05 04:06:23.022 29836 29836 I Android_Test: width: 2560, height: 1920

2.1.2 確定目標(biāo)壓縮比例

得知原圖片的長寬信息后,為了能夠進(jìn)行后續(xù)的壓縮操作,必須要先確定目標(biāo)壓縮比例。所謂壓縮比例就是指要對原始的長寬進(jìn)行的裁剪比例,如果如果原圖片是 2560x1920,采取的壓縮比例是 4,進(jìn)行壓縮后的圖片是 640x480,最終大小是原圖片的1/16。

壓縮比例在 BitmapFactory.Options中對應(yīng)的屬性是 inSampleSize,其聲明如下:

 /** * If set to a value > 1, requests the decoder to subsample the original * image, returning a smaller image to save memory. The sample size is * the number of pixels in either dimension that correspond to a single * pixel in the decoded bitmap. For example, inSampleSize == 4 returns * an image that is 1/4 the width/height of the original, and 1/16 the * number of pixels. Any value <= 1 is treated the same as 1. Note: the * decoder uses a final value based on powers of 2, any other value will * be rounded down to the nearest power of 2. */ public int inSampleSize;

需要特別注意的是,inSampleSize 只能是 2的冪,如果傳入的值不滿足條件,解碼器會選擇一個和傳入值最節(jié)儉的2的冪;如果傳入的值小于 1,解碼器會直接使用1。

要確定最終的壓縮比例,首先要確定目標(biāo)大小,即壓縮后的目標(biāo)圖片的長寬信息,根據(jù)原始長寬和目標(biāo)長寬來選擇一個最合適的壓縮比例。下面給出示例代碼:

 /** * @param originWidth the width of the origin bitmap * @param originHeight the height of the origin bitmap * @param desWidth the max width of the desired bitmap * @param desHeight the max height of the desired bitmap * @return the optimal sample size to make sure the size of bitmap is not more than the desired. */ public static int calculateSampleSize(int originWidth, int originHeight, int desWidth, int desHeight) { int sampleSize = 1; int width = originWidth; int height = originHeight; while((width / sampleSize) > desWidth && (height / sampleSize) > desHeight) {  sampleSize *= 2; } return sampleSize; }

需要注意的是這里的desWidth和desHeight 是目標(biāo)圖片的最大長寬值,而不是最終的大小,因為通過這個方法確定的壓縮比例會保證最終的圖片長寬不大于目標(biāo)值。

在實際測試中,把原圖片大小設(shè)置為2560x1920,把目標(biāo)圖片大小設(shè)置為100x100:

 int sampleSize = BitmapCompressor.calculateSampleSize(2560, 1920, 100, 100); Log.i(TAG, "sampleSize: " + sampleSize);

測試結(jié)果如下:

    01-05 04:42:07.752  8835  8835 I Android_Test: sampleSize: 32

最終得到的壓縮比例是32,如果使用這個比例去壓縮2560x1920的圖片,最終得到80x60的圖片。

2.1.3 壓縮圖片

在前面兩部分,分別確定了原圖片的長寬信息和目標(biāo)壓縮比例,其實確定原圖片的長寬也是為了得到壓縮比例,既然已經(jīng)得到的壓縮比較,就可以進(jìn)行實際的壓縮操作了,只需要把得到的inSampleSize通過Options傳遞給BitmapFactory.decodeResource(Resources res, int id, Options opts)即可。

下面是示例代碼:

 public static Bitmap compressBitmapResource(Resources res, int resId, int inSampleSize) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inSampleSize = inSampleSize; return BitmapFactory.decodeResource(res, resId, options); }

2.2 圖片局部顯示

圖片壓縮會在一定程度上影響圖片質(zhì)量和顯示效果,在某些場景下并不可取,例如地圖顯示時要求必須是高質(zhì)量圖片,這時就不能進(jìn)行壓縮處理,在這種場景下其實并不要求要一次顯示圖片的所有部分,可以考慮一次只加載和顯示圖片的特定部分,即***局部顯示***。

要實現(xiàn)局部顯示的效果,可以使用BitmapRegionDecoder 來實現(xiàn),它就是用來對圖片的特定部分進(jìn)行顯示的,尤其是在原圖片特別大而無法一次全部加載到內(nèi)存的場景下,其聲明如下:

 /** * BitmapRegionDecoder can be used to decode a rectangle region from an image. * BitmapRegionDecoder is particularly useful when an original image is large and * you only need parts of the image. * * <p>To create a BitmapRegionDecoder, call newInstance(...). * Given a BitmapRegionDecoder, users can call decodeRegion() repeatedly * to get a decoded Bitmap of the specified region. * */ public final class BitmapRegionDecoder { ... }

這里也說明了如果使用BitmapRegionDecoder進(jìn)行局部顯示:首先通過newInstance()創(chuàng)建實例,再利用decodeRegion()對指定區(qū)域的圖片內(nèi)存創(chuàng)建Bitmap對象,進(jìn)而在顯示控件中顯示。

過BitmapRegionDecoder.newInstance()創(chuàng)建解析器實例,其函數(shù)聲明如下:

 /** * Create a BitmapRegionDecoder from an input stream. * The stream's position will be where ever it was after the encoded data * was read. * Currently only the JPEG and PNG formats are supported. * * @param is The input stream that holds the raw data to be decoded into a *  BitmapRegionDecoder. * @param isShareable If this is true, then the BitmapRegionDecoder may keep a *   shallow reference to the input. If this is false, *   then the BitmapRegionDecoder will explicitly make a copy of the *   input data, and keep that. Even if sharing is allowed, *   the implementation may still decide to make a deep *   copy of the input data. If an image is progressively encoded, *   allowing sharing may degrade the decoding speed. * @return BitmapRegionDecoder, or null if the image data could not be decoded. * @throws IOException if the image format is not supported or can not be decoded. * * <p class="note">Prior to {@link android.os.Build.VERSION_CODES#KITKAT}, * if {@link InputStream#markSupported is.markSupported()} returns true, * <code>is.mark(1024)</code> would be called. As of * {@link android.os.Build.VERSION_CODES#KITKAT}, this is no longer the case.</p> */ public static BitmapRegionDecoder newInstance(InputStream is,  boolean isShareable) throws IOException { ... }

需要注意的是,這只是BitmapRegionDecoder其中一個newInstance函數(shù),除此之外還有其他的實現(xiàn)形式,讀者有興趣可以自己查閱。

在創(chuàng)建得到BitmapRegionDecoder實例后,可以調(diào)用decodeRegion方法來創(chuàng)建局部Bitmap對象,其函數(shù)聲明如下:

 /** * Decodes a rectangle region in the image specified by rect. * * @param rect The rectangle that specified the region to be decode. * @param options null-ok; Options that control downsampling. *  inPurgeable is not supported. * @return The decoded bitmap, or null if the image data could not be *  decoded. * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} *  is {@link android.graphics.Bitmap.Config#HARDWARE} *  and {@link BitmapFactory.Options#inMutable} is set, if the specified color space *  is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer *  function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} */ public Bitmap decodeRegion(Rect rect, BitmapFactory.Options options) { ... }

由于這部分比較簡單,下面直接給出相關(guān)示例代碼:

 // 解析得到原圖的長寬值,方便后面進(jìn)行局部顯示時指定需要顯示的區(qū)域。 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.drawable.test, options); int width = options.outWidth; int height = options.outHeight; try { // 創(chuàng)建局部解析器  InputStream inputStream = getResources().openRawResource(R.drawable.test); BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(inputStream,false);  // 指定需要顯示的矩形區(qū)域,這里要顯示的原圖的左上 1/4 區(qū)域。 Rect rect = new Rect(0, 0, width / 2, height / 2); // 創(chuàng)建位圖配置,這里使用 RGB_565,每個像素占 2 字節(jié)。 BitmapFactory.Options regionOptions = new BitmapFactory.Options(); regionOptions.inPreferredConfig = Bitmap.Config.RGB_565;  // 創(chuàng)建得到指定區(qū)域的 Bitmap 對象并進(jìn)行顯示。 Bitmap regionBitmap = decoder.decodeRegion(rect,regionOptions); ImageView imageView = (ImageView) findViewById(R.id.main_image); imageView.setImageBitmap(regionBitmap); } catch (Exception e) { e.printStackTrace(); }

從測試結(jié)果看,確實只顯示了原圖的左上1/4區(qū)域的圖片內(nèi)容,這里不再貼出結(jié)果。

3. 加載多圖片

有時需要在應(yīng)用中同時顯示多張圖片,例如使用ListView,GridView和ViewPager時,可能會需要在每一項都顯示一個圖片,這時情況就會變得復(fù)雜些,因為可以通過滑動改變控件的可見項,如果每增加一個可見項就加載一個圖片,同時不可見項的圖片繼續(xù)在內(nèi)存中,隨著不斷的增加,就會導(dǎo)致內(nèi)存溢出。

為了避免這種情況的內(nèi)存溢出問題,就需要對不可見項對應(yīng)的圖片資源進(jìn)行回收,即當(dāng)前項被滑出屏幕的顯示區(qū)域時考慮回收相關(guān)的圖片,這時回收策略對整個應(yīng)用的性能有較大影響。

  • 立即回收:在當(dāng)前項被滑出屏幕時立即回收圖片資源,但如果被滑出的項很快又被滑入屏幕,就需要重新加載圖片,這無疑會導(dǎo)致性能的下降。
  • 延遲回收:在當(dāng)前項被滑出屏幕時不立即回收,而是根據(jù)一定的延遲策略進(jìn)行回收,這時對延遲策略有較高要求,如果延遲時間太短就退回到立即回收狀況,如果延遲時間較長就可能導(dǎo)致一段時間內(nèi),內(nèi)存中存在大量的圖片,進(jìn)而引發(fā)內(nèi)存溢出。通過上面的分析,針對加載多圖的情況,必須要采取延遲回收,而Android提供了一中基于LRU,即最近最少使用策略的內(nèi)存緩存技術(shù): LruCache, 其基本思想是,以強(qiáng)引用的方式保存外界對象,當(dāng)緩存空間達(dá)到一定限制后,再把最近最少使用的對象釋放回收,保證使用的緩存空間始終在一個合理范圍內(nèi)。

其聲明如下:

/** * A cache that holds strong references to a limited number of values. Each time * a value is accessed, it is moved to the head of a queue. When a value is * added to a full cache, the value at the end of that queue is evicted and may * become eligible for garbage collection. */public class LruCache<K, V> { ... }

從聲明中,可以了解到其實現(xiàn)LRU的方式:內(nèi)部維護(hù)一個有序隊列,每當(dāng)其中的一個對象被訪問就被移動到隊首,這樣就保證了隊列中的對象是根據(jù)最近的使用時間從近到遠(yuǎn)排列的,即隊首的對象是最近使用的,隊尾的對象是最久之前使用的。正是基于這個規(guī)則,如果緩存達(dá)到限制后,直接把隊尾對象釋放即可。

在實際使用中,為了創(chuàng)建LruCache對象,首先要確定該緩存能夠使用的內(nèi)存大小,這是效率的決定性因素。如果緩存內(nèi)存太小,無法真正發(fā)揮緩存的效果,仍然需要頻繁的加載和回收資源;如果緩存內(nèi)存太大,可能導(dǎo)致內(nèi)存溢出的發(fā)生。在確定緩存大小的時候,要結(jié)合以下幾個因素:

  • 進(jìn)程可以使用的內(nèi)存情況
  • 資源的大小和需要一次在界面上顯示的資源數(shù)量
  • 資源的訪問頻率

下面給出一個簡單的示例:

 // 獲得進(jìn)程可以使用的最大內(nèi)存量 int maxMemory = (int) Runtime.getRuntime().maxMemory();  mCache = new LruCache<String, Bitmap>(maxMemory / 4) {  @Override  protected int sizeOf(String key, Bitmap value) {   return value.getByteCount();  } };

在示例中簡單地把緩存大小設(shè)定為進(jìn)程可以使用的內(nèi)存的 1/4,當(dāng)然在實際項目中,要考慮的因素會更多。需要注意的是,在創(chuàng)建LruCache對象的時候需要重寫sizeOf方法,它用來返回每個對象的大小,是用來決定當(dāng)前緩存實際大小并判斷是否達(dá)到了內(nèi)存限制。

在創(chuàng)建了LruCache對象后,如果需要使用資源,首先到緩存中去取,如果成功取到就直接使用,否則加載資源并放入緩存中,以方便下次使用。為了加載資源的行為不會影響應(yīng)用性能,需要在子線程中去進(jìn)行,可以利用AsyncTask來實現(xiàn)。

下面是示例代碼:

 public Bitmap get(String key) {  Bitmap bitmap = mCache.get(key);  if (bitmap != null) {   return bitmap;  } else {   new BitmapAsyncTask().execute(key);   return null;  } } private class BitmapAsyncTask extends AsyncTask<String, Void, Bitmap> {  @Override  protected Bitmap doInBackground(String... url) {   Bitmap bitmap = getBitmapFromUrl(url[0]);   if (bitmap != null) {    mCache.put(url[0],bitmap);   }   return bitmap;  }  private Bitmap getBitmapFromUrl(String url) {   Bitmap bitmap = null;   // 在這里要利用給定的 url 信息從網(wǎng)絡(luò)獲取 bitmap 信息.   return bitmap;  } }

示例中,在無法從緩存中獲取資源的時候,會根據(jù)url信息加載網(wǎng)絡(luò)資源,當(dāng)前并沒有給出完整的代碼,有興趣的同學(xué)可以自己去完善。

4. 總結(jié)

本文主要針對不同的圖片加載場景提出了不同的加載策略,以保證在加載和顯示過程中既然能滿足基本的顯示需求,又不會導(dǎo)致內(nèi)存溢出,具體包括針對單個圖片的壓縮顯示,局部顯示和針對多圖的內(nèi)存緩存技術(shù),如若有表述不清甚至錯誤的地方,請及時提出,大家一起學(xué)習(xí)。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
黄色网址中文字幕| 欧美国产精品va在线观看| 最新不卡av在线| 天堂网在线最新版www中文网| 欧美激情综合在线| 日韩一区二区精品在线观看| 亚洲电影在线看| 欧美一区=区三区| 久久众筹精品私拍模特| 久久午夜精品一区二区| 中文字幕欧美日韩在线不卡| 亚洲一区二区五区| 久久毛片高清国产| 少妇光屁股影院| 宅男66日本亚洲欧美视频| 欧美日精品一区视频| 不卡电影免费在线播放一区| 亚洲免费黄色片| 狠狠色狠狠色合久久伊人| 校园春色 亚洲| 国产主播第一页| 黄色av电影在线观看| 精品国产一区二区三区小蝌蚪| 亚洲制服欧美久久| 亚洲一区二区av在线| 二区三区四区高清视频在线观看| 妞干网2018| 日韩av免费一区| av网站在线免费观看| 午夜理伦三级做爰电影| 国产精品亚洲一区二区三区妖精| 欧美成人免费播放| 成人看片黄a免费看在线| 久久免费99精品久久久久久| 91高清视频在线免费观看| 日本在线高清| 一级毛片免费高清中文字幕久久网| av大片免费看| 美女福利视频在线| 亚洲最新免费视频| 欧美大陆一区二区| 神马久久久久久久久久| 99久久er热在这里只有精品15| 91丨九色丨丰满| 91tv在线观看| 看电视剧不卡顿的网站| 国内一区二区在线| 美女写真理伦片在线看| 91视频 - 88av| 国产精品久久久久一区二区三区厕所| 久久精品2019中文字幕| 欧美黄色性视频| 成人黄色网址在线观看| av亚洲男人天堂| 丁香视频免费观看| 国产福利第一视频在线播放| 天天操天天射天天爽| 97在线中文字幕| ,亚洲人成毛片在线播放| 美国十次综合久久| 欧美少妇xxx| 99久久久久久中文字幕一区| 欧美a级在线| 中文字字幕在线中文乱码电影| 婷婷国产成人久久精品激情| 97超碰在线资源| 国产馆手机在线观看| 成年人视频免费看| 亚洲国产精品字幕| 国产精品一区二区三区不卡| 亚洲精品激情视频| 中文字幕av亚洲精品一部二部| 粉嫩老牛aⅴ一区二区三区| 久久久久久午夜| ww久久中文字幕| 图片区 小说区 区 亚洲五月| 中文字幕精品—区二区| 久久99精品久久久久子伦| 3d欧美精品动漫xxxx无尽| 伊人久久久久久久久久久久| 国产日韩高清一区二区三区在线| 日批视频免费观看| 成人污网站在线观看| 九色91蝌蚪在线| 天堂√8在线中文| 污视频在线看网站| 麻豆视频在线观看免费网站黄| 成人免费在线观看入口| 欧美日韩亚洲高清| 亚洲不卡一卡2卡三卡4卡5卡精品| 99久久这里只有精品| 亚洲精品大尺度| 国产精品麻豆久久| 天天伊人狠狠| videoxxxx另类日本极品| 精品国产日韩欧美| 91在线播放视频| 国产精品原创巨作av| 国产韩国精品一区二区三区| 伊人久久综合网另类网站| 国产一区二区主播在线| 国产艳俗歌舞表演hd| 一区二区三区四区日本视频| 精品综合久久88少妇激情| 最新中文乱码字字幕在线| 美女视频免费观看网站在线| 精品剧情v国产在线观看在线| 成人性做爰片免费视频| 久久激情视频免费观看| 国产福利电影一区二区三区| 国产精品一区二区久久久久| 日韩av中文字幕在线免费观看| 91综合视频| 国产一区二区三区高清在线观看| jizzjizz丝袜老师| 丰满少妇又爽又紧又丰满电影| 国产精品50页| 日韩在线观看视频网站| 日韩精品视频在线观看视频| youjizzjizz亚洲| 四虎国产精品成人免费影视| 精品乱码一区二区三四区视频| 无码人妻av一区二区三区波多野| 欧美日韩亚洲一区| 在线成人欧美| 美女黄视频在线观看| 天天操天天射天天| 成人午夜在线影院| 亚洲熟女综合色一区二区三区| 日本老太婆做爰视频| 国产精品初高中害羞小美女文| 欧美性猛交xxxx偷拍洗澡| 国产精品久久久久无码av| 在线黄色免费观看| 香蕉视频在线观看网站| 国产成人无码一区二区三区在线| 亚洲美女主播视频免费观看| 成人啊v在线| 欧美性猛交xxxx乱大交91| 中日韩在线视频| xxx国产精品| 精品无码人妻一区| 久久综合av免费| 久久久精品午夜少妇| 国产日韩精品中文字无码| 日韩精品一区二区三区不卡| 国产老熟女伦老熟妇露脸| 台湾无码一区二区| 91久久国产精品91久久性色| 久久综合国产精品| 99热这里只有精品66| 日本高清视频一区二区| 精品在线观看国产| 亚洲第一免费视频| 国内视频一区| 一本大道亚洲视频| 成人羞羞网站入口| 久久蜜桃av一区二区天堂| 精品黑人一区二区三区在线观看| 国产精品小说在线| 成人一对一视频| 亚洲色图欧美自拍| 午夜激情福利在线| 日本免费久久高清视频| 成人久久久久久久| 91精品国产高清一区二区三区蜜臀| 久久国产黄色片| 能在线观看的av网站| 亚洲一区二区动漫| 性爱视频日本| 成人av网站在线观看免费| 日本免费资源| 亚洲精品8mav| 午夜av电影| 国产成人午夜电影网| 天堂网成人在线| 国产精品欧美在线| 一个人看的www免费观看视频| 久久久久久中文| 亚洲一区中文在线| 疯狂试爱三2浴室激情视频| 丰满少妇在线观看| 麻豆久久久久久久久久| 国产最新精品免费| 亚洲欧美偷拍另类| 国产一二三区在线播放| 国产不卡一卡2卡三卡4卡5卡在线| 一区二区三区视频在线看| 国产成人自拍在线| 98精品久久久久久久| 精品一区二区成人精品| 日韩资源在线| 国产精品视频资源| 尤蜜粉嫩av国产一区二区三区| 日韩黄色短视频| 99久久亚洲一区二区三区青草| 欧美成人观看免费全部完小说| 亚洲国产电影| 伊人免费在线观看高清版| 国产午夜电影| 亚洲不卡在线| 亚洲福利精品在线| av免费播放| 一本一本久久a久久精品牛牛影视| 欧美拍拍视频| 亚洲欧美激情国产综合久久久| 欧美偷窥清纯综合图区| 欧美黑人猛交的在线视频| 国产成人精品综合| jizzjizzjizz中国免费| 欧美a大片欧美片| 天天干天天玩天天操| 毛片免费看不卡网站| 精品一区二区三区免费播放| 精品三级在线观看视频| 欧美91看片特黄aaaa| 91欧洲在线视精品在亚洲| 强开小嫩苞一区二区三区网站| 成人涩涩免费视频| 黄色18在线观看| 伊人色综合网| 国产高清美女一级毛片久久| 日韩欧美一级二级三级久久久| 情趣视频网站在线免费观看| 欧美天堂一区二区| 国产三线在线| 我要色综合中文字幕| 波多野结衣 久久| 国产日韩专区在线| 亚洲经典一区二区三区| 男女啪啪在线观看| 91免费人成网站在线观看18| 色哟哟无码精品一区二区三区| 免费看91视频| 风间由美一区| 国产精品毛片视频| www.久久伊人| 欧美日韩成人综合天天影院| 日韩免费啪啪| 五月婷婷一区二区三区| 九九热最新地址| 日韩精品免费在线视频| 国产一区二区三区四区三区四| 成年人在线看片| 亚欧精品在线| 亚洲成av人片一区二区三区| 亚洲影影院av| 在线观看91视频| 国产精品高潮久久久久无| 久久成人免费日本黄色| 国产大片一区| 免费无遮挡无码永久在线观看视频| 亚洲www在线| 日本网站在线观看一区二区三区| 中文字幕一区二区三区四区不卡| 亚洲福利视频一区二区| 国产一区二区视频在线观看| 国产电影一区二区在线观看| 日韩中文在线中文网三级| 亚洲黄色在线看| 欧美性xxxxxxxx| 国产成a人亚洲精品| 欧美天堂在线视频| 成全在线观看免费完整动漫| 国产欧美一级片| 2021av网站| 自拍av在线| 国外成人福利视频| 欧美99久久| 国产欧美丝祙| 国产精品成人在线观看| 欧美jiizzhd精品欧美| 国产精品亲子乱子伦xxxx裸| 26uuu国产在线精品一区二区| 无码一区二区三区在线| 精品三级久久久久久久电影聊斋| 欧美18—19性高清hd4k| 大菠萝精品导航| 亚洲精品成人区在线观看| 成年人视频免费| 国产欧美日本一区二区三区| 九九久久久久久久久激情| 午夜激情福利在线| 欧美精品一区二区久久久| 先锋资源av在线| 亚洲精品乱码电影在线观看| 日韩电影免费观看在| 免费看成人片| 91丨porny丨国产| 91蜜桃在线免费视频| 精精国产xxxx视频在线| 麻豆传媒在线播放| 精品视频站长推荐| 你懂的在线观看视频网站| 亚洲色图丝袜| 国产欧美综合一区| 国产精品久久不卡| 北条麻妃国产九九精品视频| 国产精品久久不卡| 国产天堂素人系列在线视频| 国内精品福利视频| 椎名由奈av一区二区三区| 国产鲁鲁视频在线观看免费| 亚洲在线www| 国产在线播精品第三| 亚洲欧美日韩综合一区| 国产精品免费视频一区二区三区| 日韩a级在线观看| 国产精品人人| 国产精品久久久久久久免费| 麻豆成人av在线| 亚洲综合在线播放| 青青草原网站在线观看| 日本一区二区三区视频在线观看| 国产亚洲亚洲国产一二区| 国产69精品久久| 欧美私模裸体表演在线观看| 日韩在线视频精品| 欧美成人二区| 国产亚洲自拍一区| 亚洲精品成人区在线观看| 国产精品果冻传媒潘| 久草在线看片| 国产黄色在线看| 亚洲码无人客一区二区三区| 亚洲日本在线天堂| 激情亚洲另类图片区小说区| 波多野结衣久久高清免费|