久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

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

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
相關文章:
主站蜘蛛池模板: 日韩视频一区二区 | 日韩欧美在线中文字幕 | 亚洲男人的天堂在线 | 免费看的毛片 | 一级毛片免费看 | www.亚洲 | 亚洲一区二区精品在线观看 | 一二三精品区 | 日韩1区 | 欧美精产国品一二三区 | av看片网| 国产精品国产三级国产aⅴ原创 | 精品国产乱码一区二区三区四区 | 91在线精品视频 | 国产福利片在线观看 | 国产免费高清 | 日日操夜夜操天天操 | 国产区在线 | 亚洲福利一区 | 91影院在线观看 | 日韩在线免费视频 | 国产在线激情 | 欧美日韩国产精品 | 免费观看国产视频在线 | 亚洲一区二区三区四区五区中文 | 国产精品久久久久久久久久久久久久久久 | 国产人免费人成免费视频 | 成人在线 | 亚洲精品在| 日韩欧美一区二区在线观看 | 国产久 | 国产91视频一区二区 | 中文字幕在线看第二 | 日韩av在线中文字幕 | 欧美日韩国产一区二区三区 | 欧美日韩精品一区二区在线观看 | 精品一区二区三区在线视频 | 奇米成人 | 久久久精品一区二区三区 | 日韩av一区二区三区在线观看 | 午夜精品视频在线观看 | 在线小视频 | 日日射天天干 | 日韩久久久久 | 中文字幕免费观看 | 蜜桃精品久久久久久久免费影院 | 欧美精产国品一二三区 | 精品国产一区二区三区久久久久久 | 国产色网站 | 97人人看| 成人福利av | 欧美日韩国产在线播放 | 久久av黄色 | 免费在线看a | 黄色成人在线 | 91精品国产91久久久久久久久久久久 | 91久久国产综合久久91精品网站 | 综合色久 | 狠狠av| 日韩一二三区 | 一区二区三区四区在线 | 欧美视频第一页 | 国产在线一区二区三区 | 亚洲特级| 在线精品国产一区二区三区 | 最新黄色网址在线播放 | 伊人网站 | 亚洲一区二区三区视频 | 久久久久久91香蕉国产 | 成人欧美一区二区三区黑人孕妇 | 日本久久网 | 久久久久国产精品 | 91视频免费在线看 | 久久国产精品99精国产 | 在线电影亚洲 | 99久久久无码国产精品 | 亚洲一区二区 | 国产成人一区二区三区 | 黄色视频a级毛片 | 精品国产欧美 | 一本大道久久a久久精二百 国产精品片aa在线观看 | 亚洲日韩欧美一区二区在线 | 国产一区二区三区免费 | 亚洲国产成人精品女人久久久 | 亚洲一区二区在线 | 99精品视频在线观看 | 日韩成人在线播放 | 日韩欧美一级 | 亚洲午夜av| 成人一级片 | 国产乱码精品一区二区三区av | 精品在线视频一区 | 久久久综合色 | 天天干夜夜弄 | 国产二区视频 | 日韩精品一二三区 | 日韩精品在线免费 | 欧美一区二区三区免费在线观看 | 亚洲精品视频免费 | 日韩在线中文字幕视频 | 欧美成人在线免费视频 | 成人欧美一区二区三区白人 | 久久国产一区二区三区 | 亚洲 欧美 另类 综合 偷拍 | 在线免费色视频 | 欧州一区二区 | 99久久婷婷国产综合精品电影 | 亚洲综合婷婷 | 日韩三级视频 | 99在线视频播放 | 99re在线视频| 中文字幕一区二区三区精彩视频 | 国产精品1区2区3区 欧美 中文字幕 | 欧美成人免费视频 | 国产一区二区久久久 | 日韩视频欧美视频 | 天堂中文网官网 | 亚洲精品乱码久久久久久蜜桃图片 | 亚洲专区国产精品 | 亚洲日韩中文字幕一区 | 一区二区三区亚洲精品国 | 国产高清视频一区 | 亚洲午夜精品 | 欧美日一区二区 | 成人在线不卡 | 免费看一区二区三区 | 国产一区二区视频在线观看 | 免费在线一区二区三区 | 日韩欧美一二三区 | 成人欧美一区二区三区在线观看 | 日韩欧美在线免费观看 | 在线亚洲一区二区 | 国产精品不卡 | 99亚洲精品 | 99小视频 | 亚洲一区中文字幕在线观看 | 99精品一区二区 | h视频免费观看 | 99精品视频网| av黄色一级 | 免费看性生交大片 | 日韩6699人妻熟女毛片 | 欧美日韩福利视频 | 国产精品毛片在线 | 国产精品不卡 | 免费观看黄a一级视频 | 精品视频一区在线观看 | 国产免费一区二区三区 | 精品九九久久 | 国产日韩一区二区三区 | 一级片网 | 中文字幕欧美日韩 | 一区二区在线看 | 亚洲一区二区三区四区五区中文 | 91久久精品一区二区二区 | 激情久久av一区av二区av三区 | 精品国产一区二区三区性色av | 中文字幕 国产精品 | 欧美黄色网 | 亚洲一区二区三区四区在线观看 | 欧美99| 国产欧美精品一区二区 | 国产成人精品一区二区三区视频 | 国产精品久久久久久久 | 欧美a区 | 亚洲一区二区三区四区五区中文 | 国产高清美女一级a毛片久久 | 日日操天天射 | 国产人成免费视频 | www.se天堂 | 亚洲福利在线播放 | 久久99精品国产自在现线 | 国产精品99久久久久久久vr | 91亚洲高清 | 久久se精品一区精品二区 | 91免费在线视频 | 久久综合九色综合欧美狠狠 | 成人黄色片网站 | 国产成人精品一区二区在线 | 亚洲a网 | 伦理一区 | 午夜成人在线视频 | www国产在线观看 | 国精产品99永久一区一区 | 91免费看片 | 91久久久久 | 毛片一区二区三区 | 日本高清h色视频在线观看 日日干日日操 | 亚洲人人艹 | 美女久久久 | 欧美一级淫片免费看 | 综合久久综合久久 | 日韩资源 | 91精品国产色综合久久不卡98 | 国产一区二区视频在线播放 | 日本大人吃奶视频xxxx | 国产精品中文字幕在线播放 | 久久亚洲欧美日韩精品专区 | 99久久精品一区二区成人 | 亚洲高清在线视频 | 欧美综合成人网 | 日韩国产欧美 | 国产av毛片| 欧美日韩久久精品 | 国产美女视频一区 | 久久久精品欧美一区二区免费 | 日本 欧美 国产 | 天天曰 | www婷婷av久久久影片 | av免费观看在线 | 亚洲成人精品 | www.成人| 天天澡天天狠天天天做 | 影音先锋亚洲精品 | 久久久国产一区二区三区四区小说 | 欧美激情一区二区 | 日韩爱爱网 | 在线永久免费观看日韩a | 色综合天天天天做夜夜夜夜做 | 亚洲国产精品久久久久久久 | 日韩精品网站在线观看 | 成人免费黄色毛片 | 在线播放国产一区二区三区 | 免费国产视频 | 亚洲精品永久免费 | 久久精品国产99国产精2020新增功能 | 一区二区三区在线播放 | 精品久久一区二区三区 | 一色视频 | 午夜电影av| 欧美日韩精品综合 | 日韩欧美精品一区 | 日韩精品久久 | 久久激情五月丁香伊人 | 可以免费看黄的网站 | 欧美日韩一区二区电影 | 国产香蕉视频在线播放 | 欧美黄色一区 | 午夜精品一区二区三区四区 | 我和我的祖国电影在线观看免费版高清 | 午夜小电影 | 欧美在线a | 一级在线播放 | 国产欧美精品一区二区三区四区 | 亚洲 欧美 日韩在线 | 黄色在线免费观看 | 亚洲欧美激情精品一区二区 | 天天干天天av | 欧美日韩一区二区三区在线观看 | 天天操天天拍 | 三级视频在线 | 欧美日韩国产综合视频 | 黄毛片网站 | 欧美激情专区 | 中文字幕精品一区久久久久 | 美女黄网站视频免费 | 精品亚洲一区二区三区 | 色婷婷综合久久久中文字幕 | 日韩av高清在线 | 成人欧美一区二区三区黑人孕妇 | 亚洲欧美一区二区三区在线 | 免费毛片一区二区三区久久久 | 久久久久黄 | 99热在线播放 | 国产精品三级久久久久久电影 | 二区免费视频 | 欧美亚洲在线 | 成人精品一区 | 一区二区三区四区在线 | 一区二区在线看 | 国产视频久久 | 国产午夜精品美女视频明星a级 | 久草新视频在线观看 | 精品国产欧美一区二区 | 国产精品久久久av | 在线小视频 | a级片网站 | 欧美高清视频一区二区三区 | 久久精品国产亚洲blacked | 欧美成人一区二区 | 国产精品久久久久久亚洲调教 | 精品久久久久久久久久久 | 蜜臀av在线播放一区二区三区 | 国产成人精品久久二区二区 | 超碰高清| 91精品久久久久久 | 在线国产欧美 | 精品视频久久 | 国产伦精品一区二区三区在线 | 一道本视频 | 免费午夜剧场 | 国产精品免费在线 | 国产成人毛片 | 91原创国产 | 欧美日韩精品一区二区在线播放 | 成av在线| 一本一道久久a久久精品综合 | 国产精品二区三区在线观看 | 九九热在线免费视频 | 久草新 | 一级大片一级一大片 | 成人做爰69片免费 | 国产亚洲精品精品国产亚洲综合 | 91亚洲国产成人久久精品网站 | 亚洲激情av | 综合色爱 | 国产精品看片 | 久草热8精品视频在线观看 亚洲区在线 | 中文字幕在线第一页 | 欧美在线小视频 | 日韩一区二区在线视频 | 国产精品乱码一区二区三区 | 91视频在线免费观看 | 中文字幕免费看 | 日韩国产在线看 | 国产美女视频网站 | 日日操夜夜操天天操 | 久草福利资源 | 精品久久久久一区二区国产 | 欧美在线视频网 | 欧美精品1区2区3区 精品国产欧美一区二区 | 国产成人精品免高潮在线观看 | 99视频在线| 黄色国产一级视频 | 天堂中文资源在线 | 日韩在线观看 | 成人三级在线 | 91色视频在线观看 | 成人av网址在线观看 | 日韩欧美国产一区二区三区 | 黄色国产精品 | 91污在线| 福利在线播放 | 国产精品久久久久久久久久久久冷 | 国产日韩一区二区三免费高清 | 伊人网在线视频免费观看 | 色香阁99久久精品久久久 | 仙人掌旅馆在线观看 | 久久视频国产 | 国产精品国产三级国产aⅴ原创 | 999久久国产 | 久久久久久一区二区 | 欧美精品在欧美一区二区少妇 | 精品国产一区一区二区三亚瑟 | 精品久久久久久久久久久久 | 久久久久久国产精品 | 欧美韩国日本一区 | 日本免费网 | 精品欧美一区二区在线观看视频 | 综合视频一区二区三区 | 伊人网在线观看 | 日韩国产欧美一区 | 中文二区 | 国产精品成人国产乱一区 | 青青久视频 | 久久精品国产清自在天天线 | 一区二区三区亚洲视频 | 毛片a在线 | 日韩精品一二三区 | 成人在线精品 | 日韩av手机在线免费观看 | 久久九九国产精品 | 日韩一区二区三区在线视频 | 婷婷av在线| 思热99re视热频这里只精品 | 看毛片网站 | 欧美日韩视频在线观看免费 | 在线观看黄色大片 | 欧美日韩一区精品 | 黄色影片免费在线观看 | 夜夜视频 | 日本天天操 | 日本a在线 | 亚洲视频在线观看视频 | 日韩激情欧美 | 亚洲第一免费视频网站 | 四虎欧美 | 视频一区二区三区中文字幕 | 四虎在线视频 | 91视频免费观看 | 日本一区二区不卡视频 | 国产精品二区三区 | 中文字幕在线资源 | 免费在线精品视频 | 日韩经典一区 | 免费黄色av | 最新国产中文字幕 | 日韩中文在线 | 日韩中文字幕一区 | 日韩区| 欧美,日韩,国产精品免费观看 | 欧美一区二区三区免费 | 精品亚洲永久免费精品 | 欧美人体一区二区三区 | www.一区 | 国产成人午夜视频 | 亚洲成人av在线 | 成人免费一区二区三区视频软件 | 伊人在线| 9191视频| 成人在线免费视频 | 欧美一区二区激情三区 | a久久久 | 欧美国产一区二区 | 欧美涩涩网| 99成人| 欧美精品一区二区三区一线天视频 | 天堂va在线高清一区 | 亚洲免费电影一区 | 欧美日韩一区不卡 | 国产精品久久久久国产精品 | 国产裸体永久免费视频网站 | 亚洲欧洲一区二区 | 久久精品国产99国产精品 | 国产美女一区二区 | 亚洲精品久久一区二区三区 | 欧美成年视频 | 亚洲高清一区二区三区 | 亚洲国产精品久久人人爱 | 久久久久国产亚洲日本 | 亚洲日本乱码在线观看 | 欧美日本乱大交xxxxx | 91精品一区二区三区久久久久久 | 国产一区二区毛片 | 性色国产| 一区二区中文字幕 | 欧美日韩精品一区 | 在线日韩 | 日本黄色片免费 | 91精品国产综合久久婷婷香蕉 | 欧美高清dvd | 特黄特色大片免费视频观看 | 欧美视频二区 | 国产色 | 999精品视频 | 日韩一级在线免费观看 | 亚洲国产高清在线 | 国产精品美女在线观看 | 成人一级黄色大片 | 玖玖成人| 国产精品久久久久久久久 | 婷婷色国产偷v国产偷v小说 | 日本女人高潮视频 | 久久久久久久 | 亚洲综合中文网 | 亚洲一区二区三区四区五区中文 | 午夜日韩| av色资源 | 免费观看黄a一级视频 | 国产一区二区三区在线免费观看 | 国产高清精品一区二区三区 | 精品久久久久国产免费 | 久久天堂电影 | 色婷婷亚洲国产女人的天堂 | 91激情视频 | 国产欧美精品一区二区三区 | 精品久久影院 | 99精品电影 | 亚洲国产成人久久 | 精品亚洲一区二区三区在线观看 | 色婷婷网| 99精品在线 | 欧美精品99 | 91精品一区二区三区久久久久久 | 亚洲一区二区三区 | 欧美a在线 | 久久亚洲综合 | 欧美a级在线观看 | 欧美成人精品 | 亚洲视频在线播放 | 亚洲视频一区二区在线 | 国产日韩精品视频 | 久久久久久久国产 | 完全免费av | 日本一区二区中文字幕 | 国产一级片一区二区三区 | 成人精品视频免费 | 成人欧美一区二区三区黑人孕妇 | 91国视频| 天天人人精品 | 亚洲电影一区二区 | www,99热 | 欧美一区二 | 99精品国自产在线 | 看一级黄色大片 | 欧美性猛交一区二区三区精品 | 成年网站在线 | 久久91精品| 91精品久久久久久久 | 黄瓜av| 中文字幕在线第一页 | 日韩欧美一区二区在线观看 | 亚洲成人综合网站 | 亚洲欧美日本在线 | 日本在线观看网站 | 国产精品影视 | 亚洲国产精品久久久 | 国产精品日韩一区二区 | 欧美一区二区三 | 福利视频网址导航 | 欧美亚洲日本 | 羞羞视频免费在线观看 | 欧美爱爱视频 | 亚洲成av人片一区二区梦乃 | 国产欧美精品一区二区色综合 | 日本人做爰大片免费观看一老师 | 国产精品对白一区二区三区 | 精品日韩一区二区 | 品久久久久久久久久96高清 | 91亚洲国产成人精品性色 | 欧美日韩国产一区二区三区不卡 | 婷婷色国产偷v国产偷v小说 | 一级一级黄色片 | 91精品久久久久久久久入口 | 国产97在线 | 亚洲 | 看黄色.com | 亚洲欧美国产精品专区久久 | 成人免费在线电影 | 国产精品永久免费视频 | 欧美一级在线观看 | 日韩国产高清在线 | 亚洲欧美精品一区二区三区 | 亚洲视频在线观看网站 | 一区二区三区福利视频 | 午夜色福利 | 日本人做爰大片免费观看一老师 | 欧美日韩国产一区二区三区 | 91精品国产欧美一区二区成人 | 国产在线不卡一区 | 免费观看一区二区三区毛片 | 久久国产精品免费一区二区三区 | 亚洲精品二区 | 色欧美视频 | 国产精品99久久久久久久vr | 成人亚洲网 | 成人激情视频在线观看 | 一区二区三区免费 | 亚洲精品aaa| 日韩精品99久久久久中文字幕 | 久久久久久国产精品高清 | 午夜电影网 | 91香蕉视频在线观看 | 成人一区在线观看 | 97在线视频免费 | 久久成人av| 日日骚视频| 精品视频在线播放 | 一区二区三区四区在线播放 | 精品国产一区一区二区三亚瑟 | 在线第一页 | 亚洲精品日韩综合观看成人91 | 欧美中文在线 | 午夜免费视频 | 国产精品久久久久久久久 | 视频在线一区二区 | 久久久久久久久99精品 | 久久久久亚洲国产 | 在线影院av | 国产精品夜间视频香蕉 | 免费观看一级特黄欧美大片 | 一区中文字幕 | 亚洲一区二区三区视频 | 久久88 | 久久99精品久久久 | 99视频免费在线观看 | 91亚洲一区 | 狠狠艹夜夜艹 | 亚洲一区二区免费在线观看 | 日本一区二区中文字幕 | 色精品视频 | 国产亚洲欧美在线 | 日本一区视频在线观看 | 欧美xxxⅹ性欧美大片 | 中文字幕_第2页_高清免费在线 | 中文字幕av在线 | 免费在线黄色av | 在线视频一区二区三区 | 国产精品久久久久久久久软件 | 久久久国产视频 | 日韩在线成人 | 精品久久久久久亚洲精品 | 精品永久 | 日韩网站免费观看 | 国产人妖在线 | 亚洲精品不卡 | 成人免费视频网站在线观看 | 国产一区在线观看视频 | 国产日韩一区二区三免费高清 | 韩国精品一区 | 日韩在线播放一区二区三区 | av男人的天堂网 | 欧美精品一级二级 | 91精品国产综合久久福利软件 | 久久久91精品国产一区二区三区 | 青青草久久爱 | 91高清视频在线观看 | 影音先锋成人资源网 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 欧美成人黄色 | 第一色综合 | 欧洲妇女成人淫片aaa视频 | 中文在线a在线 | 色网站视频 | 性色浪潮 | 蜜桃在线视频 | 日韩在线中文字幕 | 男女视频网站 | 成人羞羞网站 | 久久久久久午夜 | 自拍偷拍专区 | 亚洲高清视频在线观看 | 国产最好的精华液网站 | 欧美综合一区二区 | 天天干天天操天天舔 | 日本成人一二三区 |