日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android+水滴粘性动画,Android控件实现水滴效果

發布時間:2024/9/27 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android+水滴粘性动画,Android控件实现水滴效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看到ios版上QQ刷新效果像水滴,然后自己也想著去實現這樣的效果,這篇文章暫時沒有介紹下拉刷新的效果,只是單獨用一個控件來實現這樣的水滴效果。

效果圖如下:

一、總體思路

1、畫兩個圓形,其中一個就是上面的大圓,還有一個是下面的小圓,大圓和小圓不斷變小,大圓的位置保持不變,小圓的位置不斷向下移動,即圓心不斷下移。

2、畫兩邊的曲線,這時候用到貝塞爾曲線去畫。

3、用屬性動畫實現動態的效果。

二、代碼實現

1、找出畫曲線的幾個關鍵點。

其實我是在第一張圖的基礎上,再在上面分別畫兩個圓,就可以得到第二張圖了。關鍵是畫出第一張圖。

(1)在這里,p1,p2,p3,p4,這4個點分別對應兩個圓的兩邊的點,即p1到p2就是圓的直徑。p3和p4同理,那么就很容易確定這四個點的坐標了。

(2)然后c1和c2是分別控制p1到p3、p2到p4的曲線,是貝塞爾曲線的控制點。它們的橫坐標對應的是p3,p4的橫坐標(相等),縱坐標取兩個圓心距離的一半。這樣畫出這個靜態的圖片就不難了。

(3)畫上下兩個圓進去,就會變成第二張圖的效果。

2、在構造方法中調用init()初始化一些基本的變量

private void init(Context context, AttributeSet attrs) {

drawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG

| Paint.FILTER_BITMAP_FLAG);

paint = new Paint();

paint.setColor(fillColor);

// 轉換為像素單位

bigRadius = dip2px(context, bigRadius);

smallRadius = dip2px(context, smallRadius);

distance = dip2px(context, distance);

}

3、在onDraw()方法中畫水滴效果

要注意的是path需要重新new, 貝塞爾曲線的繪制,用到是path.quadTo這方法。具體可以看代碼。

@Override

protected void onDraw(Canvas canvas) {

// 必須重新new,不然路徑會重復,我之前就是這樣

path = new Path();

// 把畫布移到中心

canvas.translate(width / 2, height / 2);

// 從canvas層面去除繪制時鋸齒

canvas.setDrawFilter(drawFilter);

// 當前的兩個圓心的距離

currentDis = distance * fraction;

// 計算當前大圓的半徑

float bigRadius = this.bigRadius - currentDis / bigPercent;

float smallRadius = 0;

if (currentDis > 5) {// 距離大于5才改變小圓的半徑

smallRadius = this.smallRadius - currentDis / smallPercent;

}

// 大圓兩邊的兩個點坐標

leftX = -bigRadius;// 大圓當前的半徑

leftY = rightY = 0;

rightX = bigRadius;// 大圓當前的半徑

// 小圓兩邊的兩個點坐標

leftX2 = -smallRadius;// 小圓當前的半徑

leftY2 = rightY2 = currentDis;

rightX2 = -leftX2; // 小圓當前的半徑

// 兩個控制點

controlX1 = -smallRadius;// x坐標取小圓當前的半徑大小

controlY1 = currentDis / 2;// y坐標取兩個圓距離的一半

controlX2 = smallRadius;// x坐標取小圓當前的半徑大小

controlY2 = currentDis / 2;// y坐標取兩個圓距離的一半

path.moveTo(leftX, leftY);

path.lineTo(rightX, rightY);

// 用二階貝塞爾曲線畫右邊的曲線,參數的第一個點是右邊的一個控制點

path.quadTo(controlX2, controlY2, rightX2, rightY2);

path.lineTo(leftX2, leftY2);

// 用二階貝塞爾曲線畫左邊邊的曲線,參數的第一個點是左邊的一個控制點

path.quadTo(controlX1, controlY1, leftX, leftY);

// 畫大圓

canvas.drawCircle(0, 0, bigRadius, paint);

// 畫小圓

canvas.drawCircle(0, currentDis, smallRadius, paint);

// 畫path

canvas.drawPath(path, paint);

}

4、用屬性動畫,實現動態的效果。

/*** 執行屬性動畫,實現水滴的效果 */

public void perforAnim() {

ValueAnimator valAnimator = ObjectAnimator.ofFloat(0, 1);

valAnimator.addUpdateListener(new AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

fraction = (float) animation.getAnimatedValue();

postInvalidate();

}

});

valAnimator.setDuration(duration);

valAnimator.start();

}

5、重寫onMeasure()方法,處理wrap_content情況。

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

/*

* 處理為wrap_content情況,那么它的specMode是AT_MOST模式,在這種模式下它的寬/高

* 等于spectSize,這種情況下view的spectSize是parentSize,而parentSize是

* 父容器目前可以使用大小,就是父容器當前剩余的空間大小, 就相當于使用match_parent一樣 的效果,因此我們可以設置一個默認的值

*/

int widthSpectMode = MeasureSpec.getMode(widthMeasureSpec);

int widthSpectSize = MeasureSpec.getSize(widthMeasureSpec);

int heightSpectMode = MeasureSpec.getMode(heightMeasureSpec);

int heightSpectSize = MeasureSpec.getSize(heightMeasureSpec);

if (widthSpectMode == MeasureSpec.AT_MOST

&& heightSpectMode == MeasureSpec.AT_MOST) {

setMeasuredDimension(width, height);

} else if (widthSpectMode == MeasureSpec.AT_MOST) {

setMeasuredDimension(width, heightSpectSize);

} else if (heightSpectMode == MeasureSpec.AT_MOST) {

setMeasuredDimension(widthSpectSize, height);

}

}

6、其它的一些方法實現。

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

if (changed) {

width = right - left;

height = bottom - top;

}

}

/**

* 根據手機的分辨率從 dp 的單位 轉成為 px(像素)

*/

public int dip2px(Context context, float dpValue) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (dpValue * scale + 0.5f);

}

7、字段的定義

private final int fillColor = 0xff999999;// 填充顏色

private Paint paint;

private int width = 100, height = 300;// 默認寬高

/* 兩個圓心的最大距離 /

private int distance = 60;

/* 當前兩個圓心的距離 /

private float currentDis = 0;

private float bigRadius = 20;// 大圓半徑

private float smallRadius = 10;// 小圓半徑

private float controlX1, controlX2, controlY1, controlY2;// 兩個控制點的坐標

private float leftX, leftY, rightX, rightY;// 大圓兩邊的兩個點的坐標

private float leftX2, leftY2, rightX2, rightY2; // 小圓兩邊的兩個坐標

DrawFilter drawFilter;

Path path;

/* 由屬性動畫控制,范圍為0-1 */

float fraction = 0;// 比例值

/* 大圓半徑變化的比例 /

private final int bigPercent = 8;

/* 小圓半徑變化的比例 /

private final int smallPercent = 20;

// 動畫的執行時間

private long duration = 3000;

三、總結

一種動畫效果,應該先分析它的靜態的實現,然后添加動態的效果,這樣就比較容易實現它的動畫效果了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的android+水滴粘性动画,Android控件实现水滴效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 93久久精品日日躁夜夜躁欧美 | 欧美高清hd19 | 亚洲综合图片区 | 亚洲精品无码久久 | 国产欧美日韩综合精品一区 | 久久久精品999 | 秋霞影院午夜丰满少妇在线视频 | 91av免费在线观看 | 91蜜桃网 | 咪咪成人网 | 亚洲视频手机在线观看 | 超碰在线播放97 | 国产美女视频网站 | 国产在线观看www | 九九av在线 | 秋霞av网 | 西西4444www大胆无码 | 黄色欧美网站 | 武林美妇肉伦娇喘呻吟 | 色污网站 | 阿v免费视频 | 欧美特黄一区二区三区 | 日产毛片 | 久久一区视频 | 欧美日韩高清在线观看 | av免播放器 | 麻豆传媒在线播放 | 久伊人 | 亲切的金子片段 | 日本一区视频在线播放 | 国产性按摩 | 杨幂一区二区国产精品 | 911美女片黄在线观看游戏 | 国产视频999| 在线看视频| www.插插| 黄色片子一级 | 另类小说色 | 深夜成人在线 | 自拍偷拍激情视频 | 亚洲AV成人无码精电影在线 | 精产国产伦理一二三区 | 和漂亮岳做爰3中文字幕 | 一级特黄aa大片欧美 | 欧美激情免费在线观看 | 自拍偷拍21p | 捆绑裸体绳奴bdsm亚洲 | 亚洲成人第一网站 | a级一a一级在线观看 | 美女又爽又黄免费 | 精品自拍第一页 | 色视频导航 | a天堂资源 | 天天看片天天操 | 精品无码国产污污污免费网站 | 成全世界免费高清观看 | 午夜视频在线观看视频 | 香蕉视频A | 美女又爽又黄视频 | 亚洲色图日韩 | 国产成人网| 中文字幕成人在线视频 | 日本www黄 | 97福利影院 | 精品国产午夜福利在线观看 | 色婷婷五| 欧美精品99久久 | 免费黄色在线观看 | av动漫天堂 | 激烈的性高湖波多野结衣 | 欧美va在线观看 | 成人av18| 欧美日韩国产高清视频 | 在线日韩三级 | 免费av网站在线 | 亚洲免费观看高清在线观看 | 韩国美女毛片 | 日韩一级伦理片 | 九色蝌蚪9l视频蝌蚪9l视频 | 国产精品美女在线 | 800av凹凸| 性开放耄耋老妇hd | 欧美一级欧美三级 | 亚洲精品无码久久 | 4虎tv| 国产新婚疯狂做爰视频 | 黄色在线小视频 | 天天射天天干天天色 | 一区二区三区在线不卡 | 东北少妇露脸无套对白 | 尤物综合网 | 精品一区二区视频在线观看 | 中文字幕在线一区 | 欧美亚洲日本一区 | 极品美女开粉嫩精品 | 天堂综合网 | 小h片在线观看 | 国产午夜久久久 | 欧美日韩在线观看成人 |