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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个绚丽的loading动效分析与实现!

發(fā)布時(shí)間:2024/7/23 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个绚丽的loading动效分析与实现! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最終效果如下

從效果上看,我們需要考慮以下幾個(gè)問題:
1.葉子的隨機(jī)產(chǎn)生;
2.葉子隨著一條正余弦曲線移動(dòng);
3.葉子在移動(dòng)的時(shí)候旋轉(zhuǎn),旋轉(zhuǎn)方向隨機(jī),正時(shí)針或逆時(shí)針;
4.葉子遇到進(jìn)度條,似乎是融合進(jìn)入;
5.葉子不能超出最左邊的弧角;
7.葉子飄出時(shí)的角度不是一致,走的曲線的振幅也有差別,否則太有規(guī)律性,缺乏美感;

總的看起來,需要注意和麻煩的地方主要是以上幾點(diǎn),當(dāng)然還有一些細(xì)節(jié)問題,比如最左邊是圓弧等等;
那接下來我們將效果進(jìn)行分解,然后逐個(gè)擊破:
整個(gè)效果來說,我們需要的圖主要是飛動(dòng)的小葉子和右邊旋轉(zhuǎn)的風(fēng)扇,其他的部分都可以用色值進(jìn)行繪制,當(dāng)然我們?yōu)榱朔奖?#xff0c;就連底部框一起切了;
先從gif 圖里把飛動(dòng)的小葉子和右邊旋轉(zhuǎn)的風(fēng)扇、底部框摳出來,小葉子圖如下:

我們需要處理的主要有兩個(gè)部分:
1. 隨著進(jìn)度往前繪制的進(jìn)度條;
2. 不斷飛出來的小葉片;

我們先處理第一部分 - 隨著進(jìn)度往前繪制的進(jìn)度條:
進(jìn)度條的位置根據(jù)外層傳入的 progress 進(jìn)行計(jì)算,可以分為圖中 1、2、3 三個(gè)階段:

  • 當(dāng)progress 較小,算出的當(dāng)前距離還在弧形以內(nèi)時(shí),需要繪制如圖所示 1 區(qū)域的弧形,其余部分用白色填充;
  • 當(dāng) progress 算出的距離到2時(shí),需要繪制棕色半圓弧形,其余部分用白色矩形填充;
  • 當(dāng) progress 算出的距離到3 時(shí),需要繪制棕色半圓弧形,棕色矩形,白色矩形;
  • 當(dāng) progress 算出的距離到頭時(shí),需要繪制棕色半圓弧形,棕色矩形;(可以合并到3中)
  • 首先根據(jù)進(jìn)度條的寬度和當(dāng)前進(jìn)度、總進(jìn)度算出當(dāng)前的位置:

    //mProgressWidth為進(jìn)度條的寬度,根據(jù)當(dāng)前進(jìn)度算出進(jìn)度條的位置 mCurrentProgressPosition = mProgressWidth * mProgress / TOTAL_PROGRESS;

    然后按照上面的邏輯進(jìn)行繪制,其中需要計(jì)算上圖中的紅色弧角角度,計(jì)算方法如下:

    // 單邊角度 int angle = (int) Math.toDegrees(Math.acos((mArcRadius - mCurrentProgressPosition)/ (float) mArcRadius));

    Math.acos() -反余弦函數(shù);
    Math.toDegrees() - 弧度轉(zhuǎn)化為角度,Math.toRadians 角度轉(zhuǎn)化為弧度

    所以圓弧的起始點(diǎn)為:

    int startAngle = 180 - angle;

    圓弧劃過的角度為:2 * angle

    這一塊的代碼如下:

    // mProgressWidth為進(jìn)度條的寬度,根據(jù)當(dāng)前進(jìn)度算出進(jìn)度條的位置 mCurrentProgressPosition = mProgressWidth * mProgress / TOTAL_PROGRESS; // 即當(dāng)前位置在圖中所示1范圍內(nèi) if (mCurrentProgressPosition < mArcRadius) { Log.i(TAG, "mProgress = " + mProgress + "---mCurrentProgressPosition = " + mCurrentProgressPosition + "--mArcProgressWidth" + mArcRadius); // 1.繪制白色ARC,繪制orange ARC // 2.繪制白色矩形 // 1.繪制白色ARC canvas.drawArc(mArcRectF, 90, 180, false, mWhitePaint); // 2.繪制白色矩形 mWhiteRectF.left = mArcRightLocation; canvas.drawRect(mWhiteRectF, mWhitePaint); // 3.繪制棕色 ARC // 單邊角度 int angle = (int) Math.toDegrees(Math.acos((mArcRadius - mCurrentProgressPosition) / (float) mArcRadius)); // 起始的位置 int startAngle = 180 - angle; // 掃過的角度 int sweepAngle = 2 * angle; Log.i(TAG, "startAngle = " + startAngle); canvas.drawArc(mArcRectF, startAngle, sweepAngle, false, mOrangePaint); } else { Log.i(TAG, "mProgress = " + mProgress + "---transfer-----mCurrentProgressPosition = " + mCurrentProgressPosition + "--mArcProgressWidth" + mArcRadius); // 1.繪制white RECT // 2.繪制Orange ARC // 3.繪制orange RECT // 1.繪制white RECT mWhiteRectF.left = mCurrentProgressPosition; canvas.drawRect(mWhiteRectF, mWhitePaint); // 2.繪制Orange ARC canvas.drawArc(mArcRectF, 90, 180, false, mOrangePaint); // 3.繪制orange RECT mOrangeRectF.left = mArcRightLocation; mOrangeRectF.right = mCurrentProgressPosition; canvas.drawRect(mOrangeRectF, mOrangePaint); }

    葉子部分

    首先根據(jù)效果情況基本確定出 曲線函數(shù),標(biāo)準(zhǔn)函數(shù)方程為:y = A(wx+Q)+h,其中w影響周期,A影響振幅 ,周期T= 2 * Math.PI/w;
    根據(jù)效果可以看出,周期大致為總進(jìn)度長(zhǎng)度,所以確定w=(float) ((float) 2 * Math.PI /mProgressWidth);

    仔細(xì)觀察效果,我們可以發(fā)現(xiàn),葉子飄動(dòng)的過程中振幅不是完全一致的,產(chǎn)生一種錯(cuò)落的效果,既然如此,我們給葉子定義一個(gè)Type,根據(jù)Type 確定不同的振幅;

    我們創(chuàng)建一個(gè)葉子對(duì)象:

    private class Leaf { // 在繪制部分的位置 float x, y; // 控制葉子飄動(dòng)的幅度 StartType type; // 旋轉(zhuǎn)角度 int rotateAngle; // 旋轉(zhuǎn)方向--0代表順時(shí)針,1代表逆時(shí)針 int rotateDirection; // 起始時(shí)間(ms) long startTime; }

    類型采用枚舉進(jìn)行定義,其實(shí)就是用來區(qū)分不同的振幅:

    private enum StartType { LITTLE, MIDDLE, BIG }

    創(chuàng)建一個(gè)LeafFactory類用于創(chuàng)建一個(gè)或多個(gè)葉子信息:

    private class LeafFactory { private static final int MAX_LEAFS = 6; Random random = new Random(); // 生成一個(gè)葉子信息 public Leaf generateLeaf() { Leaf leaf = new Leaf(); int randomType = random.nextInt(3); // 隨時(shí)類型- 隨機(jī)振幅 StartType type = StartType.MIDDLE; switch (randomType) { case 0: break; case 1: type = StartType.LITTLE; break; case 2: type = StartType.BIG; break; default: break; } leaf.type = type; // 隨機(jī)起始的旋轉(zhuǎn)角度 leaf.rotateAngle = random.nextInt(360); // 隨機(jī)旋轉(zhuǎn)方向(順時(shí)針或逆時(shí)針) leaf.rotateDirection = random.nextInt(2); // 為了產(chǎn)生交錯(cuò)的感覺,讓開始的時(shí)間有一定的隨機(jī)性 mAddTime += random.nextInt((int) (LEAF_FLOAT_TIME * 1.5)); leaf.startTime = System.currentTimeMillis() + mAddTime; return leaf; } // 根據(jù)最大葉子數(shù)產(chǎn)生葉子信息 public List<Leaf> generateLeafs() { return generateLeafs(MAX_LEAFS); } // 根據(jù)傳入的葉子數(shù)量產(chǎn)生葉子信息 public List<Leaf> generateLeafs(int leafSize) { List<Leaf> leafs = new LinkedList<Leaf>(); for (int i = 0; i < leafSize; i++) { leafs.add(generateLeaf()); } return leafs; }

    定義兩個(gè)常亮分別記錄中等振幅和之間的振幅差:

    // 中等振幅大小 private static final int MIDDLE_AMPLITUDE = 13; // 不同類型之間的振幅差距 private static final int AMPLITUDE_DISPARITY = 5; // 中等振幅大小 private int mMiddleAmplitude = MIDDLE_AMPLITUDE; // 振幅差 private int mAmplitudeDisparity = AMPLITUDE_DISPARITY;

    有了以上信息,我們則可以獲取到葉子的Y值:

    // 通過葉子信息獲取當(dāng)前葉子的Y值 private int getLocationY(Leaf leaf) { // y = A(wx+Q)+h float w = (float) ((float) 2 * Math.PI / mProgressWidth); float a = mMiddleAmplitude; switch (leaf.type) { case LITTLE: // 小振幅 = 中等振幅 - 振幅差 a = mMiddleAmplitude - mAmplitudeDisparity; break; case MIDDLE: a = mMiddleAmplitude; break; case BIG: // 小振幅 = 中等振幅 + 振幅差 a = mMiddleAmplitude + mAmplitudeDisparity; break; default: break; } Log.i(TAG, "---a = " + a + "---w = " + w + "--leaf.x = " + leaf.x); return (int) (a * Math.sin(w * leaf.x)) + mArcRadius * 2 / 3; }

    繪制葉子

    /** * 繪制葉子 * * @param canvas */ private void drawLeafs(Canvas canvas) { long currentTime = System.currentTimeMillis(); for (int i = 0; i < mLeafInfos.size(); i++) { Leaf leaf = mLeafInfos.get(i); if (currentTime > leaf.startTime && leaf.startTime != 0) { // 繪制葉子--根據(jù)葉子的類型和當(dāng)前時(shí)間得出葉子的(x,y) getLeafLocation(leaf, currentTime); // 根據(jù)時(shí)間計(jì)算旋轉(zhuǎn)角度 canvas.save(); // 通過Matrix控制葉子旋轉(zhuǎn) Matrix matrix = new Matrix(); float transX = mLeftMargin + leaf.x; float transY = mLeftMargin + leaf.y; Log.i(TAG, "left.x = " + leaf.x + "--leaf.y=" + leaf.y); matrix.postTranslate(transX, transY); // 通過時(shí)間關(guān)聯(lián)旋轉(zhuǎn)角度,則可以直接通過修改LEAF_ROTATE_TIME調(diào)節(jié)葉子旋轉(zhuǎn)快慢 float rotateFraction = ((currentTime - leaf.startTime) % LEAF_ROTATE_TIME) / (float) LEAF_ROTATE_TIME; int angle = (int) (rotateFraction * 360); // 根據(jù)葉子旋轉(zhuǎn)方向確定葉子旋轉(zhuǎn)角度 int rotate = leaf.rotateDirection == 0 ? angle + leaf.rotateAngle : -angle + leaf.rotateAngle; matrix.postRotate(rotate, transX + mLeafWidth / 2, transY + mLeafHeight / 2); canvas.drawBitmap(mLeafBitmap, matrix, mBitmapPaint); canvas.restore(); } else { continue; } } }

    LeafLoadingView完整代碼

    package com.example.csdnblog4;import java.util.LinkedList; import java.util.List; import java.util.Random;import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.util.Log; import android.view.View;public class LeafLoadingView extends View {private static final String TAG = "LeafLoadingView";// 淡白色private static final int WHITE_COLOR = 0xfffde399;// 橙色private static final int ORANGE_COLOR = 0xffffa800;// 中等振幅大小private static final int MIDDLE_AMPLITUDE = 13;// 不同類型之間的振幅差距private static final int AMPLITUDE_DISPARITY = 5;// 總進(jìn)度private static final int TOTAL_PROGRESS = 100;// 葉子飄動(dòng)一個(gè)周期所花的時(shí)間private static final long LEAF_FLOAT_TIME = 3000;// 葉子旋轉(zhuǎn)一周需要的時(shí)間private static final long LEAF_ROTATE_TIME = 2000;// 用于控制繪制的進(jìn)度條距離左/上/下的距離private static final int LEFT_MARGIN = 9;// 用于控制繪制的進(jìn)度條距離右的距離private static final int RIGHT_MARGIN = 25;private int mLeftMargin, mRightMargin;// 中等振幅大小private int mMiddleAmplitude = MIDDLE_AMPLITUDE;// 振幅差private int mAmplitudeDisparity = AMPLITUDE_DISPARITY;// 葉子飄動(dòng)一個(gè)周期所花的時(shí)間private long mLeafFloatTime = LEAF_FLOAT_TIME;// 葉子旋轉(zhuǎn)一周需要的時(shí)間private long mLeafRotateTime = LEAF_ROTATE_TIME;private Resources mResources;private Bitmap mLeafBitmap;private int mLeafWidth, mLeafHeight;private Bitmap mOuterBitmap;private Rect mOuterSrcRect, mOuterDestRect;private int mOuterWidth, mOuterHeight;private int mTotalWidth, mTotalHeight;private Paint mBitmapPaint, mWhitePaint, mOrangePaint;private RectF mWhiteRectF, mOrangeRectF, mArcRectF;// 當(dāng)前進(jìn)度private int mProgress;// 所繪制的進(jìn)度條部分的寬度private int mProgressWidth;// 當(dāng)前所在的繪制的進(jìn)度條的位置private int mCurrentProgressPosition;// 弧形的半徑private int mArcRadius;// arc的右上角的x坐標(biāo),也是矩形x坐標(biāo)的起始點(diǎn)private int mArcRightLocation;// 用于產(chǎn)生葉子信息private LeafFactory mLeafFactory;// 產(chǎn)生出的葉子信息private List<Leaf> mLeafInfos;// 用于控制隨機(jī)增加的時(shí)間不抱團(tuán)private int mAddTime;public LeafLoadingView(Context context, AttributeSet attrs) {super(context, attrs);mResources = getResources();mLeftMargin = UiUtils.dipToPx(context, LEFT_MARGIN);mRightMargin = UiUtils.dipToPx(context, RIGHT_MARGIN);mLeafFloatTime = LEAF_FLOAT_TIME;mLeafRotateTime = LEAF_ROTATE_TIME;initBitmap();initPaint();mLeafFactory = new LeafFactory();mLeafInfos = mLeafFactory.generateLeafs();}private void initPaint() {mBitmapPaint = new Paint();mBitmapPaint.setAntiAlias(true);mBitmapPaint.setDither(true);mBitmapPaint.setFilterBitmap(true);mWhitePaint = new Paint();mWhitePaint.setAntiAlias(true);mWhitePaint.setColor(WHITE_COLOR);mOrangePaint = new Paint();mOrangePaint.setAntiAlias(true);mOrangePaint.setColor(ORANGE_COLOR);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 繪制進(jìn)度條和葉子// 之所以把葉子放在進(jìn)度條里繪制,主要是層級(jí)原因drawProgressAndLeafs(canvas);// drawLeafs(canvas);canvas.drawBitmap(mOuterBitmap, mOuterSrcRect, mOuterDestRect, mBitmapPaint);postInvalidate();}private void drawProgressAndLeafs(Canvas canvas) {if (mProgress >= TOTAL_PROGRESS) {mProgress = 0;}// mProgressWidth為進(jìn)度條的寬度,根據(jù)當(dāng)前進(jìn)度算出進(jìn)度條的位置mCurrentProgressPosition = mProgressWidth * mProgress / TOTAL_PROGRESS;// 即當(dāng)前位置在圖中所示1范圍內(nèi)if (mCurrentProgressPosition < mArcRadius) {Log.i(TAG, "mProgress = " + mProgress + "---mCurrentProgressPosition = "+ mCurrentProgressPosition+ "--mArcProgressWidth" + mArcRadius);// 1.繪制白色ARC,繪制orange ARC// 2.繪制白色矩形// 1.繪制白色ARCcanvas.drawArc(mArcRectF, 90, 180, false, mWhitePaint);// 2.繪制白色矩形mWhiteRectF.left = mArcRightLocation;canvas.drawRect(mWhiteRectF, mWhitePaint);// 繪制葉子drawLeafs(canvas);// 3.繪制棕色 ARC// 單邊角度int angle = (int) Math.toDegrees(Math.acos((mArcRadius - mCurrentProgressPosition)/ (float) mArcRadius));// 起始的位置int startAngle = 180 - angle;// 掃過的角度int sweepAngle = 2 * angle;canvas.drawArc(mArcRectF, startAngle, sweepAngle, false, mOrangePaint);} else {Log.i(TAG, "mProgress = " + mProgress + "---transfer-----mCurrentProgressPosition = "+ mCurrentProgressPosition+ "--mArcProgressWidth" + mArcRadius);// 1.繪制white RECT// 2.繪制Orange ARC// 3.繪制orange RECT// 這個(gè)層級(jí)進(jìn)行繪制能讓葉子感覺是融入棕色進(jìn)度條中// 1.繪制white RECTmWhiteRectF.left = mCurrentProgressPosition;canvas.drawRect(mWhiteRectF, mWhitePaint);// 繪制葉子drawLeafs(canvas);// 2.繪制Orange ARCcanvas.drawArc(mArcRectF, 90, 180, false, mOrangePaint);// 3.繪制orange RECTmOrangeRectF.left = mArcRightLocation;mOrangeRectF.right = mCurrentProgressPosition;canvas.drawRect(mOrangeRectF, mOrangePaint);}}/*** 繪制葉子* * @param canvas*/private void drawLeafs(Canvas canvas) {mLeafRotateTime = mLeafRotateTime <= 0 ? LEAF_ROTATE_TIME : mLeafRotateTime;long currentTime = System.currentTimeMillis();for (int i = 0; i < mLeafInfos.size(); i++) {Leaf leaf = mLeafInfos.get(i);if (currentTime > leaf.startTime && leaf.startTime != 0) {// 繪制葉子--根據(jù)葉子的類型和當(dāng)前時(shí)間得出葉子的(x,y)getLeafLocation(leaf, currentTime);// 根據(jù)時(shí)間計(jì)算旋轉(zhuǎn)角度canvas.save();// 通過Matrix控制葉子旋轉(zhuǎn)Matrix matrix = new Matrix();float transX = mLeftMargin + leaf.x;float transY = mLeftMargin + leaf.y;Log.i(TAG, "left.x = " + leaf.x + "--leaf.y=" + leaf.y);matrix.postTranslate(transX, transY);// 通過時(shí)間關(guān)聯(lián)旋轉(zhuǎn)角度,則可以直接通過修改LEAF_ROTATE_TIME調(diào)節(jié)葉子旋轉(zhuǎn)快慢float rotateFraction = ((currentTime - leaf.startTime) % mLeafRotateTime)/ (float) mLeafRotateTime;int angle = (int) (rotateFraction * 360);// 根據(jù)葉子旋轉(zhuǎn)方向確定葉子旋轉(zhuǎn)角度int rotate = leaf.rotateDirection == 0 ? angle + leaf.rotateAngle : -angle+ leaf.rotateAngle;matrix.postRotate(rotate, transX+ mLeafWidth / 2, transY + mLeafHeight / 2);canvas.drawBitmap(mLeafBitmap, matrix, mBitmapPaint);canvas.restore();} else {continue;}}}private void getLeafLocation(Leaf leaf, long currentTime) {long intervalTime = currentTime - leaf.startTime;mLeafFloatTime = mLeafFloatTime <= 0 ? LEAF_FLOAT_TIME : mLeafFloatTime;if (intervalTime < 0) {return;} else if (intervalTime > mLeafFloatTime) {leaf.startTime = System.currentTimeMillis()+ new Random().nextInt((int) mLeafFloatTime);}float fraction = (float) intervalTime / mLeafFloatTime;leaf.x = (int) (mProgressWidth - mProgressWidth * fraction);leaf.y = getLocationY(leaf);}// 通過葉子信息獲取當(dāng)前葉子的Y值private int getLocationY(Leaf leaf) {// y = A(wx+Q)+hfloat w = (float) ((float) 2 * Math.PI / mProgressWidth);float a = mMiddleAmplitude;switch (leaf.type) {case LITTLE:// 小振幅 = 中等振幅 - 振幅差a = mMiddleAmplitude - mAmplitudeDisparity;break;case MIDDLE:a = mMiddleAmplitude;break;case BIG:// 小振幅 = 中等振幅 + 振幅差a = mMiddleAmplitude + mAmplitudeDisparity;break;default:break;}Log.i(TAG, "---a = " + a + "---w = " + w + "--leaf.x = " + leaf.x);return (int) (a * Math.sin(w * leaf.x)) + mArcRadius * 2 / 3;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);Log.i("test", "widthMeasureSpec=="+MeasureSpec.getSize(widthMeasureSpec)+",heightMeasureSpec=="+MeasureSpec.getSize(heightMeasureSpec));int w=MeasureSpec.getSize(widthMeasureSpec);int h=MeasureSpec.getSize(heightMeasureSpec);mTotalWidth = w;mTotalHeight = h;mProgressWidth = mTotalWidth - mLeftMargin - mRightMargin;mArcRadius = (mTotalHeight - 2 * mLeftMargin) / 2;mOuterSrcRect = new Rect(0, 0, mOuterWidth, mOuterHeight);mOuterDestRect = new Rect(0, 0, mTotalWidth, mTotalHeight);mWhiteRectF = new RectF(mLeftMargin + mCurrentProgressPosition, mLeftMargin, mTotalWidth- mRightMargin,mTotalHeight - mLeftMargin);mOrangeRectF = new RectF(mLeftMargin + mArcRadius, mLeftMargin,mCurrentProgressPosition, mTotalHeight - mLeftMargin);mArcRectF = new RectF(mLeftMargin, mLeftMargin, mLeftMargin + 2 * mArcRadius,mTotalHeight - mLeftMargin);mArcRightLocation = mLeftMargin + mArcRadius;}private void initBitmap() {mLeafBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf)).getBitmap();mLeafWidth = mLeafBitmap.getWidth();mLeafHeight = mLeafBitmap.getHeight();mOuterBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf_kuang)).getBitmap();mOuterWidth = mOuterBitmap.getWidth();mOuterHeight = mOuterBitmap.getHeight();}/* @Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mTotalWidth = w;mTotalHeight = h;Log.i("test", "mTotalWidth = " + w+",mTotalHeight=="+h+"getWidth()=="+getWidth()+",getHeight"+getHeight());mProgressWidth = mTotalWidth - mLeftMargin - mRightMargin;mArcRadius = (mTotalHeight - 2 * mLeftMargin) / 2;mOuterSrcRect = new Rect(0, 0, mOuterWidth, mOuterHeight);mOuterDestRect = new Rect(0, 0, mTotalWidth, mTotalHeight);mWhiteRectF = new RectF(mLeftMargin + mCurrentProgressPosition, mLeftMargin, mTotalWidth- mRightMargin,mTotalHeight - mLeftMargin);mOrangeRectF = new RectF(mLeftMargin + mArcRadius, mLeftMargin,mCurrentProgressPosition, mTotalHeight - mLeftMargin);mArcRectF = new RectF(mLeftMargin, mLeftMargin, mLeftMargin + 2 * mArcRadius,mTotalHeight - mLeftMargin);mArcRightLocation = mLeftMargin + mArcRadius;}*/private enum StartType {LITTLE, MIDDLE, BIG}/*** 葉子對(duì)象,用來記錄葉子主要數(shù)據(jù)* * @author Ajian_Studio*/private class Leaf {// 在繪制部分的位置float x, y;// 控制葉子飄動(dòng)的幅度StartType type;// 旋轉(zhuǎn)角度int rotateAngle;// 旋轉(zhuǎn)方向--0代表順時(shí)針,1代表逆時(shí)針int rotateDirection;// 起始時(shí)間(ms)long startTime;}private class LeafFactory {private static final int MAX_LEAFS = 8;Random random = new Random();// 生成一個(gè)葉子信息public Leaf generateLeaf() {Leaf leaf = new Leaf();int randomType = random.nextInt(3);// 隨時(shí)類型- 隨機(jī)振幅StartType type = StartType.MIDDLE;switch (randomType) {case 0:break;case 1:type = StartType.LITTLE;break;case 2:type = StartType.BIG;break;default:break;}leaf.type = type;// 隨機(jī)起始的旋轉(zhuǎn)角度leaf.rotateAngle = random.nextInt(360);// 隨機(jī)旋轉(zhuǎn)方向(順時(shí)針或逆時(shí)針)leaf.rotateDirection = random.nextInt(2);// 為了產(chǎn)生交錯(cuò)的感覺,讓開始的時(shí)間有一定的隨機(jī)性mLeafFloatTime = mLeafFloatTime <= 0 ? LEAF_FLOAT_TIME : mLeafFloatTime;mAddTime += random.nextInt((int) (mLeafFloatTime * 2));leaf.startTime = System.currentTimeMillis() + mAddTime;return leaf;}// 根據(jù)最大葉子數(shù)產(chǎn)生葉子信息public List<Leaf> generateLeafs() {return generateLeafs(MAX_LEAFS);}// 根據(jù)傳入的葉子數(shù)量產(chǎn)生葉子信息public List<Leaf> generateLeafs(int leafSize) {List<Leaf> leafs = new LinkedList<Leaf>();for (int i = 0; i < leafSize; i++) {leafs.add(generateLeaf());}return leafs;}}/*** 設(shè)置中等振幅* * @param amplitude*/public void setMiddleAmplitude(int amplitude) {this.mMiddleAmplitude = amplitude;}/*** 設(shè)置振幅差* * @param disparity*/public void setMplitudeDisparity(int disparity) {this.mAmplitudeDisparity = disparity;}/*** 獲取中等振幅* * @param amplitude*/public int getMiddleAmplitude() {return mMiddleAmplitude;}/*** 獲取振幅差* * @param disparity*/public int getMplitudeDisparity() {return mAmplitudeDisparity;}/*** 設(shè)置進(jìn)度* * @param progress*/public void setProgress(int progress) {this.mProgress = progress;postInvalidate();}/*** 設(shè)置葉子飄完一個(gè)周期所花的時(shí)間* * @param time*/public void setLeafFloatTime(long time) {this.mLeafFloatTime = time;}/*** 設(shè)置葉子旋轉(zhuǎn)一周所花的時(shí)間* * @param time*/public void setLeafRotateTime(long time) {this.mLeafRotateTime = time;}/*** 獲取葉子飄完一個(gè)周期所花的時(shí)間*/public long getLeafFloatTime() {mLeafFloatTime = mLeafFloatTime == 0 ? LEAF_FLOAT_TIME : mLeafFloatTime;return mLeafFloatTime;}/*** 獲取葉子旋轉(zhuǎn)一周所花的時(shí)間*/public long getLeafRotateTime() {mLeafRotateTime = mLeafRotateTime == 0 ? LEAF_ROTATE_TIME : mLeafRotateTime;return mLeafRotateTime;} }

    activity

    package com.example.csdnblog4;import java.util.Random;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.Button; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView;public class LeafLoadingActivity extends Activity implements OnSeekBarChangeListener,OnClickListener {Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case REFRESH_PROGRESS:if (mProgress < 40) {mProgress += 1;// 隨機(jī)800ms以內(nèi)刷新一次mHandler.sendEmptyMessageDelayed(REFRESH_PROGRESS,new Random().nextInt(800));mLeafLoadingView.setProgress(mProgress);} else {mProgress += 1;// 隨機(jī)1200ms以內(nèi)刷新一次mHandler.sendEmptyMessageDelayed(REFRESH_PROGRESS,new Random().nextInt(1200));mLeafLoadingView.setProgress(mProgress);}break;default:break;}};};private static final int REFRESH_PROGRESS = 0x10;private LeafLoadingView mLeafLoadingView;private SeekBar mAmpireSeekBar;private SeekBar mDistanceSeekBar;private TextView mMplitudeText;private TextView mDisparityText;private View mFanView;private Button mClearButton;private int mProgress = 0;private TextView mProgressText;private View mAddProgress;private SeekBar mFloatTimeSeekBar;private SeekBar mRotateTimeSeekBar;private TextView mFloatTimeText;private TextView mRotateTimeText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.leaf_loading_layout);initViews();mHandler.sendEmptyMessageDelayed(REFRESH_PROGRESS, 3000);}private void initViews() {mFanView = findViewById(R.id.fan_pic);RotateAnimation rotateAnimation = AnimationUtils.initRotateAnimation(false, 1500, true,Animation.INFINITE);mFanView.startAnimation(rotateAnimation);mClearButton = (Button) findViewById(R.id.clear_progress);mClearButton.setOnClickListener(this);mLeafLoadingView = (LeafLoadingView) findViewById(R.id.leaf_loading);mMplitudeText = (TextView) findViewById(R.id.text_ampair);mMplitudeText.setText(getString(R.string.current_mplitude,mLeafLoadingView.getMiddleAmplitude()));mDisparityText = (TextView) findViewById(R.id.text_disparity);mDisparityText.setText(getString(R.string.current_Disparity,mLeafLoadingView.getMplitudeDisparity()));mAmpireSeekBar = (SeekBar) findViewById(R.id.seekBar_ampair);mAmpireSeekBar.setOnSeekBarChangeListener(this);mAmpireSeekBar.setProgress(mLeafLoadingView.getMiddleAmplitude());mAmpireSeekBar.setMax(50);mDistanceSeekBar = (SeekBar) findViewById(R.id.seekBar_distance);mDistanceSeekBar.setOnSeekBarChangeListener(this);mDistanceSeekBar.setProgress(mLeafLoadingView.getMplitudeDisparity());mDistanceSeekBar.setMax(20);mAddProgress = findViewById(R.id.add_progress);mAddProgress.setOnClickListener(this);mProgressText = (TextView) findViewById(R.id.text_progress);mFloatTimeText = (TextView) findViewById(R.id.text_float_time);mFloatTimeSeekBar = (SeekBar) findViewById(R.id.seekBar_float_time);mFloatTimeSeekBar.setOnSeekBarChangeListener(this);mFloatTimeSeekBar.setMax(5000);mFloatTimeSeekBar.setProgress((int) mLeafLoadingView.getLeafFloatTime());mFloatTimeText.setText(getResources().getString(R.string.current_float_time,mLeafLoadingView.getLeafFloatTime()));mRotateTimeText = (TextView) findViewById(R.id.text_rotate_time);mRotateTimeSeekBar = (SeekBar) findViewById(R.id.seekBar_rotate_time);mRotateTimeSeekBar.setOnSeekBarChangeListener(this);mRotateTimeSeekBar.setMax(5000);mRotateTimeSeekBar.setProgress((int) mLeafLoadingView.getLeafRotateTime());mRotateTimeText.setText(getResources().getString(R.string.current_float_time,mLeafLoadingView.getLeafRotateTime()));}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {if (seekBar == mAmpireSeekBar) {mLeafLoadingView.setMiddleAmplitude(progress);mMplitudeText.setText(getString(R.string.current_mplitude,progress));} else if (seekBar == mDistanceSeekBar) {mLeafLoadingView.setMplitudeDisparity(progress);mDisparityText.setText(getString(R.string.current_Disparity,progress));} else if (seekBar == mFloatTimeSeekBar) {mLeafLoadingView.setLeafFloatTime(progress);mFloatTimeText.setText(getResources().getString(R.string.current_float_time,progress));}else if (seekBar == mRotateTimeSeekBar) {mLeafLoadingView.setLeafRotateTime(progress);mRotateTimeText.setText(getResources().getString(R.string.current_rotate_time,progress));}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}@Overridepublic void onClick(View v) {if (v == mClearButton) {mLeafLoadingView.setProgress(0);mHandler.removeCallbacksAndMessages(null);mProgress = 0;} else if (v == mAddProgress) {mProgress++;mLeafLoadingView.setProgress(mProgress);mProgressText.setText(String.valueOf(mProgress));}} }

    layout

    <?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="match_parent"android:background="#fed255"android:orientation="vertical" ><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="100dp"android:text="loading ..."android:textColor="#FFA800"android:textSize=" 30dp" /><RelativeLayout android:id="@+id/leaf_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="50dp" ><com.example.csdnblog4.LeafLoadingView android:id="@+id/leaf_loading"android:layout_width="302dp"android:layout_height="61dp"android:layout_centerHorizontal="true" /><ImageView android:id="@+id/fan_pic"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="35dp"android:src="@drawable/fengshan" /></RelativeLayout><ScrollView android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayout android:id="@+id/seek_content_one"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginRight="15dp"android:layout_marginTop="15dp" ><TextView android:id="@+id/text_ampair"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textColor="#ffffa800"android:textSize="15dp" /><SeekBar android:id="@+id/seekBar_ampair"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:layout_weight="1" /></LinearLayout><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginRight="15dp"android:layout_marginTop="15dp"android:orientation="horizontal" ><TextView android:id="@+id/text_disparity"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textColor="#ffffa800"android:textSize="15dp" /><SeekBar android:id="@+id/seekBar_distance"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:layout_weight="1" /></LinearLayout><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginRight="15dp"android:layout_marginTop="15dp"android:orientation="horizontal" ><TextView android:id="@+id/text_float_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textColor="#ffffa800"android:textSize="15dp" /><SeekBar android:id="@+id/seekBar_float_time"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:layout_weight="1" /></LinearLayout><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginRight="15dp"android:layout_marginTop="15dp"android:orientation="horizontal" ><TextView android:id="@+id/text_rotate_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textColor="#ffffa800"android:textSize="15dp" /><SeekBar android:id="@+id/seekBar_rotate_time"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:layout_weight="1" /></LinearLayout><Button android:id="@+id/clear_progress"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:text="去除進(jìn)度條,玩轉(zhuǎn)弧線"android:textSize="18dp" /><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginRight="15dp"android:layout_marginTop="15dp"android:orientation="horizontal" ><Button android:id="@+id/add_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="增加進(jìn)度: "android:textSize="18dp" /><TextView android:id="@+id/text_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textColor="#ffffa800"android:textSize="15dp" /></LinearLayout></LinearLayout></ScrollView></LinearLayout>

    注意

    本文中用到了onSizeChanged方法,這個(gè)方法在這是為了自適應(yīng)界面,每次界面變化的時(shí)候都會(huì)被調(diào)用來重新計(jì)算一些參數(shù),一般在剛進(jìn)入與橫豎屏切換時(shí)調(diào)用

    參考鏈接

    Android自定義View初步 - 泡在網(wǎng)上的日子

    本文中還用到了postInvalidate

    invalidate()和postInvalidate() 的區(qū)別及使用,
    Android提供了Invalidate方法實(shí)現(xiàn)界面刷新,但是Invalidate不能直接在線程中調(diào)用,因?yàn)樗沁`背了單線程模型:Android UI操作并不是線程安全的,并且這些操作必須在UI線程中調(diào)用。
    invalidate()是用來刷新View的,必須是在UI線程中進(jìn)行工作。比如在修改某個(gè)view的顯示時(shí),調(diào)用invalidate()才能看到重新繪制的界面。invalidate()的調(diào)用是把之前的舊的view從主UI線程隊(duì)列中pop掉。 一個(gè)Android 程序默認(rèn)情況下也只有一個(gè)進(jìn)程,但一個(gè)進(jìn)程下卻可以有許多個(gè)線程。
    在這么多線程當(dāng)中,把主要是負(fù)責(zé)控制UI界面的顯示、更新和控件交互的線程稱為UI線程,由于onCreate()方法是由UI線程執(zhí)行的,所以也可以把UI線程理解為主線程。其余的線程可以理解為工作者線程。
    invalidate()得在UI線程中被調(diào)動(dòng),在工作者線程中可以通過Handler來通知UI線程進(jìn)行界面更新。

    而postInvalidate()在工作者線程中被調(diào)用

    參考鏈接

    Android筆記:invalidate()和postInvalidate() 的區(qū)別及使用 - Mars2639——求知de路上 - 博客頻道 - CSDN.NET

    本文還涉及到單位的轉(zhuǎn)化

    參考鏈接

    Android中dip、dp、sp、pt和px的區(qū)別 - 大氣象 - 博客園

    最終效果如下

    參考鏈接

    一個(gè)絢麗的loading動(dòng)效分析與實(shí)現(xiàn)! - Ajian_studio - 博客頻道 - CSDN.NET

    源代碼下載

    源代碼

    完成

    總結(jié)

    以上是生活随笔為你收集整理的一个绚丽的loading动效分析与实现!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    欧美作爱视频 | 欧美日韩视频在线一区 | 91视频 - v11av | 麻豆精品在线视频 | 久久精品国产精品亚洲 | 久久 一区 | 亚洲免费精品视频 | 中文字幕韩在线第一页 | 黄色三级在线观看 | 成人永久在线 | 日韩精品中文字幕在线不卡尤物 | 国产精品综合av一区二区国产馆 | 欧美一级视频在线观看 | 久操操 | 97超碰在线播放 | 综合色中文 | 国产一区视频在线 | 亚洲黑丝少妇 | 久久精品这里精品 | 日韩中文字幕免费在线观看 | av高清一区二区三区 | 91av99| 亚洲在线视频免费观看 | 国产精品不卡 | 久久好看免费视频 | 国产精品嫩草影院123 | 色婷婷电影网 | 久草99 | 久久香蕉电影 | 97人人添人澡人人爽超碰动图 | 亚洲精品午夜一区人人爽 | 免费网站观看www在线观看 | 国产高清小视频 | 美女黄频 | 激情文学综合丁香 | 91av电影网 | 日韩,精品电影 | 日韩中字在线观看 | 97色婷婷成人综合在线观看 | 色综合久久88色综合天天 | 久久久免费精品国产一区二区 | 91观看视频 | www亚洲精品 | 99久久er热在这里只有精品15 | 亚洲成人黄| 成人在线播放视频 | 亚洲电影久久久 | 免费在线观看av网址 | 精品综合久久久 | 欧美成人亚洲成人 | 日韩欧美网址 | 国产福利久久 | 香蕉久草 | 丁香六月色 | 又黄又刺激视频 | 亚洲理论片在线观看 | a v在线视频 | 激情婷婷综合网 | 狠狠的干狠狠的操 | 欧美性爽爽| 精品一区二区三区久久 | 国产在线观看你懂得 | 福利视频网站 | 免费高清在线观看电视网站 | 人人舔人人插 | 亚洲片在线 | 丝袜av网站 | 精品美女久久久久久免费 | 久久国产午夜精品理论片最新版本 | 国产精品免费麻豆入口 | 国产精品美女久久久久久 | 黄色免费av | 美女免费视频观看网站 | 国产在线视频在线观看 | 久久97精品 | 亚洲精品乱码久久久久v最新版 | 91精品啪 | 亚洲女同ⅹxx女同tv | 在线观看国产91 | 能在线观看的日韩av | 日韩中文字幕免费电影 | 中文字幕综合在线 | 四虎国产精品成人免费影视 | 蜜臀久久99静品久久久久久 | av黄色影院 | www视频在线播放 | 欧美激情第28页 | 亚洲国产精品久久久久 | 福利电影久久 | 亚洲aⅴ免费在线观看 | 亚洲狠狠操 | 久久久久久免费视频 | 国产真实精品久久二三区 | 天天色天天射天天综合网 | 亚洲专区中文字幕 | 91精品视频在线看 | 天堂在线视频免费观看 | 成人午夜电影久久影院 | 91大神一区二区三区 | 国产免费美女 | 免费亚洲成人 | 国产亚洲精品成人av久久影院 | 日本久久久影视 | 国产免费人人看 | 日本久久久久久 | 免费成人在线观看 | 中文字幕亚洲精品日韩 | 在线导航福利 | 伊人黄色网 | 黄色一级大片在线免费看产 | 精品久久久久久久久久久久久久久久久久 | 91精品啪在线观看国产81旧版 | 欧美另类69 | 久久久久一区二区三区 | 日韩久久久久久久久久 | 国产91精品一区二区绿帽 | 五月婷婷在线视频观看 | 日日夜夜天天久久 | 免费观看国产成人 | 人人模人人爽 | 免费黄色小网站 | 国产在线一区二区三区播放 | 综合激情伊人 | 精品夜夜嗨av一区二区三区 | 一区在线免费观看 | 中文字幕 在线看 | 国产精品成人免费一区久久羞羞 | 国产精品第10页 | 精品久久久久国产免费第一页 | 久99视频 | 国内精品国产三级国产aⅴ久 | 伊人国产视频 | 99久久精品久久久久久动态片 | 欧美精品久久99 | 一区二区三区在线免费播放 | 一区二精品 | 国产精品欧美久久久久久 | 久久久黄视频 | 久产久精国产品 | 在线播放你懂 | 日韩欧美视频在线观看免费 | 国产日韩欧美在线免费观看 | 国精产品满18岁在线 | 日韩字幕 | 91色偷偷 | 久久精品视频免费观看 | 天天射天天射天天射 | 欧美日韩成人 | 日韩在线短视频 | av在线播放中文字幕 | 国产精品免费久久久 | 91在线视频 | 99性视频| 成年人视频在线免费播放 | 亚洲精品国产高清 | 国产网站在线免费观看 | 天天射天天干天天爽 | 在线高清av | 日本动漫做毛片一区二区 | 欧美在线视频精品 | 热re99久久精品国产99热 | 亚洲在线视频观看 | 亚洲人天堂 | 久草免费在线视频观看 | 日韩av在线不卡 | 麻豆视频免费观看 | 色噜噜在线观看视频 | 亚洲成av人电影 | 91在线观看视频网站 | 日本一区二区三区免费观看 | 国产亚洲精品成人av久久ww | 日本中文在线 | 丁香婷婷社区 | 看全黄大色黄大片 | 国产精品久久久一区二区 | 日韩免费二区 | 欧美精品在线一区 | 精品理论片 | 精品国产乱码久久久久久1区2匹 | 成人av.com| 欧美日韩大片在线观看 | 就操操久久| 92国产精品久久久久首页 | 久久大片网站 | 国产精品国产三级在线专区 | 国产999视频在线观看 | 精品亚洲免a | 毛片精品免费在线观看 | 粉嫩aⅴ一区二区三区 | 西西www444| 国产高清在线永久 | 欧美一二三区在线播放 | 一级黄色在线免费观看 | 国内精品久久影院 | 激情网综合| 天天干夜夜爱 | 国产区精品在线观看 | 91av在线免费观看 | 91福利视频免费 | 日韩免费在线观看网站 | 日韩高清三区 | 成人av一区二区在线观看 | 欧美精品久久久久久久久久 | 亚洲福利精品 | 丁香导航| 久章操| 婷婷在线视频 | 国产亚洲精品福利 | 波多野结衣在线观看一区 | 天天干天天草天天爽 | av一区在线播放 | 久久99精品国产99久久6尤 | 国产一级精品在线观看 | 中文字幕精品一区 | 在线亚洲成人 | 在线免费高清视频 | 99久久精品日本一区二区免费 | 91黄色免费看 | 99这里只有久久精品视频 | 九九久久精品 | 国产精品久久久久久久久久尿 | 91大神精品视频在线观看 | 久久国产美女视频 | 欧美三级高清 | 中文字幕在线一二 | 日韩网站在线看片你懂的 | 欧美日韩性 | 综合色综合色 | 国产高清久久久久 | a爱爱视频 | 精品久久久久久国产偷窥 | 国产精品入口66mio女同 | 日日操天天操夜夜操 | 欧美成人按摩 | 又大又硬又黄又爽视频在线观看 | 国产精品久久久久久久久搜平片 | 久久视频免费 | 成人 亚洲 欧美 | 一区二区三区免费在线观看 | 99精品在线免费观看 | 亚洲精品视频一二三 | 色99在线| 国产视频在线免费观看 | 国产精品一区二区久久精品爱微奶 | 麻豆久久精品 | 中文字幕激情 | 久久精品黄色 | 色综合久久久久久中文网 | 久久久久国产精品免费免费搜索 | 久久久久久99精品 | 九九视频免费 | 日韩中文字幕免费电影 | 99精品国产兔费观看久久99 | 一个色综合网站 | 成年人在线电影 | 欧美日韩不卡一区二区三区 | 免费久久久久久久 | 91在线网址 | 精品国产一区二区三区四区在线观看 | 国产91在 | 色婷婷亚洲婷婷 | 九九热免费视频在线观看 | 久久久精品 | 国产网红在线观看 | 国产麻豆精品一区二区 | 97超碰在线资源 | 九九综合在线 | 黄色精品在线看 | 亚洲精品乱码久久久久久久久久 | 国产精品一区二区av日韩在线 | .国产精品成人自产拍在线观看6 | 中文字幕精品视频 | 狠狠躁日日躁狂躁夜夜躁av | 亚洲国产三级在线 | 在线观看91久久久久久 | 在线色资源 | 99精品国产99久久久久久97 | 中文字幕日韩伦理 | 日日狠狠| 99资源网 | 色婷婷久久 | 免费在线成人av电影 | 国产欧美精品xxxx另类 | 中文字幕高清视频 | a级国产乱理论片在线观看 特级毛片在线观看 | 欧美精品一区二区免费 | 中国成人一区 | 日韩免费小视频 | 国产在线v | 最新久久久 | 天天干天天操天天射 | 97超碰网 | 国产精品一区二区在线观看免费 | 日韩国产高清在线 | 国产精品美女久久久久久2018 | 日韩一区二区三区不卡 | 国产一区二区在线播放视频 | 久久99久久99精品 | 九九九九热精品免费视频点播观看 | 久久视频一区 | 欧美性做爰猛烈叫床潮 | 久久精品这里热有精品 | 四虎视频 | 色网站在线 | 国产精品久久久久久久久免费 | 久久av观看 | 性色va| 91九色在线视频观看 | av在线等 | 911香蕉视频 | 国产又粗又猛又黄又爽 | 久草在线欧美 | 日韩在线观看中文 | 欧美日韩精品在线视频 | 欧美日韩91 | 日韩精品欧美精品 | 日韩免费视频线观看 | 超碰97免费 | 国语自产偷拍精品视频偷 | 久久久久免费精品国产小说色大师 | 99精品一区 | 久久精品福利视频 | 亚洲三级av| 国产精品免费观看视频 | 久久精品一区二区三区四区 | 欧美精品一区二区免费 | 国产999视频在线观看 | 黄色高清视频在线观看 | 久久综合网色—综合色88 | a一片一级 | 91在线一区二区 | 国产日韩精品一区二区三区在线 | 国产h在线播放 | 国产视频一区在线 | 精品国产一二三四区 | 日本精品久久 | 久久成人国产精品入口 | 国产精品一区免费在线观看 | 午夜av电影 | 欧美乱熟臀69xxxxxx | 免费看短| 成人小电影在线看 | 婷婷丁香六月天 | 蜜桃传媒一区二区 | 手机看片99 | 国产小视频在线免费观看 | 久久一久久| 中国一级片视频 | 在线观看爱爱视频 | 狠狠色丁香婷综合久久 | 日韩欧美精品在线 | 久久视频99| 国产在线观看a | 亚洲精品视频在线看 | 久久不色 | 中文国产字幕 | 国产精品久久久久久妇 | 国产九九精品视频 | 国产明星视频三级a三级点| 一级黄色免费 | 日韩高清免费无专码区 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 亚洲国产最新 | 亚洲 在线 | 国产黄a三级 | www免费网站在线观看 | 日本色小说视频 | 天天射色综合 | 亚洲精品在线观看的 | 狠狠色丁香婷婷综合基地 | 综合天堂av久久久久久久 | 国产成人一区二区三区在线观看 | av一级久久 | av中文在线播放 | 成年人在线免费视频观看 | 黄色片网站av | 夜夜躁日日躁狠狠久久av | 91综合久久一区二区 | 国产精品久久三 | 亚洲精品xx | 亚洲春色奇米影视 | 美女视频黄频大全免费 | 欧美日韩国产精品一区二区 | 狠狠亚洲 | 日本久久久久久久久 | 国产视频久久 | 国产精品久久久视频 | 97色婷婷 | 久久久国产视频 | 色婷婷在线视频 | 国产成人a v电影 | 国产1级视频| 91福利影院在线观看 | 99国产成+人+综合+亚洲 欧美 | 香蕉久久久久久久 | 日批视频在线播放 | 久久免费一 | 国产精品免费高清 | 成年人免费在线播放 | 成人精品视频久久久久 | 色狠狠久久av五月综合 | 99在线视频精品 | 久久色在线观看 | 日日爱视频 | 成年人免费电影在线观看 | 亚洲天堂首页 | www.狠狠插.com| 亚洲一区二区高潮无套美女 | 久久精品视频18 | 狠狠色噜噜狠狠狠狠2021天天 | 午夜性福利| 黄色免费网 | 国产成人在线一区 | 欧美一二三四在线 | 亚洲视频www | 国产99精品在线观看 | 亚洲成人网av | 一区二区三区在线免费观看 | 在线综合 亚洲 欧美在线视频 | 国产黑丝一区二区 | 婷婷色五 | 91精品在线免费 | 91精品在线视频观看 | 涩五月婷婷 | 成人三级黄色 | 亚洲精品国久久99热 | 国产真实精品久久二三区 | 久久国产精品网站 | 午夜精品久久一牛影视 | 在线中文视频 | 色妞色视频一区二区三区四区 | 99亚洲精品视频 | 国产精品久久久久久久久久免费 | 欧美一级片免费播放 | 成年人免费av | 免费在线一区二区 | 国产一卡二卡四卡国 | 久热色超碰| 96精品视频| 一本一本久久a久久精品牛牛影视 | 日韩精品视频在线免费观看 | 日本精品在线看 | av免费在线免费观看 | 99久久久久久久久 | 精品久久毛片 | 国产成人久久av | 91麻豆精品一区二区三区 | 国产美女无遮挡永久免费 | 一区二区不卡高清 | 天天草夜夜 | 国产又粗又猛又黄视频 | 国产精品a久久久久 | 欧美精品久久久 | 成人黄色电影在线观看 | 国产成人精品一区二 | www.夜色.com| 亚洲色图 校园春色 | 亚洲精品在线国产 | 日日日网| 亚洲在线视频观看 | 久久成人免费 | 国产1区在线观看 | 99中文视频在线 | 亚洲夜夜网 | 久久国产影视 | 免费国产在线视频 | 亚洲国产中文在线 | 夜夜躁狠狠躁日日躁 | 亚洲精品88欧美一区二区 | 999久久精品 | 亚洲午夜精品在线观看 | 99久高清在线观看视频99精品热在线观看视频 | 国产成人一区二区三区免费看 | 91人人澡人人爽 | 国产在线观看地址 | 久久久精品一区二区 | 日日爽视频 | 国产夫妻av在线 | 日韩在线观看一区二区 | 91精品1区 | 999成人免费视频 | 在线观看韩日电影免费 | 久久99精品国产 | 国产99久久精品一区二区永久免费 | 亚洲精品综合在线观看 | 欧美黄色高清 | 天堂网一区二区三区 | 亚洲中字幕 | 久草电影网| 精品国产视频在线 | 亚洲一级电影 | www久久九| 日韩啪啪小视频 | 狠狠干 狠狠操 | 亚洲男人天堂2018 | 亚州国产精品久久久 | 久久午夜鲁丝片 | 国产精品1区2区3区 久久免费视频7 | 99精品免费观看 | 欧美夫妻生活视频 | 国产91九色视频 | 国产色就色 | 国产91全国探花系列在线播放 | 国产精品九九视频 | 欧美大码xxxx| 91激情在线视频 | 香蕉网在线播放 | 国产专区一 | 亚州精品视频 | 香蕉国产91| 久久国产精品99久久久久久老狼 | 国产一卡二卡四卡国 | 少妇精品久久久一区二区免费 | 久青草电影 | 三级黄色片子 | 日韩免费在线观看 | 色婷婷亚洲精品 | www视频在线免费观看 | 国产精品久久久久影院 | 欧美另类激情 | 永久中文字幕 | 东方av在线免费观看 | 久久久久久久久久网 | 99久久视频| 国产美女搞久久 | 九色最新网址 | 国产一区二区不卡视频 | 久久伊人精品天天 | 成人亚洲免费 | 在线亚洲人成电影网站色www | 日韩精品一二三 | 99欧美 | 久久 亚洲视频 | 日本黄色免费播放 | 亚洲国内精品 | 久久久久久久久久免费视频 | 99久久久久久国产精品 | 超碰国产人人 | 人人插人人插 | a级国产乱理伦片在线观看 亚洲3级 | 国产成人精品久久久久蜜臀 | 亚洲无人区小视频 | 人人精品 | 中文字幕亚洲在线观看 | 国内外成人免费在线视频 | 九九视频这里只有精品 | www一起操 | 高清久久久 | av免费在线看网站 | av三区在线 | 天天色天天上天天操 | 午夜黄色大片 | 特级毛片aaa| 91伊人影院 | 国产成人一区在线 | 成人黄色大片在线观看 | 久久黄色免费观看 | 欧美日本在线视频 | 中文字幕在线免费观看 | 奇米777777 | 国产精品一区二区 91 | 美女网站免费福利视频 | 天天综合91| 久久成人国产精品入口 | 精品国产三级 | 在线观看黄网站 | 午夜.dj高清免费观看视频 | 日本久久久久久久久久久 | 欧美日韩xx | 国产精品免费视频观看 | 久久国产精品系列 | 日韩r级在线| 国产精品久久久久久久av大片 | 久久久久久久久久久免费视频 | 91九色蝌蚪视频网站 | 玖玖玖精品 | 免费在线中文字幕 | jizzjizzjizz亚洲| 免费麻豆网站 | 国产亚洲综合精品 | 免费网站看av片 | 亚洲综合视频在线播放 | av在线免费观看网站 | 久久精精品 | 午夜精品久久久久 | 欧美另类网站 | 九九精品视频在线观看 | 中文字幕中文字幕在线中文字幕三区 | 国产日韩欧美综合在线 | 福利视频一二区 | 日日操操 | 免费在线观看亚洲视频 | 久久狠狠一本精品综合网 | av在线免费观看不卡 | 天天操夜夜操 | 亚洲一区天堂 | av福利在线导航 | 九九综合在线 | a在线免费 | 五月婷香蕉久色在线看 | 天天综合网天天 | 东方av在| 天堂va在线高清一区 | 欧美激情精品久久久 | 亚洲天堂在线观看完整版 | 日韩在线视频国产 | 色吊丝在线永久观看最新版本 | 国产精品一区二区三区四 | 久久综合久久88 | 狠狠色丁香久久婷婷综合_中 | 999久久久久 | 国产精品成人av在线 | 91精品视频观看 | 亚洲男女精品 | 日韩成人欧美 | 日韩精品中文字幕在线播放 | 三级午夜片 | 日韩欧美高清在线观看 | 色之综合网 | 日韩av午夜在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 亚洲精品大片www | 久久不射网站 | 免费黄色小网站 | 天天撸夜夜操 | 日韩乱色精品一区二区 | 欧美999| 日本成人a | 99精品久久久久久久久久综合 | 亚洲电影第一页av | 久久九九免费视频 | 日日草天天草 | 亚洲网站在线 | 久久夜色精品国产欧美乱 | 国产精品视频全国免费观看 | 91丨九色丨高潮丰满 | 丰满少妇在线观看资源站 | 亚洲日本va午夜在线电影 | 97在线精品国自产拍中文 | 国产精品com| 91片黄在线观看 | 日韩av高清 | 欧美与欧洲交xxxx免费观看 | 日韩精品中文字幕有码 | 综合黄色网 | 韩国一区在线 | 久久国产精品久久精品 | 激情综合五月天 | 日韩免费一区二区 | 婷婷色综合网 | 亚洲精品视频在线观看免费视频 | 中文字幕一二三区 | 亚洲综合最新在线 | 一区二区三区四区久久 | 欧美精品久久久久久久亚洲调教 | 香蕉视频免费在线播放 | 中文字幕在线观看91 | 麻豆91在线看 | 一级片色播影院 | 一级黄色片在线观看 | 久草在线资源免费 | 久久免费公开视频 | 欧美日韩精品影院 | 国产精品毛片久久久 | 男女拍拍免费视频 | 精品久久久久久久久久久久久久久久 | 国内精品久久久久久久久久久 | 久久怡红院 | 99精品一区二区三区 | 91免费网 | 久久久久久久av麻豆果冻 | 午夜视频免费播放 | 久草在线欧美 | 日产乱码一二三区别在线 | 亚洲黄色在线 | 国产码电影 | 91国内在线 | 国产69久久 | 色综合天天综合网国产成人网 | 欧美在线观看小视频 | 色婷婷av在线 | 三级在线播放视频 | 超碰97人| 成人在线免费视频观看 | 欧洲一区精品 | 香蕉久久久久久久 | 91麻豆福利| 国产精品久久久久亚洲影视 | 国产精品免费观看视频 | www.狠狠色| 日韩一区二区三区免费视频 | av在线免费网 | 夜夜嗨av色一区二区不卡 | 91在线观看视频网站 | 久久精品官网 | 天天爽人人爽夜夜爽 | 欧美日韩大片在线观看 | 香蕉视频在线看 | 操操操影院| 成人免费观看视频大全 | 91精品久久久久久 | 国产成人精品av在线 | 日本精品久久 | 日韩精品五月天 | av色图天堂网 | 91九色蝌蚪视频在线 | 久久理论片 | 99这里有精品 | 午夜.dj高清免费观看视频 | 日韩欧美视频一区二区三区 | 国产区高清在线 | 国产在线精品一区二区三区 | 国产精品一区二区在线看 | 精品国产大片 | 91精品国产91久久久久 | www.久久爱.cn| 国产专区一 | 福利一区在线 | 国产高清视频 | 久久久久亚洲精品成人网小说 | 国产在线不卡精品 | 久久视频免费在线 | 日韩国产高清在线 | www免费视频com━ | 91麻豆精品国产91久久久久久 | 狠狠狠色丁香婷婷综合久久88 | 成人av久久 | 国产精品区在线观看 | 99在线精品视频在线观看 | 国产区在线 | 久久视频国产精品免费视频在线 | av在线等| 国产99久| 精品国内自产拍在线观看视频 | 91系列在线 | 91探花系列在线播放 | 很黄很污的视频网站 | 高清视频一区二区三区 | 亚洲热久久 | 五月婷婷丁香在线观看 | 欧美一区二区三区在线看 | 99久久久国产精品美女 | 久草在在线视频 | 亚洲一区网 | 韩国av一区| 丁香综合 | 国产精品国产亚洲精品看不卡 | 国产精品99免视看9 国产精品毛片一区视频 | 在线免费观看黄色av | 精品久久久久亚洲 | 欧美日韩国产高清视频 | 国产精品久久久久久麻豆一区 | 天天天天天天天天操 | 丝袜美腿在线视频 | 四虎影视成人永久免费观看亚洲欧美 | 人人爽人人爽人人爽人人爽 | 在线亚洲高清视频 | 亚洲五月综合 | 婷婷丁香九月 | 一本一道波多野毛片中文在线 | 久久免费视频在线观看6 | 伊人影院99| 99热超碰 | 波多野结衣动态图 | 五月天婷婷丁香花 | 久久久久久精 | 天天操天天色综合 | www.av免费 | 日本在线观看一区二区三区 | 欧美日韩破处 | 久久国产热视频 | 狠狠躁18三区二区一区ai明星 | 六月丁香在线观看 | 精品视频区 | 99久精品 | 操高跟美女 | 国产成人一区二区三区影院在线 | 西西www444| 夜色在线资源 | 正在播放一区二区 | 国产精品第2页 | 久久久久亚洲国产精品 | 日本久久成人中文字幕电影 | 999日韩| 91精品在线观看入口 | 成人免费视频免费观看 | 97超碰人人在线 | 亚洲有 在线 | 日本久久久影视 | 中文字幕一区二区三 | 国产视频在线播放 | 亚洲成人精品av | 日韩欧美精品一区二区三区经典 | 久章草在线观看 | 久久激情视频 久久 | av色网站| 免费看黄20分钟 | 日本久热 | 天天在线操 | 国产精品久久久久久久毛片 | 亚洲精选在线观看 | 国产在线观看你懂得 | 国产一区二三区好的 | 一级黄色片在线播放 | 91大神一区二区三区 | 国产精品欧美一区二区三区不卡 | av色综合网 | 日韩在线观看中文 | 国产一区二区三区在线免费观看 | 久久看看 | 日日夜夜狠狠干 | 综合久色| 91精品国自产在线观看 | 亚洲欧美视频在线播放 | 久久久高清 | 51久久夜色精品国产麻豆 | 国产黄色一级大片 | 日韩69视频 | 99久久精品国产免费看不卡 | 日韩精品久久久 | 免费网站在线 | www,黄视频 | 草久中文字幕 | 久久久久国产精品免费 | 一区二区三区国 | 亚洲最新av网站 | 97国产大学生情侣酒店的特点 | 五月婷婷操 | 婷婷在线观看视频 | 99免费在线 | 久免费| 日韩精品免费在线观看视频 | 成人精品国产免费网站 | 97夜夜澡人人爽人人免费 | 成人高清在线 | 在线 视频 亚洲 | 91日韩免费| 精品久久亚洲 | 亚洲九九九 | 91精品毛片| 国产69久久精品成人看 | 欧美日韩久久不卡 | 亚洲永久精品视频 | 夜夜操天天干 | 天天干天天想 | 亚洲一一在线 | 久久久高清 | 国产中文字幕久久 | 国产裸体视频网站 | 国产免费黄视频在线观看 | 久久精品久久综合 | 日韩中文幕| 91看片在线播放 | 中文字幕在线观看你懂的 | 国产精品久久久久久一二三四五 | 免费在线观看的av网站 | 丁香5月婷婷久久 | 国产精品永久免费视频 | 色偷偷中文字幕 | 色婷婷激情综合 | 欧美一级xxxx | 国产乱老熟视频网88av | 国产91免费观看 | 国产免费一区二区三区最新 | 国产精成人品免费观看 | 91手机电视 | 午夜在线观看一区 | 黄色一级免费 | 成年人毛片在线观看 | 国产色啪| 午夜三级影院 | 日韩午夜视频在线观看 | 日本h视频在线观看 | 亚洲黄色高清 | 特级西西444www大精品视频免费看 | 亚洲精品国精品久久99热 | 久久久精品综合 | 日韩精品中文字幕久久臀 | 国产精品18久久久久久久久久久久 | 国产丝袜一区二区三区 | 天天射天天添 | 精品国产乱码一区二区三区在线 | 亚洲精品成人 | 欧洲精品码一区二区三区免费看 | 天天躁日日躁狠狠躁av麻豆 | 日韩精品一区二区三区视频播放 | 91精品国产91久久久久福利 | 九七在线视频 | 国产精品99精品 | 免费观看黄 | 亚洲欧洲国产日韩精品 | 天堂成人在线 | 韩国视频一区二区三区 | 国产精品理论片在线观看 | 日本三级人妇 | 中国一级片在线 | 免费网站看av片 | 亚洲午夜av电影 | av大全免费在线观看 | 手机看片中文字幕 | 日韩免费在线视频观看 | 黄色网www | 久久手机免费观看 | 成人国产精品久久久 | 五月天堂色 | 激情网站免费观看 | 亚洲精选视频免费看 | 久久国产色 | 久久久久99精品成人片三人毛片 | 91九色在线观看视频 | 国产成人免费在线 | 91精品国产自产老师啪 | 久久久精品国产一区二区 | 亚洲成人一二三 | 久草综合视频 | 黄色一级免费 | 91桃色免费观看 | 又黄又爽的免费高潮视频 | 久久久精品国产一区二区 | 免费三及片 | 最近的中文字幕大全免费版 | 日本精品久久久久久 | 国产午夜精品福利视频 | 99国产成+人+综合+亚洲 欧美 | 91麻豆高清视频 | 日本精品一区二区三区在线播放视频 | 黄色成人毛片 | 国产一区精品在线 | 色综合久久五月天 | 久久综合婷婷国产二区高清 | 久久国产成人午夜av影院潦草 | 91综合视频在线观看 | 国产三级久久久 | 日本在线视频网址 | 色夜视频| 日韩精品播放 | 最新日韩在线观看视频 | 国色天香第二季 | 亚洲视频在线观看网站 | 人人爱爱人人 | 国产综合香蕉五月婷在线 | 欧美成人日韩 | 五月婷婷在线观看 | 97日日碰人人模人人澡分享吧 | 91观看视频| 亚洲国产中文字幕在线观看 | 午夜精品久久久久久久久久久久 | 狠狠激情中文字幕 | 成年美女黄网站色大片免费看 | 成人免费视频网 | 香蕉视频亚洲 | 波多野结衣在线播放视频 | 色资源二区在线视频 | 亚洲视频h | 色香蕉在线视频 | 亚洲永久精品国产 | 狠狠躁夜夜躁人人爽视频 | 97视频总站 | 国产一区欧美在线 | 久久久精品免费观看 | 成年人免费看av | 亚洲综合婷婷 | 国产网站av | a视频在线| 欧美一级片在线 | 亚洲美女精品 | 国产精品av一区二区 | 久久久2o19精品 | 欧美日韩国产一区二区三区在线观看 | 97超碰在线免费 | 久草免费资源 | 久久久国产高清 | 国产精品一区二区av影院萌芽 | 最新国产一区二区三区 | 日韩欧美视频一区二区三区 | 一级片视频在线 | 亚洲伊人色 | 日韩,精品电影 | 日韩区欠美精品av视频 | 色综合亚洲精品激情狠狠 | 欧美怡红院 | 91av原创 | 色婷婷播放 | 久久免费视频一区 | 99精品视频中文字幕 | 福利视频区 | 涩涩爱夜夜爱 | 成人黄色小视频 | 在线观看中文字幕dvd播放 | 精品视频久久 | 麻豆成人在线观看 | 96亚洲精品久久 | 手机看片1042 | 91麻豆看国产在线紧急地址 | 激情婷婷av | 三日本三级少妇三级99 | 狠狠干天天 | 日本高清dvd|