电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android實現雷達View效果的示例代碼

瀏覽:2日期:2022-09-23 15:44:57

樣式效果

還是先來看效果:

Android實現雷達View效果的示例代碼

Android實現雷達View效果的示例代碼

這是一個仿雷達掃描的效果,是之前在做地圖sdk接入時就想實現的效果,但之前由于趕著畢業設計,就沒有親手去實現,不過現在自己擼一個發現還是挺簡單的。

這里主要分享一下我的做法。

目錄

主體輪廓的實現(雷達的結構)

動畫的實現(雷達掃描的效果)

目標點的加入(圖片/點)

主體輪廓實現

Android實現雷達View效果的示例代碼

不難分析得出,這個View主要由外部的一個圓,中間的錨點圓以及扇形旋轉區域組成。而且每個部分理應由不同的Paint去繪制,以方便去定制各部分的樣式。

外部圓以及錨點圓的繪制較為簡單,主要的點還是要對整個View的寬高進行一定的限制,例如寬高必須相等且在某種模式下,取小的那個值來限定整個RadarView的最大值。那么該如何去控制呢?

onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)

由于我們繼承自View,在onMeasure方法中,我們可以根據兩個參數來獲取Mode,并且根據Mode來指定寬/高對應的值,再通過setMeasuredDimension去指定控件主體的寬高即可。

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) val vWidth = measureDimension(widthMeasureSpec) val vHeight = measureDimension(heightMeasureSpec) val size = min(vWidth, vHeight) setMeasuredDimension(size, size)} private fun measureDimension(spec: Int) = when (MeasureSpec.getMode(spec)) { MeasureSpec.EXACTLY -> { // exactly number or match_parent MeasureSpec.getSize(spec) } MeasureSpec.AT_MOST -> { // wrap_content min(mDefaultSize, MeasureSpec.getSize(spec)) } else -> { mDefaultSize }}

測量工作完成了,我們自然可以去繪制了。為了不讓中間的小圓看起來那么突兀(偏大或偏小),這里設置了一個scaleFactor的縮放因子,使其能根據外圓的尺寸來進行縮放。

override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) // draw outside circle (background) canvas?.drawCircle(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, measuredWidth.toFloat() / 2, mOutlinePaint) if (mBorderWidth > 0F && mOutlinePaint.shader == null) { drawBorder(canvas) } // mOutlineRect = Rect(0, 0, measuredWidth, measuredHeight) canvas?.drawArc(mOutlineRect.toRectF(), mStartAngle, mSweepAngle, true, mSweepPaint) // draw center circle // scaleFactor = 30F canvas?.drawCircle(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, measuredWidth.toFloat() / 2 / mScaleFactor, mPaint)} private fun drawBorder(canvas: Canvas?) { Log.i('RadarView', 'drawBorder') mOutlinePaint.style = Paint.Style.STROKE mOutlinePaint.color = mBorderColor mOutlinePaint.strokeWidth = mBorderWidth canvas?.drawCircle(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, (measuredWidth.toFloat() - mBorderWidth) / 2, mOutlinePaint) // 還原 mOutlinePaint.style = Paint.Style.FILL_AND_STROKE mOutlinePaint.color = mBackgroundColor}

繪制了基準圓以后,要實現雷達掃描時那種漸變的效果,我們可以通過SweepGradient來操作。通過指定中心點,漸變顏色,以及顏色的分布,來定制掃描漸變的樣式,默認的即時開頭時gif展示的那種。由于這里是從第一象限開始旋轉,因此將旋轉的起點通過matrix逆時針旋轉90度,從而達到由淺入深的效果。

private fun setShader(size: Int) { val shader = SweepGradient(size.toFloat() / 2, size.toFloat() / 2, mScanColors?: mDefaultScanColors, // 可通過setScanColors()來定制顏色 floatArrayOf(0F, 0.5F, 1F)) // 這里默認走平均分布 val matrix = Matrix() // 逆時針旋轉90度 matrix.setRotate(-90F, size.toFloat() / 2, size.toFloat() / 2) shader.setLocalMatrix(matrix) mSweepPaint.shader = shader}

這里完成了測量與繪制的工作,那么我們在布局里引用以后,就會看到這樣的效果:

Android實現雷達View效果的示例代碼

這時,由于我們之前在測量的時候,將寬高最小值作為繪制的基準大小給予了RadarView,因此measuredWidth和measuredHeight是相等的,但是由于在布局中指定了match_parent屬性,那么實際的控件寬高還是和父布局一致(在這里即占滿屏幕寬高,由于寬比高小,所以看到繪制的圖形會偏向上方;如果設置了高比寬小,那么繪制的圖形就會位于左側)。一般的雷達控件應該都是居中顯示的,所以我在這里也重寫了onLayout方法,來實現居中的效果。

override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { // 設置默認居中 var l = left var r = right var t = top var b = bottom when { width > height -> { // 寬度比高度大 那么要設置默認居中就得把left往右移 right往左移 l = (width - measuredWidth) / 2 r = width - l layout(l, t, r, b) } height > width -> { // 高度比寬度大 那么要設置默認居中就得把top往下移 bottom往上移 t = (height - measuredHeight) / 2 b = height - t layout(l, t, r, b) } else -> super.onLayout(changed, left, top, right, bottom) }}

動畫的實現

完成了繪制,接下來就是思考該如何讓他動起來了。由繪制的代碼不難想到,我這里考慮的是通過mStartAngle的變化來控制繪制的角度旋轉,而ValueAnimator則正好能獲取到每次更新時value的值,因此這里我選用了這個方案。

fun start() { Log.i('RadarView', 'animation start') mIsAnimating = true mAnimator.duration = 2000 mAnimator.repeatCount = ValueAnimator.INFINITE mAnimator.addUpdateListener { val angle = it.animatedValue as Float mStartAngle = angle // Log.i('RadarView', 'mStartAngle = $mStartAngle and curValue = ${it.animatedValue}') postInvalidate() } mAnimator.start()}

這里就需要注意一個點,就是canvas在繪制時,后繪制的會覆蓋在前繪制的圖像上,所以需要注意繪制的順序。當然,這里也可以把mOutlineRect的寬高設置為measuredWidth - mBorderWidth,那么就能保證繪制填充角度時,不會把邊界覆蓋。

至此,動畫的效果便完成了。

目標點的加入

首先,前兩點已經能滿足大多的雷達掃描需求了。這里這個添加目標點(target)純粹是我自己想加入的功能,因為覺得可以結合地圖sdk的MapView來共同使用,目前也只是開發階段,擴展性可能考慮得還不是特別充足,也還沒應用到具體項目中。但是,總覺得自己想的功能也該試著去實踐一下~

這里主要運用的圓的計算公式:

Android實現雷達View效果的示例代碼

由于Android的坐標系的原點是在左上角,y軸過頂點向下延伸。由我們的繪制可知,此繪制圖像在坐標系中的位置大概如下圖所示:

Android實現雷達View效果的示例代碼

那么,對應的公式就為:

Android實現雷達View效果的示例代碼

要注意的是,這里r的計算會根據圖/點的設置來動態計算,具體例子通過代碼來進行分析。

// 隨機落點fun addTarget(size: Int, type: TYPE = TYPE.RANDOM) { val list = ArrayList<PointF>() val r = measuredWidth.toFloat() / 2 val innerRect = Rect((r - r / mScaleFactor).toInt(), (r - r / mScaleFactor).toInt(), (r + r / mScaleFactor).toInt(), (r + r / mScaleFactor).toInt()) // 圓的中心點 val circle = PointF(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2) while (list.size < size) { val ranX = Random.nextDouble(0.0, r * 2.0).toFloat() val ranY = Random.nextDouble(0.0, r * 2.0).toFloat() val ranPointF = PointF(ranX, ranY) if (innerRect.contains(ranPointF.toPoint())) { continue } // 圓公式 if (!mNeedBitmap && (ranX - circle.x).pow(2) + (ranY - circle.y).pow(2) < (r - mTargetRadius - mBorderWidth).toDouble().pow(2.0)) { // 普通點 addTargetFromType(type, list, ranX, ranY, r, ranPointF) } else if (mNeedBitmap && (ranX - circle.x).pow(2) + (ranY - circle.y).pow(2) < (r - mBorderWidth - max(mBitmap.width, mBitmap.height) / 2).toDouble().pow(2)) { // 圖 addTargetFromType(type, list, ranX, ranY, r, ranPointF) } else { continue } } mTargetList = list for (target in list) { Log.i('RadarView', 'target = [${target.x}, ${target.y}]') } invalidate()}

可以看到,當target為普通點時,r的計算還要減去targetRadius,即目標點的半徑,同時還要減去邊界的寬度,如圖所示:

Android實現雷達View效果的示例代碼

當target為圖時,由于寬高不定,故除了邊界外,還要減去大的邊,那么r的計算則為:

Android實現雷達View效果的示例代碼

同時為了避免圖片的尺寸過大,這里同樣采取了一個默認值與一個縮放因子,從而保證圖的完整性以及避免過大而引起的視覺丑化。

關于落點的位置,目前采取的是隨機落點,如果應用到地圖掃點的話,可以通過地圖sdk內的距離計算工具再與RadarView的坐標做一個比例轉換,從而達到雷達內顯示該點具體方位。

關于落點的分布,目前提供了5種類型:分別是全象限隨機、第一象限、第二象限、第三象限與第四象限隨機。

Github

若須直接調用,可移步至 https://github.com/CarsonWoo/RadarView

完整代碼

class RadarView : View { enum class TYPE { RANDOM, FIRST, SECOND, THIRD, FOURTH } private val mPaint by lazy { Paint(Paint.ANTI_ALIAS_FLAG) } private val mSweepPaint by lazy { Paint(Paint.ANTI_ALIAS_FLAG) } private val mOutlinePaint by lazy { Paint(Paint.ANTI_ALIAS_FLAG) } private val mTargetPaint by lazy { Paint(Paint.ANTI_ALIAS_FLAG) } private val mDefaultSize = 120// px // limit the size of bitmap private var mBitmapMaxSize = 0F private var mBitmapWHRatio = 0F private val mScaleFactor = 30F private var mStartAngle = 0F private val mSweepAngle = -60F private var mScanColors: IntArray? = null private val mDefaultScanColors = intArrayOf(Color.parseColor('#0F7F7F7F'), Color.parseColor('#7F7F7F7F'), Color.parseColor('#857F7F7F')) private val mDefaultBackgroundColor = Color.WHITE private var mBackgroundColor: Int = mDefaultBackgroundColor private var mBorderColor: Int = Color.BLACK private var mBorderWidth = 0F private var mTargetColor: Int = Color.RED private var mTargetRadius = 10F private lateinit var mOutlineRect: Rect private val mAnimator = ValueAnimator.ofFloat(0F, 360F) private var mTargetList: ArrayList<PointF>? = null private var mIsAnimating = false private var mNeedBitmap = false private var mBitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) constructor(context: Context): this(context, null) constructor(context: Context, attributeSet: AttributeSet?) : super(context, attributeSet) init { mPaint.color = Color.GRAY mPaint.strokeWidth = 10F mPaint.style = Paint.Style.FILL_AND_STROKE mPaint.strokeJoin = Paint.Join.ROUND mPaint.strokeCap = Paint.Cap.ROUND mSweepPaint.style = Paint.Style.FILL mOutlinePaint.style = Paint.Style.FILL_AND_STROKE mOutlinePaint.color = mBackgroundColor mTargetPaint.style = Paint.Style.FILL mTargetPaint.color = mTargetColor mTargetPaint.strokeWidth = 10F } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) val vWidth = measureDimension(widthMeasureSpec) val vHeight = measureDimension(heightMeasureSpec) val size = min(vWidth, vHeight) setShader(size) setMeasuredDimension(size, size) setParamUpdate() } override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { // 設置默認居中 var l = left var r = right var t = top var b = bottom when { width > height -> { // 寬度比高度大 那么要設置默認居中就得把left往右移 right往左移 l = (width - measuredWidth) / 2 r = width - l layout(l, t, r, b) } height > width -> { // 高度比寬度大 那么要設置默認居中就得把top往下移 bottom往上移 t = (height - measuredHeight) / 2 b = height - t layout(l, t, r, b) } else -> super.onLayout(changed, left, top, right, bottom) } } private fun setShader(size: Int) { val shader = SweepGradient(size.toFloat() / 2, size.toFloat() / 2, mScanColors?: mDefaultScanColors, floatArrayOf(0F, 0.5F, 1F)) val matrix = Matrix() matrix.setRotate(-90F, size.toFloat() / 2, size.toFloat() / 2) shader.setLocalMatrix(matrix) mSweepPaint.shader = shader } fun setScanColors(colors: IntArray) { this.mScanColors = colors setShader(measuredWidth) invalidate() } fun setRadarColor(@ColorInt color: Int) { this.mBackgroundColor = color this.mOutlinePaint.color = color invalidate() } fun setRadarColor(colorString: String) { if (!colorString.startsWith('#') || colorString.length != 7 || colorString.length != 9) { Log.e('RadarView', 'colorString parse error, please check your enter param') return } val color = Color.parseColor(colorString) setRadarColor(color) } fun setBorderColor(@ColorInt color: Int) { this.mBorderColor = color invalidate() } fun setBorderColor(colorString: String) { if (!colorString.startsWith('#') || colorString.length != 7 || colorString.length != 9) { Log.e('RadarView', 'colorString parse error, please check your enter param') return } val color = Color.parseColor(colorString) setBorderColor(color) } fun setRadarGradientColor(colors: IntArray) { val shader = SweepGradient(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, colors, null) mOutlinePaint.shader = shader invalidate() } fun setBorderWidth(width: Float) { this.mBorderWidth = width invalidate() } private fun setParamUpdate() { mOutlineRect = Rect(0, 0, measuredWidth, measuredHeight) mBitmapMaxSize = measuredWidth.toFloat() / mScaleFactor } private fun measureDimension(spec: Int) = when (MeasureSpec.getMode(spec)) { MeasureSpec.EXACTLY -> { // exactly number or match_parent MeasureSpec.getSize(spec) } MeasureSpec.AT_MOST -> { // wrap_content min(mDefaultSize, MeasureSpec.getSize(spec)) } else -> { mDefaultSize } } override fun setBackground(background: Drawable?) { // 取消傳統背景設置// super.setBackground(background) } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) // draw outside circle (background) canvas?.drawCircle(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, measuredWidth.toFloat() / 2, mOutlinePaint) if (mBorderWidth > 0F && mOutlinePaint.shader == null) { drawBorder(canvas) } canvas?.drawArc(mOutlineRect.toRectF(), mStartAngle, mSweepAngle, true, mSweepPaint) if (!mTargetList.isNullOrEmpty() && !mIsAnimating) { drawTarget(canvas) } // draw center circle canvas?.drawCircle(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, measuredWidth.toFloat() / 2 / mScaleFactor, mPaint) } private fun drawBorder(canvas: Canvas?) { Log.i('RadarView', 'drawBorder') mOutlinePaint.style = Paint.Style.STROKE mOutlinePaint.color = mBorderColor mOutlinePaint.strokeWidth = mBorderWidth canvas?.drawCircle(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, (measuredWidth.toFloat() - mBorderWidth) / 2, mOutlinePaint) // 還原 mOutlinePaint.style = Paint.Style.FILL_AND_STROKE mOutlinePaint.color = mBackgroundColor } private fun drawTarget(canvas: Canvas?) { mTargetList?.let { Log.e('RadarView', 'draw target') for (target in it) { if (mNeedBitmap) { canvas?.drawBitmap(mBitmap, target.x - mBitmap.width / 2, target.y - mBitmap.height / 2, mTargetPaint) } else { canvas?.drawCircle(target.x, target.y, mTargetRadius, mTargetPaint) } } } } fun setBitmapEnabled(enabled: Boolean, drawable: Drawable) { // 這里是為了防止界面還未獲取到寬高時 會導致onMeasure走不到 那么maxSize就會為0 post { this.mNeedBitmap = enabled this.mBitmapWHRatio = drawable.intrinsicWidth.toFloat() / drawable.intrinsicHeight.toFloat() mBitmap = if (mBitmapWHRatio >= 1) { // 寬比高大 drawable.toBitmap( width = min(mBitmapMaxSize, drawable.intrinsicWidth.toFloat()).toInt(), height = (min(mBitmapMaxSize, drawable.intrinsicWidth.toFloat()) / mBitmapWHRatio).toInt(), config = Bitmap.Config.ARGB_8888) } else { // 高比寬大 drawable.toBitmap( height = min(mBitmapMaxSize, drawable.intrinsicHeight.toFloat()).toInt(), width = (min(mBitmapMaxSize, drawable.intrinsicHeight.toFloat()) * mBitmapWHRatio).toInt(), config = Bitmap.Config.ARGB_8888 ) } } } // 隨機落點 fun addTarget(size: Int, type: TYPE = TYPE.RANDOM) { val list = ArrayList<PointF>() val r = measuredWidth.toFloat() / 2 val innerRect = Rect((r - r / mScaleFactor).toInt(), (r - r / mScaleFactor).toInt(), (r + r / mScaleFactor).toInt(), (r + r / mScaleFactor).toInt()) // 圓的中心點 val circle = PointF(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2) while (list.size < size) { val ranX = Random.nextDouble(0.0, r * 2.0).toFloat() val ranY = Random.nextDouble(0.0, r * 2.0).toFloat() val ranPointF = PointF(ranX, ranY) if (innerRect.contains(ranPointF.toPoint())) { continue } // 圓公式 if (!mNeedBitmap && (ranX - circle.x).pow(2) + (ranY - circle.y).pow(2) < (r - mTargetRadius - mBorderWidth).toDouble().pow(2.0)) { // 在圓內 addTargetFromType(type, list, ranX, ranY, r, ranPointF) } else if (mNeedBitmap && (ranX - circle.x).pow(2) + (ranY - circle.y).pow(2) < (r - mBorderWidth - max(mBitmap.width, mBitmap.height) / 2).toDouble().pow(2)) { addTargetFromType(type, list, ranX, ranY, r, ranPointF) } else { continue } } mTargetList = list for (target in list) { Log.i('RadarView', 'target = [${target.x}, ${target.y}]') } invalidate() } private fun addTargetFromType(type: TYPE, list: ArrayList<PointF>, ranX: Float, ranY: Float, r: Float, ranPointF: PointF) { when (type) { TYPE.RANDOM -> { list.add(ranPointF) } TYPE.FOURTH -> { if (ranX in r.toDouble()..2 * r.toDouble() && ranY in r.toDouble()..2 * r.toDouble()) { list.add(ranPointF) } } TYPE.THIRD -> { if (ranX in 0.0..r.toDouble() && ranY in r.toDouble()..2 * r.toDouble()) { list.add(ranPointF) } } TYPE.SECOND -> { if (ranX in 0.0..r.toDouble() && ranY in 0.0..r.toDouble()) { list.add(ranPointF) } } TYPE.FIRST -> { if (ranX in r.toDouble()..2 * r.toDouble() && ranY in 0.0..r.toDouble()) { list.add(ranPointF) } } } } fun start() { Log.i('RadarView', 'animation start') mIsAnimating = true mAnimator.duration = 2000 mAnimator.repeatCount = ValueAnimator.INFINITE mAnimator.addUpdateListener { val angle = it.animatedValue as Float mStartAngle = angle Log.i('RadarView', 'mStartAngle = $mStartAngle and curValue = ${it.animatedValue}') postInvalidate() } mAnimator.start() } fun start(startVal: Float, endVal: Float) { mIsAnimating = true mAnimator.setFloatValues(startVal, endVal) mAnimator.duration = 2000 mAnimator.repeatCount = ValueAnimator.INFINITE mAnimator.addUpdateListener { mStartAngle = it.animatedValue as Float Log.i('RadarView', 'mStartAngle = $mStartAngle and curValue = ${it.animatedValue}') postInvalidate() } mAnimator.start() } fun stop() { mIsAnimating = false if (mAnimator.isRunning) { mAnimator.cancel() mAnimator.removeAllListeners() } mStartAngle = 0F } }

調用方式

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) radar_view.setBorderWidth(5F) radar_view.setRadarColor(Color.TRANSPARENT) radar_view.setBitmapEnabled(true, resources.getDrawable(R.mipmap.ic_launcher_round))// radar_view.setScanColors(intArrayOf(Color.RED, Color.LTGRAY, Color.CYAN))// radar_view.setRadarGradientColor(intArrayOf(Color.RED, Color.GREEN, Color.BLUE)) btn_start.setOnClickListener { radar_view.start()// workThreadAndCallback() } btn_stop.setOnClickListener { radar_view.stop() radar_view.addTarget(7) }}

總結

到此這篇關于Android實現雷達View效果的文章就介紹到這了,更多相關android 雷達View效果內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 国产女主播喷水 | 亚洲欧美乱日韩乱国产 | 99久久久国产精品免费蜜臀 | 国产露脸精品国产沙发 | 日本高清xxxxxxxxxx | 日本99热| 久久精品无码一区二区日韩av | 亚洲日韩中文第一精品 | 一道本无吗一区 | 中国妞xxxhd露脸偷拍视频 | 欧美一区1区三区3区公司 | 日日夜夜添 | 区一区二区三区中文字幕 | 亚洲男人av香蕉爽爽爽爽 | 精品国产一区二区三区忘忧草 | 国产午夜手机精彩视频 | 成人一级影视 | 亚洲欧美bt | 欧美数码高清视频 | 天海翼一二三区 | 九九九久久久 | 国产另类综合 | 国产两女互慰高潮视频在线观看 | 日韩精品av久久有码一区浪潮 | 中国极品少妇xxxxⅹ喷水 | 黄色三级网站 | 福利在线免费观看 | 播放灌醉水嫩大学生国内精品 | 久久久久一 | 亚洲日韩第一页 | 欧美激情首页 | 精品久久久久久无码专区 | 黄色aa一级片 | 欧美日韩亚洲国产综合 | 久久精品中文騷妇女内射 | 冲田杏梨mide233在线播放 | 九九热精品在线 | wwwcom捏胸挤出奶 | 亚洲a在线播放 | 天海翼一区二区三区高清在线观看 | 深夜影院在线观看 | 一本色道久久爱88av | 国产成人无码一二三区视频 | 欧美亚洲网站 | 先锋av资源在线 | 亚洲aⅴ精品一区二区三区91 | 岛国av一区二区 | 日本一二三区在线 | 五月婷婷丁香 | 亚精区在二线三线区别99 | 91亚洲一区 | 一卡二卡三卡在线观看 | 久久99国产精品 | 国产精品久久免费视频 | 在线永久免费观看黄网站 | 日韩一区二区三区精品视频 | 亚洲国产果冻传媒av在线观看 | 久久久国产精品无码免费专区 | 996热re视频精品视频这里 | 国产成人久久av免费看 | 亚洲男人的天堂网 | 正在播放大战肉丝少妇 | 五月婷婷综合激情网 | 国产精品亚洲精品一区二区三区 | 国产乱色国产精品播放视频 | 日韩久久影视 | 亚洲中文字幕在线观看 | 久久99视频精品 | 日韩成人高清 | 精品国产一区二区三区性色av | 99这里只有精品 | 国产黄色免费大片 | 中文字幕avav | 国产精品av99| 丝袜一区二区三区 | 亚洲国产精品无码久久久久高潮 | 污版视频在线观看 | 天堂视频免费在线观看 | 亚洲欧美日韩成人一区 | 毛片在线免费观看网站 | 日本猛少妇色xxxxx猛叫 | 免费黄网在线观看 | 国产一级淫片免费放大片 | 久久精品丝袜 | 天堂аⅴ在线地址8 | 国产欧美一区二区三区免费视频 | 真人一毛片 | 欧美久久久久久久高潮 | 中文字幕午夜 | 午夜免费看视频 | 亚洲在线中文字幕 | 波多野结衣av一区二区三区中文 | 婷婷在线看 | 亚洲国产婷婷六月丁香 | 色一欲一性一乱—区二区三区 | 亚洲熟妇av一区二区三区浪潮 | 在线观看免费黄色 | 日韩av动漫 | 日韩一本之道一区中文字幕 | 日本三级吹潮 | 91人人揉日日捏人人看 | 2018av天堂在线视频精品观看 | 国产精品香蕉在线的人 | 天天狠天天操 | 关之琳三级做爰 | 一本到免费视频 | 免费观看亚洲视频 | 公妇乱淫太舒服了 | 成人性生交视频免费看 | 午夜激情啪啪 | 欧美色xxx| 国产精品丝袜久久久久久不卡 | 妖精视频一区二区 | 成人做爰69片免费观看 | 蜜桃传媒av免费观看麻豆 | 亚洲成色www久久网站 | 超碰97成人 | 天堂无人区乱码一区二区三区介绍 | 中文字幕亚洲无线码在线一区 | 久久h | 亚洲欧美日韩另类 | 国产成人免费一区二区三区 | 久久精品蜜桃 | 国产无玛 | 揄拍成人国产精品视频99 | 毛多水多www偷窥小便 | 久久久爽爽爽美女图片 | 女人被爽到呻吟gif动态图视看 | 97国产情侣爱久久免费观看 | 欧美一区三区 | 成人免费在线视频网站 | 久久精品水蜜桃av综合天堂 | 内射老妇bbwx0c0ck | 蜜桃一本色道久久综合亚洲精品冫 | 无码人妻精品一区二区三区66 | 亚洲欧美自拍偷拍视频 | 亚洲最大福利视频网 | 公妇乱淫3 | 亚洲综合激情五月丁香六月 | 精品人妻少妇一区二区三区 | 性猛交xxxxx按摩中国 | 91久久国产婷婷一区二区 | 99精品欧美一区二区三区综合在线 | 亚洲精品乱码久久久久久久久久久久 | 交h粗暴调教91 | 成人黄色a级片 | 兔费看少妇性l交大片免费 脱裤吧av导航 | 国产成人在线免费 | 深夜视频在线观看免费 | 久久久久久久国产精品 | 成人51免费 | 精品少妇v888av | 97国产精品久久久 | 艳妇臀荡乳欲伦交换在线播放 | 毛片女人18片毛片点击进入 | 无码国内精品人妻少妇蜜桃视频 | 91视频区| 邻居少妇张开双腿让我爽一夜 | 少妇无码一区二区二三区 | 亚洲 小说区 图片区 都市 | 亚洲ww中文在线 | 香港三日三级少妇三级99 | 未满十八18禁止免费无码网站 | 97国产成人| 欧美人与禽zozzo禽性配 | 久久精品日产第一区二区三区在哪里 | 亚洲第一天堂无码专区 | 91精品婷婷国产综合久久竹菊 | 制服 丝袜 激情 欧洲 亚洲 | 亚洲女人天堂 | 欧美夜夜夜 | 日欧一片内射va在线影院 | 亚洲国产一区二区天堂 | 成人颜色网站 | 亚洲精品在线免费 | 日韩va在线观看 | 亚洲精品国产精品乱码视色 | 美女国产精品 | 亚洲 精品 综合 精品 自拍 | 久久艹逼视频 | 亚洲第一av在线 | 在线不卡中文字幕 | 久久这里只有精品首页 | 国色天香社区在线视频 | 丰满少妇xbxb毛片日本视频 | 久青草国产在视频在线观看 | 亚洲欧美日韩中文无线码 | 中文字幕在线精品中文字幕导入 | 亚洲不卡在线视频 | 美女视频黄a视频免费全程软件axs | 91精品国产黑色瑜伽裤 | 日日摸日日碰人妻无码 | 日韩色片在线 | 日韩av在线播放观看 | 国产精品人妻熟女毛片av | 久久亚洲精品国产一区 | 91精品啪在线观看国产老湿机 | 国模无码一区二区三区 | 欧美毛片视频 | 韩国av在线免费观看 | 日日噜噜夜夜狠狠久久av小说 | caopeng视频 | 国产cd人妖ts在线观看 | 91在线精品观看 | 欧美婷婷 | av成人亚洲 | 久久久91视频 | 特级做a爰片毛片免费看无码 | 日韩激情综合 | 精品人伦一区二区三区蜜桃视频 | 久久99精品国产麻豆婷婷洗澡 | 成人在线日韩 | 成人午夜大片 | 成人在线手机视频 | 揉捏奶头高潮呻吟视频 | 亚洲人成电影网站色 | www夜色| 一区二区精品国产 | 久久婷婷色综合一区二区 | 国产精品va在线播放 | 久久久夜 | 日韩av资源网 | 国产五月婷婷 | 桃色视频.m3u8 | 天天躁夜夜躁av天天爽 | 最近高清中文字幕免费 | 老子影院午夜伦不卡 | 国产成人综合色在线观看网站 | 无码中文人妻在线一区二区三区 | 青青青国内视频在线观看软件 | 欧美做受 | 婷婷综合少妇啪啪喷水动态小说 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲另类春色 | 一区二区三区欧美在线 | 泰国三级av| 欧美色综合网站 | 探花视频免费观看高清视频 | 国产一区导航 | 亚洲精品乱码久久久久久久久久 | 亚洲中字幕日产av片在线 | 成人黄色免费在线观看 | 青青青青青草 | 精品无码av无码专区 | 国产sm鞭打折磨调教视频 | 亚洲哺乳偷拍哺乳偷拍 | 成人男女啪啪免费观软件 | 亚洲国产中文字幕 | 精品无码国产一区二区三区av | 一区二区国产精品精华液 | 国产伦精品一区二区三区视频黑人 | 国产精品久久久久久久av福利 | 欧美三p| 99久久99久久精品免费看蜜桃 | 小舞同人18吸乳羞羞在线观看 | 亚洲伦理视频 | 国产精品情侣 | 国产婷婷色一区二区三区四区 | 国产精品国产三级国产普通话三级 | 97高清国语自产拍 | 久久久久久久美女 | 国产精品一区二区人人爽 | 极品毛片 | 国产精品视频久久久久久 | 毛片a片免费观看 | 国产又粗又猛又爽又黄的视频文字 | 国产特黄aaaaa毛片 | 尤物精品视频 | 国产毛片乡下农村妇女bd | 床戏高潮呻吟声片段 | 国产人澡人澡澡澡人碰视频 | 中国av片 | 动漫美女放屁 | 国产精品久久久久久妇女6080 | 麻豆av福利av久久av | 亚洲综合婷婷 | 国产精品久久久久久久久果冻传媒 | 国产视频手机在线观看 | 日躁夜躁狠狠躁2020 | 色屁屁www影院免费观看入口 | 成人天堂网 | www.狠狠插 | 国产真实交换夫妇视频 | 欧美成人免费全部 | 国产在线国偷精品免费看 | 在线看成人 | 韩国三级在线 | 老熟妻内射精品一区 | 草草影视在线观看 | 亚洲aⅴ精品一区二区三区91 | 佐佐木希av一区二区三区 | 国产婷婷色综合av蜜臀av | 国产丝袜无码一区二区三区视频 | 日本高清www免费视频大豆 | xxxxx黄色片 xxxxx毛片 | 丰满少妇高潮惨叫久久久一 | pt美日韩欧pt网 | 秋霞影院午夜老牛影院 | 日本一二三不卡 | 亚洲狠狠 | 波多野结衣一区二区三区高清 | 69精品国产| 亚洲第一夜页 | 国产真实的和子乱拍在线观看 | 丰满人妻熟妇乱又伦精品视 | 欧美色老头又长又大 | 中文字幕不卡在线 | 精品综合在线 | 欧美在线brazzers免费视频 | 内射老妇bbwx0c0ck | 欧美在线性| 69精品久久久久久久 | 四虎国产成人精品免费一女五男 | 女主和前任各种做高h | 91超碰人人| 乱子伦一区二区三区 | 无码人妻aⅴ一区二区三区69岛 | 国产黄大片在线观看 | 99久久无码一区人妻a黑 | 国产91精品激烈高潮白浆 | 大地资源在线观看官网第三页 | 青青青看免费视频在线 | brazzers欧美大波霸 | 欧美激情猛片xxxⅹ大3 | 福利一区二区在线 | 久久久久久久成人 | 色偷偷偷久久伊人大杳蕉 | 国内精品久久久久久久久久清纯 | 香蕉视频在线播放 | 中文字幕一区二区三区四区五区 | 中文字幕av无码一区二区三区电影 | 精品国产大片 | 国产精品18 | 日产91精品卡2卡三卡四 | 福利一区在线观看 | 国产人妻精品一区二区三区 | 国产亚洲精久久久久久蜜臀 | 中国少妇xxxxxbbbbb | 高清国产午夜精品久久久久久 | 亚洲色图另类 | 国产免国产免费 | 国产野外作爱视频播放 | av小四郎最新地址入口 | 国产精品亚洲精品一区二区三区 | 91欧美一区二区三区 | 国产96视频 | 好爽好黄的视频 | 国产成人8x视频一区二区 | 国产激情无码一区二区app | 国产在线区 | 婷婷伊人综合中文字幕 | 中文字幕av专区dvd | 亚洲国产精品久久人人爱潘金莲 | 欧美精品v国产精品 | 欧美午夜片欧美片在线观看 | 国产精品亚洲色婷婷99久久精品 | 日韩一区二区中文字幕 | 日本 欧美 制服 中文 国产 | 亚洲久热无码av中文字幕 | 自拍在线视频 | 黄色链接视频 | 青青成人| 99久久久久成人国产免费 | 国产精品丝袜久久久久久消防器材 | 少妇精品蜜桃偷拍高潮系列 | 一二三四区无产乱码1000集 | 福利一区二区在线观看 | 性欧美激情 | 男人用嘴添女人私密视频 | 日韩欧美中文字幕一区二区 | 国产欧美日韩综合 | 成人性生生活性生交免费 | 久草网站| 一本一本久久a久久精品综合 | 91欧美亚洲 | 成人免费视频一区二区 | 羞羞视频日本 | 国产超碰自拍 | 午夜精品久久99蜜桃的功能介绍 | 欧美性生活视频免费看 | 哈利波特3在线观看免费版英文版 | 亚洲天堂网在线播放 | 精品久久网站 | 久久精品女人 | 亚洲www天堂com | 性做久久久久久久久 | 在线精品视频一区二区 | 毛片网站免费观看 | 久久99精品久久久久久青青日本 | 欧美极品xxxxx | 久草在线视频福利资源站 | 国产a国产片国产 | 日韩欧美一区二区三区久久婷婷 | 亚洲精品国产a | 国产精品久久久久久久久久久久人四虎 | 日韩精品999 | 日韩视频a| 国产小仙女精品av揉 | 日日干视频| 欧美日本国产va高清cabal | 色一情一乱一伦一区二区三区 | 久久激情综合网 | 少妇精品一区二区三区在线观看 | 久久伊人精品一区二区三区 | 国产无套粉嫩白浆内谢在线 | 色呦呦免费视频 | 成人拍拍拍 | 日本熟妇大屁股人妻 | 色黄啪啪网 | 男人的天堂毛片 | 蜜臀久久99精品久久一区二区 | 亚洲国产欧美国产综合一区 | 亚洲午夜精品毛片成人播放器 | а天堂中文最新一区二区三区 | 人妻熟女一二三区夜夜爱 | 亚洲成人中文 | 色综合成人 | 久久亚洲精品中文字幕 | 国产一级18片视频 | 天天操网 | 欧美性受xxxx黑人xyx性爽 | 91麻豆精品国产自产在线观看一区 | 99热精品免费 | 国产av新搬来的白领女邻居 | 性xxxx欧美老妇506070 | 色综合 图片区 小说区 | 国产成人精品久久久 | 98在线视频| 三浦惠理子aⅴ一二三区 | 3d动漫精品啪啪一区二区下载 | 久久久久成人精品无码 | 国产对白精品刺激二区国语 | 中文字幕永久在线 | 久久性生活视频 | 国产亚洲无 | 大波大乳videos巨大 | 激情小说一区 | 污片免费网站 | 成人免费观看视频网站 | 成 人 免费 黄 色 视频 | 免费在线播放av | 一本大道在线一本久道视频 | 97se亚洲国产综合自在线 | 日本一级大毛片a一 | 久久久久久婷 | 婷婷网色偷偷久久久99超碰 | 久草青青| 国产男小鲜肉同志免费 | 92看看福利1000集合集免费 | 辟里啪啦国语版免费观看 | 国产精品日韩一区二区三区 | 亚洲涩涩爱 | 亚洲天天在线 | 天天久| 国产内射爽爽大片 | 久久丫精品久久丫 | 最近的中文字幕在线看视频 | 国产麻豆md传媒视频 | 欧美激情黑人 | wwwav在线视频| 国产精品久久久一区二区三区 | 国产熟女一区二区三区四区五区 | 精品国产乱码久久久久久1区二区 | 少妇无码av无码一区 | 美女做爰久久久久久 | 狠狠操欧美 | 男女爽爽 | 黄色片一级毛片 | 色窝窝无码一区二区三区成人网站 | 黄色片在线视频 | 红花成人网 | 在线观看污污网站 | 亚洲成人av免费 | 99精品国产九九国产精品 | 久久久蜜桃 | 日本xxxx18 | 香港经典a毛片免费观看播放 | 亚洲国产91 | 色婷婷香蕉在线一区二区 | 最新国产在线视频 | 国产精品99久久99久久久动漫 | 免费成人欧美 | 久久无码av中文出轨人妻 | 一级做a爱片性色毛片高清 一级做a毛片 | 国产偷国产偷亚洲高清人 | 国产亚洲成人精品 | 九九九九免费视频 | 黄色大片av| 亚洲综合不卡 | 亚洲精品成a人ⅴ香蕉片 | 国产女人和拘做受视频免费 | 久久天天躁夜夜躁狠狠85麻豆 | 亚洲精品欧美激情 | 国产成人精品日本亚洲 | juliaann战黑人 | 天天弄天天模 | 97精品伊人久久久大香线蕉 | 精品综合 | 国产色视频一区二区三区 | 久久久久久久综合 | 和寂寞少妇做爰bd | 国产精品久久久区三区天天噜 | 熟女精品视频一区二区三区 | 中文在线√天堂 | 中文字幕1区2区 | 最新国产在线视频 | 久久永久免费视频 | 日韩精品乱码 | 亚洲无av码一区二区三区 | 女同av国产亚洲片bbb及 | 男人天堂新 | 另类综合网 | 在线观看免费人成视频色9 在线观看的网站 | 免费成人在线观看视频 | 亚洲精品无码久久久 | 国产人与禽zoz0性伦 | 国内精品久久久久影院男同志 | 日韩理论视频 | 日韩av中文字幕在线免费观看 | 中国一级大黄大黄大色毛片 | 亚洲一级片在线播放 | 亚洲熟妇无码一区二区三区 | 国产欧美一区二区精品97 | 7777欧美日激情日韩精品 | 欧美三级在线播放 | 完全免费在线视频 | 欧美日韩国产在线一区 | jazzjazz国产精品久久 | 久久久亚洲最大ⅹxxx | 国产男女在线观看 | 一本久久综合亚洲鲁鲁五月天 | 美女赤身免费网站 | 欧美成人精品在线 | 潮喷无码正在播放 | 日本美女久久久 | 久久露脸 | 少妇淫交裸体视频 | 噜噜噜视频在线观看 | 99精品无人区乱码1区2区3区 | 美女又黄又免费的视频 | 伊人五月天婷婷 | 美女av一区二区三区 | 欧美国产不卡 | 久久久久久三级 | 成人午夜小视频 | 亚洲欧洲日产国码无码久久99 | 五月婷婷丁香综合 | 大陆一级黄色片 | 久久人妻天天av | 一区在线观看 | 国产一区二区三区免费观看潘金莲 | 日韩a级大片| 神马久久网站 | 日韩成人午夜 | 在线观看免费毛片 | 少妇裸交aa大片 | 在线视频成人 | 亚洲一级伦理 | 欧洲男女做爰免费视频 | 青草视频网 | 看片在线 | 国产高清一区二区 | 四虎影院色 | 欧美播放 | 日韩高清在线中文字带字幕 | 大尺度裸体日韩羞羞xxx | 来吧亚洲综合网 | av综合网男人的天堂 | 丁香六月婷婷 | 久久中文字幕网 | 久久成人人人人精品欧 | 久久久久久久久久久国产精品 | 欧美三日本三级少妇三99 | 欧洲美女黑人粗性暴交视频 | 欧美在线 | 亚洲 | 亚洲精品一区二区三区影院忠贞 | jizz俄罗斯 | 91丨九色丨蝌蚪丨老板 | 欧美一线视频 | 国产二级一片内射视频播放 | 亚洲精品亚洲人成人网 | 免费在线黄网 | 成人性视频免费网站 | 国产女人在线观看 | 在线播放无码后入内射少妇 | 女高中生自慰污污网站 | 精品在线观看免费 | 国产传媒一区 | 欧美大肥婆大肥bbbbb | 五月婷婷丁香花 | 国精产品一区一区三区视频 | 国产一区二区三区免费观看潘金莲 | 九色网站在线观看 | 少妇一区二区视频 | 久久视频免费观看 | 羞羞视频靠逼视频大全 | 久久精品成人一区二区三区 | 免费看欧美一级片 | 九九天堂网 | 国产精品爽爽久久久久久 | 女人色极品影院 | 国产精品3区 | 成人免费黄色 | 999久久久精品视频 999久久久久 | 精品视频在线免费 | 91成人免费在线视频 | 亚洲国产精品一区二区久久hs | 国产乱淫av免费 | 奶罩不戴乳罩邻居hd播放 | 妺妺窝人体色www婷婷 | 91在线视频免费播放 | 制服丝袜在线看 | 国产 浪潮av性色四虎 | 猫咪www免费人成网站 | 中文字幕一区二区三区波野结 |