日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

自定义控件:QQ气泡效果粘性控件的实现

發(fā)布時間:2025/4/16 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义控件:QQ气泡效果粘性控件的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

學習目的

  • 了解幾何圖形工具的用法
  • 掌握畫不規(guī)則圖形的方法

應(yīng)用場景:未讀提醒,效果圖:

繪制一幀的效果

畫一幀粘性控件的步驟分析

  • 畫一個固定圓
  • 畫一個拖拽圓
  • 畫中間連接部分
  • 將中間連接部分水平放置,四個角的坐標定為固定值,分別標記上點的編號,矩形中心的點為控件點,畫曲線時用

    自定義一個GooView 繼承View

    public class GooView extends View {private Paint paint;public GooView(Context context) {this(context,null);}public GooView(Context context, AttributeSet attrs) {this(context, attrs,0);}public GooView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);//初始化畫筆paint = new Paint();paint.setAntiAlias(true);paint.setColor(Color.RED);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//畫中間連接部分Path path = new Path();//跳到點1,默認為(0f,0f)path.moveTo(250f, 250f);//從點1->點2 畫曲線path.quadTo(150f, 300f, 50f, 250f);//從點2->點3 畫直線path.lineTo(50f, 350f);//從點3->點4 畫曲線path.quadTo(150f, 300f, 250f, 350f);canvas.drawPath(path, paint);//畫拖拽圓canvas.drawCircle(90f, 90f, 16f, paint);//畫固定圓canvas.drawCircle(150f, 150f, 12f, paint);} }

    第20-30 行用Path 畫中間曲線部分
    第25 行quadTo(x1,y1,x2,y2)方法可以畫當前所在點到x2,y2 間的一條曲線,x1,y1 是當前點與x2,y2 間的一個控件點,它的位置決定曲線彎曲的方向和弧度,將GooView 顯示到MainActivity 中

    public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(new GooView(this));} }

    貝塞爾曲線

    上述代碼調(diào)用path.quadTo()畫曲線,這種曲線叫貝塞爾曲線,有一個起點和終點,還可以有2個或3個控制點,其中控制點是控制曲線的彎曲形狀,控制點不同,曲線的彎曲形狀就不同。

    二階貝塞爾曲線,三階貝塞爾曲線

    替換變量

    分別給拖拽圓,固定圓的圓心,半徑,兩個附著點命名,修改GooView 的onDraw()方法

    protected void onDraw(Canvas canvas) {super.onDraw(canvas);//固定圓的兩個附著點PointF[] mStickPoints = new PointF[]{new PointF(250f, 250f),new PointF(250f, 350f)};//固定圓的兩個附著點PointF[] mDragPoints = new PointF[]{new PointF(50f, 250f),new PointF(50f, 350f)};//控制點PointF mControlPoint = new PointF(150f, 300f);//畫中間連接部分Path path = new Path();//跳到點1,默認為(0f,0f)path.moveTo(mStickPoints[0].x, mStickPoints[0].y);//從點1->點2 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mDragPoints[0].x, mDragPoints[0].y);//從點2->點3 畫直線path.lineTo( mDragPoints[1].x, mDragPoints[1].y);//從點3->點4 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mStickPoints[1].x, mStickPoints[1].y);canvas.drawPath(path, paint);//畫拖拽圓//拖拽圓圓心PointF mDragCenter = new PointF(90f, 90f);//拖拽圓半徑float mDragRadius = 16f;canvas.drawCircle(mDragCenter.x, mDragCenter.y, mDragRadius, paint);//畫固定圓//固定圓圓心PointF mStickCenter = new PointF(150f, 150f);//固定圓半徑float mStickRadius = 12f;canvas.drawCircle(mStickCenter.x, mStickCenter.y, mStickRadius, paint); }

    第3-14 行替換附著點及控制點
    第30-40 行替換拖拽圓及固定圓的圓心及半徑
    將替換后的變量轉(zhuǎn)換成GooView 的成員變量

    // 固定圓圓心 PointF mStickCenter = new PointF(150f, 150f); // 固定圓半徑 float mStickRadius = 12f; // 拖拽圓圓心 PointF mDragCenter = new PointF(90f, 90f); // 拖拽圓半徑 float mDragRadius = 16f; // 固定圓的兩個附著點 PointF[] mStickPoints = new PointF[] { new PointF(250f, 250f),new PointF(250f, 350f) }; // 固定圓的兩個附著點 PointF[] mDragPoints = new PointF[] { new PointF(50f, 250f),new PointF(50f, 350f) };// 控制點 PointF mControlPoint = new PointF(150f, 300f); @Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 畫中間連接部分Path path = new Path();// 跳到點1,默認為(0f,0f)path.moveTo(mStickPoints[0].x, mStickPoints[0].y);// 從點1->點2 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mDragPoints[0].x,mDragPoints[0].y);// 從點2->點3 畫直線path.lineTo(mDragPoints[1].x, mDragPoints[1].y);// 從點3->點4 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mStickPoints[1].x,mStickPoints[1].y);canvas.drawPath(path, paint);// 畫拖拽圓canvas.drawCircle(mDragCenter.x, mDragCenter.y, mDragRadius, paint);// 畫固定圓canvas.drawCircle(mStickCenter.x, mStickCenter.y, mStickRadius, paint); }

    計算變量

    拖拽圓和固定圓的圓心和半徑已知,角3 的正弦值為兩圓心縱坐標之差比上橫坐標之差,則角3 的角度可知,則角1 可知,AB,AC 的長度即可計算出來,mDragPoints[0]的坐標可以計算出來,同理其它三個附著點坐標也可知。mControlPoint 為兩圓心連線的中點

    幾何圖形工具

    /*** 幾何圖形工具*/ public class GeometryUtil {/*** As meaning of method name.* 獲得兩點之間的距離* @param p0* @param p1* @return*/public static float getDistanceBetween2Points(PointF p0, PointF p1) {float distance = (float) Math.sqrt(Math.pow(p0.y - p1.y, 2) +Math.pow(p0.x - p1.x, 2));return distance;}/*** Get middle point between p1 and p2.* 獲得兩點連線的中點* @param p1* @param p2* @return*/public static PointF getMiddlePoint(PointF p1, PointF p2) {return new PointF((p1.x + p2.x) / 2.0f, (p1.y + p2.y) / 2.0f);}/*** Get point between p1 and p2 by percent.* 根據(jù)百分比獲取兩點之間的某個點坐標* @param p1* @param p2* @param percent* @return*/public static PointF getPointByPercent(PointF p1, PointF p2, float percent) {return new PointF(evaluateValue(percent, p1.x , p2.x),evaluateValue(percent, p1.y , p2.y));}/*** 根據(jù)分度值,計算從start 到end 中,fraction 位置的值。fraction 范圍為0 -> 1* @param fraction* @param start* @param end* @return*/public static float evaluateValue(float fraction, Number start, Number end){return start.floatValue() + (end.floatValue() - start.floatValue()) * fraction;}/*** Get the point of intersection between circle and line.* 獲取通過指定圓心,斜率為lineK 的直線與圓的交點。** @param pMiddle The circle center point.* @param radius The circle radius.* @param lineK The slope of line which cross the pMiddle.* @return*/public static PointF[] getIntersectionPoints(PointF pMiddle, float radius, DoublelineK) {PointF[] points = new PointF[2];float radian, xOffset = 0, yOffset = 0;if(lineK != null){radian= (float) Math.atan(lineK);xOffset = (float) (Math.sin(radian) * radius);yOffset = (float) (Math.cos(radian) * radius);}else {xOffset = radius;yOffset = 0;}points[0] = new PointF(pMiddle.x + xOffset, pMiddle.y - yOffset);points[1] = new PointF(pMiddle.x - xOffset, pMiddle.y + yOffset);return points;} }

    利用幾何圖形工具類計算四個附著點坐標及控件點坐標

    protected void onDraw(Canvas canvas) {super.onDraw(canvas);float yOffset = mStickCenter.y - mDragCenter.y;float xOffset = mStickCenter.x - mDragCenter.x;Double lineK = null;if(xOffset != 0){//xOffset 分母不能為0lineK = (double) (yOffset/xOffset);}//計算四個附著點mDragPoints = GeometryUtil.getIntersectionPoints(mDragCenter,mDragRadius, lineK);mStickPoints = GeometryUtil.getIntersectionPoints(mStickCenter,mStickRadius, lineK);//一個控制點mControlPoint = GeometryUtil.getMiddlePoint(mDragCenter, mStickCenter);// 畫中間連接部分Path path = new Path();// 跳到點1,默認為(0f,0f)path.moveTo(mStickPoints[0].x, mStickPoints[0].y);// 從點1->點2 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mDragPoints[0].x,mDragPoints[0].y);// 從點2->點3 畫直線path.lineTo(mDragPoints[1].x, mDragPoints[1].y);// 從點3->點4 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mStickPoints[1].x,mStickPoints[1].y);canvas.drawPath(path, paint);// 畫拖拽圓canvas.drawCircle(mDragCenter.x, mDragCenter.y, mDragRadius, paint);// 畫固定圓canvas.drawCircle(mStickCenter.x, mStickCenter.y, mStickRadius, paint); }

    第3-17 行計算四個附著點及控制點坐標

    1.4 計算固定圓半徑

    GooView 重寫onSizeChanged()方法,計算狀態(tài)欄高度

    @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);//獲取狀態(tài)欄的高度,傳入一個顯示在屏幕上的view 即可statusBarHeight = Utils.getStatusBarHeight(this); }

    Utils.java

    public class Utils {public static Toast mToast;public static void showToast(Context mContext, String msg) {if (mToast == null) {mToast = Toast.makeText(mContext, "", Toast.LENGTH_SHORT);}mToast.setText(msg);mToast.show();}/*** 獲取狀態(tài)欄高度** @param v* @return*/public static int getStatusBarHeight(View v) {if (v == null) {return 0;}Rect frame = new Rect();v.getWindowVisibleDisplayFrame(frame);return frame.top;} }

    修改onDraw()方法

    protected void onDraw(Canvas canvas) {super.onDraw(canvas);float yOffset = mStickCenter.y - mDragCenter.y;float xOffset = mStickCenter.x - mDragCenter.x;Double lineK = null;if(xOffset != 0){//xOffset 分母不能為0lineK = (double) (yOffset/xOffset);}//計算四個附著點mDragPoints = GeometryUtil.getIntersectionPoints(mDragCenter,mDragRadius, lineK);mStickPoints = GeometryUtil.getIntersectionPoints(mStickCenter,mStickRadius, lineK);//一個控制點mControlPoint = GeometryUtil.getMiddlePoint(mDragCenter, mStickCenter);//移動畫布canvas.save();canvas.translate(0, -statusBarHeight);// 畫中間連接部分Path path = new Path();// 跳到點1,默認為(0f,0f)path.moveTo(mStickPoints[0].x, mStickPoints[0].y);// 從點1->點2 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mDragPoints[0].x,mDragPoints[0].y);// 從點2->點3 畫直線path.lineTo(mDragPoints[1].x, mDragPoints[1].y);// 從點3->點4 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mStickPoints[1].x,mStickPoints[1].y);canvas.drawPath(path, paint);// 畫拖拽圓canvas.drawCircle(mDragCenter.x, mDragCenter.y, mDragRadius, paint);// 畫固定圓canvas.drawCircle(mStickCenter.x, mStickCenter.y, mStickRadius, paint);canvas.restore(); }

    第18-20 行把畫布向上移動狀態(tài)欄的高度,移動前需要保存一下當前狀態(tài),做完操作后需要恢復(fù)一下狀態(tài),由于在onTouchEvent()中用的是getRawX(),getRawY()獲取的是相對屏幕的坐標,所以GooView畫圖操作時需要向上移到一個狀態(tài)欄的高度才能剛好和手指重合拖拽圓跟隨手指移動時,隨著拖拽與固定圓的距離的變大,固定圓的半徑越來越小

    //允許的最大距離 float farestDistance = 80f; /*** 通過兩圓圓心的距離,計算固定圓的半徑* @return*/ private float computeStickRadius() {//通過幾何圖形工具類可以計算出兩圓圓心的距離,distance 是可以大于80f;float distance = GeometryUtil.getDistanceBetween2Points(mDragCenter, mStickCenter);//需要的是0.0f -> 1.0f 的值,所在大于80f 讓distance 等于80fdistance = Math.min(farestDistance, distance);float percent = distance/farestDistance;//需要固定圓心半徑在12f -> 3f 間變化,可以利用類型估值器return evaluate(percent, mStickRadius, mStickRadius*0.25f); } //FloatEvaluator.java 中拷貝 public Float evaluate(float fraction, Number startValue, Number endValue) {float startFloat = startValue.floatValue();return startFloat + fraction * (endValue.floatValue() - startFloat); } protected void onDraw(Canvas canvas) {super.onDraw(canvas);//通過兩圓圓心的距離,計算固定圓的半徑float tempStickRadius = computeStickRadius();float yOffset = mStickCenter.y - mDragCenter.y;float xOffset = mStickCenter.x - mDragCenter.x;Double lineK = null;if(xOffset != 0){lineK = (double) (yOffset/xOffset);}//計算四個附著點mDragPoints = GeometryUtil.getIntersectionPoints(mDragCenter, mDragRadius,lineK);mStickPoints = GeometryUtil.getIntersectionPoints(mStickCenter, tempStickRadius,lineK);//一個控制點mControlPoint = GeometryUtil.getMiddlePoint(mDragCenter, mStickCenter);//移動畫布canvas.save();canvas.translate(0, -statusBarHeight);// 畫中間連接部分Path path = new Path();// 跳到點1,默認為(0f,0f)path.moveTo(mStickPoints[0].x, mStickPoints[0].y);// 從點1->點2 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mDragPoints[0].x,mDragPoints[0].y);// 從點2->點3 畫直線path.lineTo(mDragPoints[1].x, mDragPoints[1].y);// 從點3->點4 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mStickPoints[1].x,mStickPoints[1].y);canvas.drawPath(path, paint);// 畫拖拽圓canvas.drawCircle(mDragCenter.x, mDragCenter.y, mDragRadius, paint);// 畫固定圓canvas.drawCircle(mStickCenter.x, mStickCenter.y, tempStickRadius, paint);canvas.restore(); }

    第2 行定義最大的拖拽距離為80f
    第7-24 行拖拽圓與固定圓的距離大于80f 時,取80f,通過兩圓圓心的距離與80f 相對可以求出一個0.0f
    到1.0f 的值,再通過估值器可以獲得固定圓的半徑在mStickRadius,mStickRadius*0.25f 間的變化值
    第27-28 行通過兩圓圓心的距離計算固定圓的半徑tempStickRadius
    第39,67 行將mStickRadius 替換成計算出來的半徑tempStickRadius

    事件處理

    事件處理的分析

  • 超出最大范圍:拖拽圓與固定圓斷開,松手后消失
  • 超出最大范圍:又放回去,恢復(fù)
  • 沒有超出最大范圍:松手,回彈動畫,恢復(fù)
  • 事件處理的實現(xiàn)

    修改onTouchEvent()方法

    //是否已經(jīng)消失 private boolean isDisappear = false; //是否超出范圍 private boolean isOutOfRange = false; public boolean onTouchEvent(MotionEvent event) {float x;float y;switch (event.getAction()) {case MotionEvent.ACTION_DOWN://重置變量isDisappear = false;isOutOfRange = false;x = event.getRawX();y = event.getRawY();updateDragCenter(x, y);break;case MotionEvent.ACTION_MOVE:x = event.getRawX();y = event.getRawY();updateDragCenter(x, y);float d = GeometryUtil.getDistanceBetween2Points(mDragCenter,mStickCenter);// 超出范圍斷開if (d > farestDistance) {isOutOfRange = true;invalidate();}break;case MotionEvent.ACTION_UP:if (isOutOfRange) {// 剛剛超出了范圍float dis = GeometryUtil.getDistanceBetween2Points(mDragCenter,mStickCenter);if (dis > farestDistance) {// 超出范圍,松手,斷開,消失isDisappear = true;invalidate();} else {// 超出范圍,斷開,又放回去了,恢復(fù)updateDragCenter(mStickCenter.x, mStickCenter.y);}} else {// 沒有超出范圍,松手,回彈,恢復(fù)final PointF startP = new PointF(mDragCenter.x, mDragCenter.y);ValueAnimator animator = ValueAnimator.ofFloat(1.0f);animator.setDuration(500);// 插值器,回彈效果animator.setInterpolator(new OvershootInterpolator(4));animator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {// 生成0.0f ->1.0f 間的值float percent = animation.getAnimatedFraction();// 計算從開始點startP 到mStickCenter 間的所有值PointF p = GeometryUtil.getPointByPercent(startP,mStickCenter, percent);updateDragCenter(p.x, p.y);}});animator.start();}break;default:break;}return true; }

    第1-2 行創(chuàng)建兩個布爾變量記錄是否已經(jīng)消失及是否超出范圍
    第11-12 行手指重新按下時,重置變量
    第21-27 行拖拽過程中記錄是否超出范圍
    第32-38 行超出范圍,松手,消失,標記當前為消失狀態(tài)
    第39-41 行超出范圍,又放回去了,需要恢復(fù),直接更新拖拽圓圓心為固定圓心即可
    第45-62 行沒有超出范圍,松手,需要回彈動畫,恢復(fù)

    修改onDraw()方法

    protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 通過兩圓圓心的距離,計算固定圓的半徑float tempStickRadius = computeStickRadius();float yOffset = mStickCenter.y - mDragCenter.y;float xOffset = mStickCenter.x - mDragCenter.x;Double lineK = null;if (xOffset != 0) {lineK = (double) (yOffset / xOffset);}// 計算四個附著點mDragPoints = GeometryUtil.getIntersectionPoints(mDragCenter,mDragRadius, lineK);mStickPoints = GeometryUtil.getIntersectionPoints(mStickCenter,tempStickRadius, lineK);// 一個控制點mControlPoint = GeometryUtil.getMiddlePoint(mDragCenter, mStickCenter);// 移動畫布canvas.save();canvas.translate(0, -statusBarHeight);// 畫出最大范圍(參考)// 只畫邊線paint.setStyle(Style.STROKE);canvas.drawCircle(mStickCenter.x, mStickCenter.y, farestDistance, paint);// 填充paint.setStyle(Style.FILL);if(!isDisappear){//沒有消失時,才繪制內(nèi)容if (!isOutOfRange) {//沒有超出范圍時,才畫連接部分和固定圓// 畫中間連接部分Path path = new Path();// 跳到點1,默認為(0f,0f)path.moveTo(mStickPoints[0].x, mStickPoints[0].y);// 從點1->點2 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y, mDragPoints[0].x,mDragPoints[0].y);// 從點2->點3 畫直線path.lineTo(mDragPoints[1].x, mDragPoints[1].y);// 從點3->點4 畫曲線path.quadTo(mControlPoint.x, mControlPoint.y,mStickPoints[1].x, mStickPoints[1].y);canvas.drawPath(path, paint);// 畫固定圓canvas.drawCircle(mStickCenter.x, mStickCenter.y,tempStickRadius, paint);}// 畫拖拽圓canvas.drawCircle(mDragCenter.x, mDragCenter.y, mDragRadius, paint);}canvas.restore(); }

    第31-54 行沒有消失時,才繪制內(nèi)容,沒有超出范圍時,才繪制連接部分及固定圓

    事件的監(jiān)聽回調(diào)

    定義監(jiān)聽接口

    private OnUpdateListener onUpdateListener; public OnUpdateListener getOnUpdateListener() {return onUpdateListener; } public void setOnUpdateListener(OnUpdateListener onUpdateListener) {this.onUpdateListener = onUpdateListener; } public interface OnUpdateListener{//消失時回調(diào)public void onDisappear();//恢復(fù)時回調(diào),分為超出范圍恢復(fù)及沒有超出范圍恢復(fù)public void onReset(boolean isOutOfRange); }

    修改onTouchEvent()方法

    public boolean onTouchEvent(MotionEvent event) {float x;float y;switch (event.getAction()) {case MotionEvent.ACTION_DOWN://重置變量isDisappear = false;isOutOfRange = false;x = event.getRawX();y = event.getRawY();updateDragCenter(x, y);break;case MotionEvent.ACTION_MOVE:x = event.getRawX();y = event.getRawY();updateDragCenter(x, y);float d = GeometryUtil.getDistanceBetween2Points(mDragCenter,mStickCenter);// 超出范圍斷開if (d > farestDistance) {isOutOfRange = true;invalidate();}break;case MotionEvent.ACTION_UP:if (isOutOfRange) {// 剛剛超出了范圍float dis = GeometryUtil.getDistanceBetween2Points(mDragCenter,mStickCenter);if (dis > farestDistance) {// 超出范圍,松手,斷開,消失isDisappear = true;invalidate();if(onUpdateListener != null){onUpdateListener.onDisappear();}} else {// 超出范圍,斷開,又放回去了,恢復(fù)updateDragCenter(mStickCenter.x, mStickCenter.y);if(onUpdateListener != null){onUpdateListener.onReset(true);}}} else {// 沒有超出范圍,松手,回彈,恢復(fù)final PointF startP = new PointF(mDragCenter.x, mDragCenter.y);ValueAnimator animator = ValueAnimator.ofFloat(1.0f);animator.setDuration(500);// 插值器,回彈效果animator.setInterpolator(new OvershootInterpolator(4));animator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {// 生成0.0f ->1.0f 間的值float percent = animation.getAnimatedFraction();// 計算從開始點startP 到mStickCenter 間的所有值PointF p = GeometryUtil.getPointByPercent(startP,mStickCenter, percent);updateDragCenter(p.x, p.y);}});animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);//需要在動畫結(jié)束時調(diào)用if(onUpdateListener != null){onUpdateListener.onReset(false);}}});animator.start();}break;default:break;}return true; }

    第35-37 行標記消失時,回調(diào)onDisappear()方法
    第41-42 行恢復(fù)時回調(diào)onReset()方法,此時超出過范圍,所以參數(shù)傳入true
    第64-73 行添加動畫監(jiān)聽,在動畫結(jié)束時回調(diào)onReset()方法,此時沒有超出范圍,所以參數(shù)傳入false

    修改MainActivity 測試監(jiān)聽回調(diào)

    public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);GooView view = new GooView(this);setContentView(view);view.setOnUpdateListener(new OnUpdateListener() {@Overridepublic void onReset(boolean isOutOfRange) {Utils.showToast(getApplicationContext(), "onReset:"+isOutOfRange);}@Overridepublic void onDisappear() {Utils.showToast(getApplicationContext(), "onDisappear");}});} }

    RecyclerView的處理

    如效果圖看到的紅色圓形控件為TextView并不是我們的GooView

    item布局文件

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="60dp"><TextView android:text="這是標題"android:layout_width="0dp"android:layout_weight="1"android:textSize="30sp"android:layout_height="wrap_content"android:id="@+id/tv_title"/> <!-- 此處是一個TextView加入一個圓形背景,并不是GooView 原因:RecyclerView的條目顯示區(qū)域僅僅有一塊,而GooView的顯示區(qū)域需要整個屏幕,如果直接將GooView放在條目中,拖動后會影響GooView的顯示,故:使用TextView來顯示,GooView后期動態(tài)加入 --><TextView android:id="@+id/tv_unReadMsgCount"android:layout_width="30dp"android:layout_height="30dp"android:text="6"android:textColor="#fff"android:textSize="23sp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:gravity="center"android:layout_marginRight="10dp"android:background="@drawable/tv_showmsg_shape"/> </LinearLayout>

    圓形背景tv_showmsg_shape

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"><solid android:color="#f00"/> </shape>

    處理RecyclerView

    @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main1);List<Msg> msgList=new ArrayList<>();for (int i = 0; i < 50; i++) {msgList.add(new Msg("標題"+i,i));}RecyclerView rlv= (RecyclerView) findViewById(R.id.rlv);rlv.setLayoutManager(new LinearLayoutManager(this));rlv.setAdapter(new MsgAdapter(msgList)); }//適配器處理 public class MsgAdapter extends Adapter<MsgAdapter.MyViewHolder> {private List<Msg> msgList;public MsgAdapter(List<Msg> msgList) {this.msgList = msgList;}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rlv_item, parent,false);return new MyViewHolder(view);}@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {holder.tv_title.setText(msgList.get(position).title);//判斷當未讀消息數(shù)等于0,則隱藏對應(yīng)的TextView控件int unReadMsgCount = msgList.get(position).unReadMsgCount;if (unReadMsgCount == 0) {holder.tv_unReadMsgCount.setVisibility(View.INVISIBLE);} else {holder.tv_unReadMsgCount.setVisibility(View.VISIBLE);holder.tv_unReadMsgCount.setText(unReadMsgCount+"");}}@Overridepublic int getItemCount() {return msgList.size();}public static class MyViewHolder extends RecyclerView.ViewHolder {public TextView tv_title;public TextView tv_unReadMsgCount;public MyViewHolder(View itemView) {super(itemView);tv_title = (TextView) itemView.findViewById(R.id.tv_title);tv_unReadMsgCount = (TextView) itemView.findViewById(R.id.tv_unReadMsgCount);}} }

    加入RecyclerView后的事件分發(fā)問題(事件分發(fā)機制)

    加入GooView后的處理

    實現(xiàn)效果的原理:當用戶觸摸到右側(cè)的圓形背景TextView的時候,讓TextView隱藏,利用WindowManager添加GooView當松開手后,將GooView移除,讓TextView顯示

    GooView的準備工作

    讓GooView能夠顯示文本,定義為GooView設(shè)置文本的方法

    private String GooViewText=""; public void setGooViewText(String gooViewText) {GooViewText = gooViewText; }

    在onDraw方法中繪制文本

    @Override protected void onDraw(Canvas canvas) {if (!isDisappear){if (!isOutOfRange){...//繪制文本 注意:要先繪制拖拽圓,再繪制文本,否則會被蓋住drawGooViewText(canvas);...}//繪制拖拽圓canvas.drawCircle(dragCenter.x,dragCenter.y,dragRadius,paint);... } } private void drawGooViewText(Canvas canvas) {paint.setColor(Color.WHITE);//在android中任何看到的視圖都是矩形的//計算文本的寬高:原理是將文本外套上一個矩形,矩形的寬高就是文本的寬高paint.getTextBounds(GooViewText, 0, GooViewText.length(), rect);int textWidth = rect.width();int textHeight = rect.height();//注意:一般控件是以左上角為基準點,文本是以左下角為基準點的,故:x為拖拽圓圓心x坐標-文本寬度/2float x=dragCenter.x-textWidth*0.5f;// y為拖拽圓圓心y坐標+文本寬度/2float y=dragCenter.y+textHeight*0.5f;canvas.drawText(GooViewText,x, y, paint);paint.setColor(Color.RED); }

    添加為GooView初始化位置的方法

    public GooView initGooViewPosition(float rawX, float rawY) {stableCenter.set(rawX, rawY);dragCenter.set(rawX, rawY);return this; }

    處理適配器為GooView設(shè)置觸摸監(jiān)聽

    @Override protected void convert(BaseViewHolder helper, Msg item) {... //為控件設(shè)置觸摸監(jiān)聽tv_un_read_msg_count.setOnTouchListener(listener); }

    觸摸監(jiān)聽的實現(xiàn):添加GooView并設(shè)置位置和文本

    public class OnShowGooViewTouchListener implements View.OnTouchListener {private Context context;private GooView gooView;private WindowManager windowManager;private WindowManager.LayoutParams params;//處理構(gòu)造方法,傳入上下文public OnShowGooViewTouchListener(Context context) {this.context = context;//創(chuàng)建GooViewgooView = new GooView(context);//創(chuàng)建WindowManager,可以用來在任何界面上添加一個額外的視圖windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);//為GooView設(shè)置布局參數(shù)params = new WindowManager.LayoutParams();//設(shè)置GooView的寬高為MATCH_PARENTparams.height = WindowManager.LayoutParams.MATCH_PARENT;params.width = WindowManager.LayoutParams.MATCH_PARENT;//設(shè)置GooView為透明,使得GooView出現(xiàn)后,用戶可以看到下面的界面params.format = PixelFormat.TRANSLUCENT;}private View mView;//重寫onTouch方法.//和onTouchEvent類似,如果onTouchEvent返回true,OnTouchListener返回true,則優(yōu)先將事件交給MotionEvent@Overridepublic boolean onTouch(View v, MotionEvent event) {//當按下去的對TextView進行相關(guān)處理if (event.getAction() == MotionEvent.ACTION_DOWN) {msg = (Msg) v.getTag();String text = ((TextView) v).getText().toString();//隱藏TextViewv.setVisibility(View.INVISIBLE);mView = v;//獲取按下的x,y坐標float rawX = event.getRawX();float rawY = event.getRawY();//設(shè)置gooView顯示的位置和文本gooView.initGooViewPosition(rawX, rawY);gooView.setGooViewText(text);//把GooView加載到windowManager上顯示windowManager.addView(gooView, params);}//表示想要處理事件return true;} }

    出現(xiàn)的bug1:觸摸TextView然后向上移動,GooView不懂,RecyclerView動

    事件被RecyclerView攔截了,需要請求RecyclerView不要攔截事件。事件分發(fā)涉及的基本概念:

    • onTouchEvent:觸摸事件的處理
    • dispatchTouchEvent:傳遞觸摸事件
    • onInterceptTouchEvent:攔截事件傳遞
    • requestDisallowedInterceptTouchEvent(boolean disallowIntercept):請求自己的父布局不要攔截事件

    事件分發(fā)原理:解決觸摸監(jiān)聽優(yōu)于onTouchEvent獲取事件的問題,處理:

    //請求RecyclerView不要搶奪事件 v.getParent():獲取TextView的父親布局,為條目的根部局 //requestDisallowInterceptTouchEvent():請求被調(diào)用者的父布局不要攔截事件,即RecyclerView不要攔截事件 v.getParent().requestDisallowInterceptTouchEvent(true);

    出現(xiàn)的bug2:移動后抬起手,GooView不消失

    原因:利用WindowManger添加的視圖比較特殊,不能直接移除,需要用windowManager.removeView(view);來移除
    但,作為OnShowGooViewTouchListener并不知道什么時候該移除GooView,故:使用接口回調(diào)來處理這個問題

    在GooView中定義接口:

    //定義接口 public interface OnGooViewChangedListener {//消失的回調(diào)public void disappear();//重置的回調(diào)public void reset(); } private OnGooViewChangedListener onGooViewChangedListener; public void setOnGooViewChangedListener( OnGooViewChangedListener onGooViewChangedListener) {this.onGooViewChangedListener = onGooViewChangedListener; }

    當消失的時候調(diào)用消失的回調(diào)方法:

    case MotionEvent.ACTION_UP:...if (isOutOfRange) {if (distance > maxDistance) {...//調(diào)用接口消失的方法if (onGooViewChangedListener != null) {onGooViewChangedListener.disappear();}} else {...//調(diào)用接口重置的方法if (onGooViewChangedListener != null) {onGooViewChangedListener.reset();}}} else {...valueAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {//調(diào)用接口重置的方法if (onGooViewChangedListener != null) {onGooViewChangedListener.reset();}}});...}invalidate();break;

    在OnShowGooViewTouchListener中設(shè)置和實現(xiàn)監(jiān)聽,并實現(xiàn)兩個回調(diào)方法

    public class OnShowGooViewTouchListener implements View.OnTouchListener, GooView.OnGooViewChangedListener { public OnShowGooViewTouchListener(Context context) {...gooView.setOnGooViewChangedListener(this);}//當GooView消失的時候,從WindowManager中移除@Overridepublic void disappear() {if (gooView.getParent() != null) {if (msg != null) {msg.unReadMsgCount = 0;}windowManager.removeView(gooView);}}//當GooView重置的時候,將GooView從WindowManager中移除@Overridepublic void reset() {if (gooView.getParent() != null) {windowManager.removeView(gooView);}//顯示TextViewmView.setVisibility(View.VISIBLE);} }

    總結(jié)

    以上是生活随笔為你收集整理的自定义控件:QQ气泡效果粘性控件的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    99 色| 欧美有色 | 四虎在线观看网址 | 日韩av片无码一区二区不卡电影 | 久草视频网 | 久久久久成人精品 | 亚洲精品乱码白浆高清久久久久久 | 超碰在线最新 | 久久成人国产精品免费软件 | 精品久久久免费视频 | 精久久久久 | 中文区中文字幕免费看 | 免费高清在线观看电视网站 | 波多野结衣视频一区二区 | 久久精品综合视频 | 国产一级免费播放 | 综合久久婷婷 | 天天射天天色天天干 | 久草视频在线资源 | 国产精品99久久久久的智能播放 | 色在线视频网 | 亚洲精品99 | 一区在线免费观看 | 国产中文字幕视频在线 | 97精品国产一二三产区 | 99爱精品在线 | 久久国产热| 欧美一区在线看 | 日韩高清精品免费观看 | 欧美一级免费片 | 人人澡人人添人人爽一区二区 | 久久精品官网 | 91精品一| av福利资源 | 久久九九免费视频 | 九九久久国产精品 | 亚洲视频观看 | 91精选 | 免费看国产曰批40分钟 | 欧美成人亚洲成人 | 97超碰人人澡人人爱 | 国产精品一区专区欧美日韩 | 日韩欧美在线视频一区二区 | 日精品在线观看 | 中文字幕一区二区三区精华液 | 欧美a级成人淫片免费看 | 国产精品99免视看9 国产精品毛片一区视频 | 久久精品视频免费播放 | 国产精品va在线观看入 | 在线a亚洲视频播放在线观看 | 国产精品视频观看 | 波多野结衣最新 | 成人免费电影 | 久久久久亚洲a | 麻豆传媒视频观看 | 韩国在线视频一区 | 天堂av观看 | 国产一区二区在线免费播放 | 亚洲精品乱码久久 | 欧美美女一级片 | 男女全黄一级一级高潮免费看 | 免费观看国产成人 | 国产片网站 | 亚洲在线观看av | 亚洲电影久久 | 国产一区二区影院 | 免费一级特黄毛大片 | 日韩av一区二区在线影视 | 亚洲第一区精品 | 久久久福利视频 | 欧美日韩在线视频免费 | 日韩一区二区免费在线观看 | 亚洲成人资源在线观看 | 91成人免费电影 | 国产视频首页 | 伊人久久国产精品 | 91视频 - 88av| 国产成人精品av久久 | 午夜视频日本 | 最近中文字幕 | 黄色av影视 | 成人h视频在线播放 | sm免费xx网站 | 成年人黄色大全 | av免费福利 | 最新一区二区三区 | 日韩欧美高清一区二区 | 国产精品24小时在线观看 | 免费在线激情电影 | 色综合久久88色综合天天人守婷 | 波多野结衣在线中文字幕 | 国产日韩欧美在线观看 | 日韩欧美一区二区三区免费观看 | 91av在线播放视频 | 日韩在线播放av | 精品视频在线免费观看 | 国产精品2区 | 中文字幕在线播放av | 久草精品视频在线播放 | 国产亚洲视频中文字幕视频 | 久久综合五月天婷婷伊人 | 特级黄色视频毛片 | 天天天综合网 | 亚洲精品福利视频 | 字幕网在线观看 | 日本高清xxxx | 在线看一级片 | 五月婷婷激情 | 国产精品黄色av | 国产午夜在线 | 国产精品免费在线播放 | 久久久天堂 | 国产99精品在线观看 | 亚洲精品a区 | 久一在线 | 亚洲午夜精品在线观看 | 久久久久www | 欧美久草视频 | 91av蜜桃| 亚洲欧美激情精品一区二区 | 婷婷丁香色 | 欧美日韩一区二区三区在线观看视频 | 亚洲国产久 | 91麻豆精品国产自产在线 | 欧美男女爱爱视频 | 久久a免费视频 | 99久久99视频 | 日韩精品一区二区免费视频 | 正在播放国产一区 | 7777精品伊人久久久大香线蕉 | 日韩av在线资源 | 肉色欧美久久久久久久免费看 | 久草视频在线观 | 成人av动漫在线观看 | 午夜av色| 亚洲一区二区精品3399 | 国产白浆在线观看 | 国产欧美精品一区二区三区四区 | 中文字幕av电影下载 | 亚洲精品在线视频网站 | 亚洲一区视频在线播放 | 国产 中文 日韩 欧美 | 国产精品激情偷乱一区二区∴ | 久久国产精品一二三区 | 欧洲性视频| 亚洲天堂社区 | 欧美一级免费片 | 中文字幕国产视频 | 96精品视频 | 国产亚洲欧美在线视频 | 国产精品白浆视频 | av在线中文| 久久96 | 免费情趣视频 | 国产福利一区二区三区在线观看 | 日韩.com| 91污污| 911久久| 久久久91精品国产一区二区精品 | 就要干b| 国产精品久久久久久久久久东京 | 国产 在线观看 | 视频一区亚洲 | 天天操天天操天天爽 | 一区二区不卡视频在线观看 | 欧美日韩国产一区二区三区在线观看 | av中文天堂 | 久热免费 | 人人射人人射 | 国产精品久久久久av福利动漫 | 91在线视频导航 | 最新的av网站 | www.五月天婷婷 | 国产精品破处视频 | 日本巨乳在线 | 国产精品伦一区二区三区视频 | 国产精品99久久久久久久久 | 在线免费中文字幕 | 在线观看黄av | 亚洲高清视频一区二区三区 | 国产一级片免费观看 | 在线看片中文字幕 | 日韩精品久久一区二区三区 | 丁香花五月 | 中文字幕一区二区三区在线观看 | 三级a毛片| 亚洲日本韩国一区二区 | 久久久久高清毛片一级 | 久久免费黄色大片 | 2019中文最近的2019中文在线 | 在线天堂中文www视软件 | 999日韩| 91福利视频网站 | 日韩女同一区二区三区在线观看 | 国产精品一区二区三区免费视频 | 精品在线观看一区二区三区 | 九色porny真实丨国产18 | 免费看污在线观看 | 国产中文字幕在线播放 | av电影亚洲 | 久久久午夜精品理论片中文字幕 | 亚洲激情精品 | 免费观看性生交大片3 | 成人av资源在线 | 国产高清永久免费 | 国产最新91| 成年人在线视频观看 | 在线观看免费版高清版 | 午夜资源站 | 97超碰免费在线观看 | 在线激情网 | 国产免费片| 天天操天天射天天爽 | 欧美a级免费视频 | 久热色超碰 | 国产精品一区二区你懂的 | 国产一区在线精品 | 色av资源网 | 日本成址在线观看 | 免费国产ww | 久草视频中文 | 久久天堂网站 | 午夜精品福利在线 | 国产免费不卡 | 波多野结衣视频一区二区三区 | 欧洲成人av | 国产成人精品一区二区三区在线 | 午夜精品一区二区三区在线观看 | 精品久久久影院 | 成人黄色毛片 | 99精品亚洲 | 一区在线观看视频 | 亚洲精品国产精品久久99热 | 欧美人操人 | 中文字幕中文字幕在线中文字幕三区 | 亚洲国产视频在线 | 国产一区在线免费 | 日韩欧美精品在线 | 亚洲精品福利在线观看 | 五月婷婷av | 天天综合入口 | 欧美日韩一区二区三区不卡 | 成人禁用看黄a在线 | 免费h精品视频在线播放 | 国产精品丝袜在线 | 97香蕉久久国产在线观看 | 在线国产视频 | 国产黄色精品网站 | 久久人人爽人人人人片 | 麻豆视频网址 | 六月婷婷网 | 狠狠狠干| 精品国产诱惑 | 国产黄色精品网站 | 黄色av三级在线 | 叶爱av在线 | avav99| 亚洲精品国产电影 | 九色精品免费永久在线 | 亚洲人在线视频 | 欧美精品在线观看免费 | 久久久久久久久久影视 | 日韩欧美高清一区二区 | 亚洲精品乱码久久久一二三 | 成人免费视频播放 | 特级毛片在线免费观看 | 综合网五月天 | 一级片视频免费观看 | 久久久综合香蕉尹人综合网 | 国产一级在线看 | 久久99久久99精品免费看小说 | 亚洲一区二区三区四区在线视频 | 久久视频免费 | 99久久久国产精品免费99 | 久久视频热 | 五月花婷婷| 国产视频网站在线观看 | 欧美性受极品xxxx喷水 | 波多野结衣在线观看一区 | 欧美一级免费黄色片 | 天天插天天干 | 欧美亚洲国产一卡 | 国产精品久久久久久久久久三级 | 在线激情网 | 久久综合成人 | 国产视频精品网 | 中文字幕日韩伦理 | 一区二区三区日韩视频在线观看 | 日韩精品一区二区三区外面 | 一区二区视频免费在线观看 | 天天操综合网 | 人人爽人人干 | 日本在线观看中文字幕 | 欧美极度另类 | 久草精品网 | 久久在线播放 | 久久全国免费视频 | 精品一区二区免费视频 | 国产在线永久 | 福利区在线观看 | 色综合天天狠天天透天天伊人 | 国产资源 | 国产日韩精品久久 | 五月婷婷网站 | 国产精品视频在线观看 | 五月激情六月丁香 | 久久99国产精品视频 | 亚洲日本三级 | 97在线观看视频免费 | 97人人澡人人添人人爽超碰 | 免费观看国产精品视频 | 在线观看日韩国产 | 91欧美精品 | 久久综合加勒比 | 国产美女视频 | 国产精品久久久久久久电影 | 91精品视频在线观看免费 | 日本久久成人 | 亚洲最大的av网站 | 在线亚洲欧美日韩 | 日本久久99 | 日韩精品在线观看av | 丁香六月在线 | 精品一区二区综合 | www一起操 | av怡红院 | 91在线日韩 | 玖玖视频网 | 国产一线二线三线性视频 | 国产午夜一区二区 | 国产精品一区二区久久精品爱涩 | 最新中文字幕视频 | 欧美久久综合 | 欧美一级性生活视频 | 久久精品影片 | 欧美 激情 国产 91 在线 | 亚洲欧美日韩国产精品一区午夜 | 国产精品国产毛片 | 亚洲 欧洲 国产 日本 综合 | 国产一区二区三区免费视频 | 2022国产精品视频 | 91精品国产入口 | 国产亚洲成人网 | 免费在线观看成人 | 亚洲精品黄色片 | 久久久国产99久久国产一 | 麻豆传媒视频在线 | 色综合色综合色综合 | 免费影视大全推荐 | 91亚洲在线观看 | 国产一线天在线观看 | 狠狠干电影 | 久久久久福利视频 | 欧美资源 | 国产探花视频在线播放 | 免费一级片观看 | 日本中出在线观看 | 349k.cc看片app | 久久99网 | 日本狠狠干 | 国产视频黄 | 国产午夜三级一二三区 | 日韩综合在线观看 | 欧美ⅹxxxxxx | 美女在线观看av | 国产精品免费大片视频 | www.黄色网.com | 国产精品成人av久久 | 黄色网址av | 午夜电影 电影 | 久久综合影音 | 久久不射影院 | 国产剧情亚洲 | 国产精品大尺度 | 在线观看的av网站 | 麻豆一精品传二传媒短视频 | 国产精品一区二区免费看 | 中文字幕亚洲不卡 | 美女在线免费视频 | 亚洲精品国产品国语在线 | 在线免费精品视频 | 亚洲黄色软件 | 免费亚洲黄色 | 麻豆va一区二区三区久久浪 | 天天天天综合 | 国产爽视频 | 久久精品99国产精品酒店日本 | 国产午夜精品免费一区二区三区视频 | 中文字幕中文 | 一区二区三区高清 | 亚洲高清色综合 | 六月丁香六月婷婷 | 精品国产电影一区 | 国产高清第一页 | 国产精品99久久久久久久久久久久 | 人人添人人澡人人澡人人人爽 | 国产一区欧美在线 | 成人三级视频 | 日韩精品视频网站 | 西西444www| 在线观看国产日韩欧美 | 日韩高清不卡在线 | 极品美女被弄高潮视频网站 | 天干啦夜天干天干在线线 | 国产黄在线 | 免费看在线看www777 | 欧美午夜剧场 | 色噜噜日韩精品欧美一区二区 | 亚洲精品综合欧美二区变态 | 久久免费a | 久久久久久视频 | 亚洲一区 影院 | 中文字幕首页 | 日韩久久激情 | 久久毛片高清国产 | 日韩精品视频第一页 | 超碰在线中文字幕 | 亚洲永久精品在线观看 | 97超碰在线久草超碰在线观看 | 亚洲动漫在线观看 | 久久99视频精品 | 国产美女无遮挡永久免费 | 亚洲精品免费在线播放 | 久久日本视频 | 日韩狠狠操| 99av在线视频 | 精品在线观看国产 | 三级黄色在线观看 | 国产精品毛片完整版 | 免费在线一区二区 | 91爱在线| 五月婷婷视频在线 | 高清av免费看| 九九九热精品免费视频观看网站 | 日韩电影久久 | 久久99电影 | 国产精品手机在线观看 | 国产视频在线看 | 99精品美女| 狠狠做深爱婷婷综合一区 | 久久精品99久久久久久2456 | 亚洲精品国产精品国自产在线 | 日韩mv欧美mv国产精品 | 国产97在线看 | 欧美日韩一区二区三区视频 | 一区二区伦理 | 天天草天天 | 久久久久观看 | 欧美91精品久久久久国产性生爱 | 综合伊人久久 | 五月天丁香综合 | 中文超碰字幕 | 中文字幕电影网 | 欧美精品久久久久久久久老牛影院 | 成人av片免费观看app下载 | 青青草在久久免费久久免费 | 久草热视频 | 深爱激情综合网 | 少妇精品久久久一区二区免费 | 91精品视频播放 | 热99久久精品 | 午夜色影院 | 久草色在线观看 | 制服丝袜天堂 | 日韩理论影院 | 国产99区 | 亚洲三级在线免费观看 | a级片久久久| 精品久久久网 | 五月天高清欧美mv | 日韩高清一二区 | 黄色成人影院 | 久久伊人婷婷 | 激情综合站| 国产黄色精品在线观看 | 午夜18视频在线观看 | 麻豆视频免费入口 | 极品国产91在线网站 | 日韩精品视频久久 | 亚洲激情网站免费观看 | 深爱综合网 | 一区二区 精品 | 久久观看免费视频 | 成人午夜影院在线观看 | 久久99精品久久久久久 | 日本在线观看中文字幕 | 超碰人人91 | 免费色网站 | 91精品国自产在线偷拍蜜桃 | 91av在线视频免费观看 | 欧美男女爱爱视频 | 欧美一区日韩精品 | 18国产精品福利片久久婷 | 日本黄色免费播放 | 日韩激情视频在线 | 日韩电影中文字幕在线观看 | 免费在线观看一级片 | 欧美人牲 | 麻豆国产精品永久免费视频 | 欧美日性视频 | 999热视频| 亚洲免费观看在线视频 | 久久久久人人 | 91一区啪爱嗯打偷拍欧美 | 91亚洲精品久久久蜜桃 | 视频1区2区 | 国内精品免费久久影院 | 在线观看一区 | 欧美a级在线免费观看 | 婷婷综合网 | 婷婷色婷婷 | 国产一性一爱一乱一交 | 日韩在线观看av | 久久91久久久久麻豆精品 | 午夜免费福利视频 | 欧美a影视 | 日本三级久久久 | 精品高清美女精品国产区 | 国产成人专区 | 亚洲日韩欧美一区二区在线 | 免费观看完整版无人区 | 九九热1 | 在线欧美国产 | 欧美日韩一区二区久久 | 黄色三级久久 | 免费黄色a级毛片 | 成人中文字幕在线观看 | 亚洲狠狠干 | 九九免费在线观看视频 | 97网| 日韩欧美在线免费 | 午夜天天操| 97视频在线观看视频免费视频 | 在线观看中文字幕dvd播放 | 97人人澡人人添人人爽超碰 | 亚洲精品国久久99热 | 99久久精品免费看国产四区 | 99久久精品国产欧美主题曲 | 久久爱综合 | 国产精品国产三级国产不产一地 | 欧美日韩首页 | 波多野结衣在线视频免费观看 | 午夜精品婷婷 | 精品国产片 | 欧美亚洲三级 | 99精品国产99久久久久久97 | 又黄又爽的视频在线观看网站 | 久久亚洲专区 | 麻豆成人在线观看 | 国产一级二级在线播放 | 91成人短视频在线观看 | 国产手机视频 | 日韩电影一区二区三区在线观看 | 日韩中文在线播放 | av手机在线播放 | 99久久精品免费看国产一区二区三区 | 激情综合啪啪 | 日韩精品视频免费专区在线播放 | 91天堂影院| 国产v在线播放 | 国产成人久久精品一区二区三区 | 91香蕉视频好色先生 | 国产在线观看,日本 | 免费h漫在线观看 | 成人日批视频 | 日韩精品一区二区久久 | 99色亚洲| 国产精品扒开做爽爽的视频 | 99热这里只有精品在线观看 | 西西人体4444www高清视频 | 国产中文字幕视频 | 国产精品一区免费在线观看 | 99久久久久国产精品免费 | 中文在线www| 亚洲精品色婷婷 | 三级黄色欧美 | 中文字幕黄色网址 | 97超碰在线播放 | 精品一区二区6 | 色综合在 | 久草在线国产 | 一区二区三区国产欧美 | 曰韩精品 | 91视频中文字幕 | av爱干| 国产艹b视频 | 精品成人a区在线观看 | 97视频在线观看视频免费视频 | 久久精品99国产精品日本 | 久久国产一区二区三区 | www.久久视频 | 五月婷婷电影网 | 久久精品一二三区 | 国产精品成人一区二区三区吃奶 | 国产97色在线 | 国产精品亚洲精品 | zzijzzij日本成熟少妇 | 国产黄视频在线观看 | 久久最新网址 | 操操操日日日干干干 | 天天干亚洲 | 超碰在线人人 | av免费片| www.xxxx变态.com | 久久国产区 | 国产亚洲一区二区三区 | 亚洲欧美国产日韩在线观看 | 国产高清在线观看 | 中文字幕视频播放 | 亚洲伦理一区二区 | 天堂资源在线观看视频 | 日韩精品一区二区三区中文字幕 | 国产精品麻豆果冻传媒在线播放 | 天天爱天天操天天爽 | 国产尤物在线视频 | 国偷自产中文字幕亚洲手机在线 | 亚洲国产欧美在线人成大黄瓜 | 成人黄色av免费在线观看 | 免费成人av在线看 | 草久视频在线观看 | 婷婷四房综合激情五月 | 亚洲成人中文在线 | 国产一区二区在线免费视频 | 久久不卡国产精品一区二区 | 久久综合五月天 | 国产四虎影院 | 激情综合国产 | 免费看一及片 | 成人国产精品一区 | a一片一级| 91亚洲狠狠婷婷综合久久久 | 中文字幕免费观看视频 | 伊人婷婷激情 | 天天爱综合 | 国产精品成人久久久久久久 | 国产精品亚| 亚洲精品国产精品久久99热 | 毛片www | 蜜臀久久99精品久久久无需会员 | 在线观看国产中文字幕 | av在线免费播放 | 9999国产精品 | 久久夜夜夜 | 黄色免费在线视频 | 97超碰在线资源 | 欧美一区二区三区在线 | 97人人澡人人添人人爽超碰 | 亚洲精品免费在线播放 | 欧美精品一二 | 国产成人综合图片 | 久久综合色8888 | 日韩有码专区 | 日韩美女免费线视频 | 日日夜夜天天干 | 超碰人人99 | 久久午夜网 | 999精品| 射射射av| 日本夜夜草视频网站 | 91视频免费看片 | 久久三级视频 | 国产精品久久久久四虎 | 色婷婷狠狠五月综合天色拍 | 久二影院| 久久久视频在线 | 深夜免费小视频 | 欧美色图30p | 一级免费黄色 | 毛片一区二区 | 午夜视频免费在线观看 | 麻豆国产精品永久免费视频 | 亚洲精品福利在线观看 | 天天做日日做天天爽视频免费 | 成人免费在线视频观看 | 日本午夜免费福利视频 | 亚洲一区二区三区毛片 | 中文字幕在线观看你懂的 | 中文字幕亚洲精品在线观看 | 色婷婷天天干 | av免费看在线 | 天天综合天天做天天综合 | 国产精品高清一区二区三区 | 精品一区二区综合 | 国产免费观看久久 | 日韩3区 | 久久久午夜精品理论片中文字幕 | 在线国产专区 | 狠狠ri| 97热视频| 一区二区视 | 久久精品一区二区三 | 涩涩网站在线播放 | 日女人电影 | 国产美女视频一区 | 最新av免费 | 日韩电影在线看 | 精品国产理论片 | 亚洲理论影院 | 久久五月婷婷综合 | 久久免费片 | 亚洲欧美在线观看视频 | 91精品视频在线观看免费 | 麻豆首页| 天天操夜夜拍 | av九九九| 黄色av一级片 | 九九热免费视频在线观看 | 丁香花在线观看视频在线 | 亚洲另类xxxx | 99亚洲天堂| 国产一区不卡在线 | 亚洲九九九在线观看 | 精品在线观看一区二区 | 五月天综合 | 国产美腿白丝袜足在线av | 精品久久久久久久久久 | 日本激情视频中文字幕 | 久久免费视频4 | 99免费在线视频 | 69xx视频 | www免费看片com | 婷婷伊人五月天 | av在线播放亚洲 | 免费在线激情电影 | 天天干天天怕 | 成人国产精品免费 | 亚洲综合视频在线 | 99精品视频在线观看免费 | 中文字幕在线观看免费观看 | 国产人成在线视频 | 国产99中文字幕 | 欧美色图亚洲图片 | 婷婷精品国产一区二区三区日韩 | 在线观看色网站 | 伊人色综合网 | 国产成人三级一区二区在线观看一 | 天天干天天操天天爱 | 在线视频观看你懂的 | 在线看黄色av | 久久蜜桃av | 国产精品一区在线观看你懂的 | 国产福利免费在线观看 | 五月天激情在线 | 色综合久久88色综合天天 | 国产一区二区精品 | 色婷婷综合久久久 | 久久精品2 | 国产成人一区二区三区电影 | 99精品国产在热久久下载 | www久久国产 | 99精品国产在热久久下载 | 国产91精品久久久久久 | 久久免费视频一区 | 在线免费观看国产视频 | av高清在线观看 | 青青久草在线 | 麻豆成人网| 在线视频中文字幕一区 | 成人毛片a | 亚洲电影av在线 | 91精品91 | 在线免费观看的av网站 | 日韩精品无 | 99国产免费网址 | 精品国产精品一区二区夜夜嗨 | 国产偷国产偷亚洲清高 | 亚洲区另类春色综合小说 | 天天色天天色 | 亚洲久草在线 | 免费av片在线 | 久久激情综合网 | 日韩高清一区二区 | 国产亚洲综合性久久久影院 | 丝袜美女视频网站 | 狠狠干狠狠色 | 五月综合网站 | 亚洲深爱激情 | 91完整版在线观看 | 国产精品激情偷乱一区二区∴ | 在线观看中文字幕 | 久久久久9999亚洲精品 | 91在线蜜桃臀 | 在线成人免费电影 | 国产日本高清 | 丁香一区二区 | 精品免费一区 | 手机看片久久 | 亚洲日本在线一区 | 亚色视频在线观看 | 免费视频一区 | 色七七亚洲影院 | 精品国产一区二区三区男人吃奶 | 中文字幕高清 | 激情五月亚洲 | 免费国产在线视频 | 成人资源网 | 欧美一级乱黄 | 久草视频在线免费播放 | 最近中文字幕完整高清 | 中文字幕日韩一区二区三区不卡 | 97视频免费看 | 成人在线黄色 | 免费黄av| 亚洲 欧美 精品 | 亚洲五月六月 | 成人免费视频视频在线观看 免费 | a久久免费视频 | 六月色丁香 | 久章操| 超碰免费在线公开 | 国产日产高清dvd碟片 | 黄色av免费看| 欧美男女爱爱视频 | 五月天高清欧美mv | 一区二区三区中文字幕在线观看 | 成年人网站免费观看 | 三级av中文字幕 | 日日精品 | 亚洲高清av在线 | 手机在线日韩视频 | 日韩三级精品 | 丁香激情五月婷婷 | 夜夜夜草| 最新日韩视频 | 欧美一区影院 | 人人爽人人爽人人片av免 | 天堂资源在线观看视频 | 国产精品成人自产拍在线观看 | 日韩午夜在线观看 | 国色天香av | 亚洲黄色大片 | 在线精品亚洲一区二区 | 香蕉久久久久 | 国产精品美乳一区二区免费 | 一级黄毛片| 91大神精品视频在线观看 | 国产精品视频你懂的 | 99热网站| 久久国产精品小视频 | 国产精品一区二区久久久 | 国产精品成人一区二区 | 91九色精品国产 | 在线看免费 | 中文字幕在线观看网站 | 91在线看| 国产成人av网站 | 国产精品免费久久久久久久久久中文 | 国产精品1区 | 亚洲综合视频在线观看 | www亚洲国产 | 日日爱视频 | 欧美性超爽 | 久久综合色影院 | 激情综合色播五月 | 国产成人三级一区二区在线观看一 | 久久精品视频免费观看 | 久久不射电影网 | 在线免费观看国产黄色 | 婷婷丁香色综合狠狠色 | 天天干,天天插 | 欧美日韩一区二区在线 | 国产亚洲视频在线免费观看 | 夜夜夜草 | 四虎永久免费在线观看 | 午夜婷婷网 | 黄色免费电影网站 | 久久久国产一区 | 欧美analxxxx | 久亚洲精品 | 日韩午夜电影院 | 国产在线精品一区二区不卡了 | 免费看一级黄色 | 亚洲国产大片 | 97精品国产 | 在线黄色国产 | 在线观看av中文字幕 | 九色精品免费永久在线 | 三级黄色大片在线观看 | 久久艹免费 | 激情视频区 | 激情综合中文娱乐网 | 久久午夜电影网 | 国产精品2018| 狠狠ri| 丁香在线观看完整电影视频 | 国产高清久久 | 九九色视频 | 免费看国产黄色 | 国产精品色在线 | 干 操 插 | 色综合久久中文字幕综合网 | 91精品在线观看入口 | 国产91aaa | 欧美色图狠狠干 | 日韩三级视频在线观看 | 香蕉视频在线视频 | 超碰在线公开 | 成人免费视频网 | 国产无遮挡又黄又爽馒头漫画 | 国产视频在线看 | 日本高清免费中文字幕 | 一区二区精品在线视频 | 欧美a级免费视频 | 97在线观看视频国产 | 少妇bbbb | 国产福利一区二区在线 | 成人av资源站 | 久久久免费观看完整版 | 国产一区二区在线影院 | 又黄又网站 | 91视视频在线直接观看在线看网页在线看 | 国产99久久久久 | 久操操 | 九九九视频精品 | 色综合婷婷久久 | 久久在线视频精品 | 中文字幕丝袜一区二区 | 国产精品久久久久久久久久久不卡 | 国产第一福利 | 在线探花 | 在线免费观看羞羞视频 | 亚洲国产日韩在线 | 超碰97人人爱 | 成人免费91 | 国产精品永久免费观看 | 亚洲精品久久久久中文字幕二区 | 99精品国产视频 | 日韩午夜三级 | 91香蕉视频污在线 | 欧美极品xxx| 久久乐九色婷婷综合色狠狠182 | 色婷婷亚洲婷婷 | 免费看片色 | 国产一区二区在线免费观看 | 久久九九久久精品 | 国产精品99蜜臀久久不卡二区 | 日韩久久精品一区二区三区下载 | 国产免费叼嘿网站免费 | 狠狠黄| 免费在线观看一区二区三区 | 丁香六月国产 | 在线免费国产 | 四虎成人网 | www免费视频com━ | 久久久精品 一区二区三区 国产99视频在线观看 | 国产精品美女毛片真酒店 | 九九99靖品| 操高跟美女 | 97超碰成人在线 | 蜜桃av久久久亚洲精品 | 在线观看视频福利 | 一区二区三区免费在线播放 | 黄色国产成人 | 亚洲六月丁香色婷婷综合久久 | 99久久www免费 | 久久艹国产视频 | 99热在线免费观看 | 国产精品电影一区二区 | 国产不卡精品视频 | 黄色特级片 | 黄色日本免费 | 日本资源中文字幕在线 | 亚洲成av人片在线观看香蕉 | 久久免费看a级毛毛片 | 美女精品在线观看 | 丁香婷婷久久久综合精品国产 | 天天艹天天 | 久久激情小视频 | 91精品久久久久久久91蜜桃 | 国产在线资源 | 免费视频 三区 | 91亚洲视频在线观看 | 日本精品视频一区 | 色 中文字幕 | 日韩电影在线看 | 天天综合视频在线观看 | 天天操天天爽天天干 | 久久五月网 | 激情五月播播久久久精品 | 免费合欢视频成人app | av电影在线免费 | 综合网伊人 | 99精品视频一区二区 | 波多野结衣在线播放视频 | 日韩国产欧美在线播放 | 亚洲精品裸体 | 成人网在线免费视频 | 欧美一级片免费 | 国产精品久久久久久久久久不蜜月 | 操操操日日日干干干 | 精品视频免费看 | av电影免费观看 | 国产精品久久久久一区二区三区共 | 免费高清看电视网站 | 日本久久精品视频 | 国产日产高清dvd碟片 | 一区二区三区四区精品视频 | www黄色大片|