pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

Android控件實現(xiàn)水滴效果

這篇文章主要為大家詳細(xì)介紹了Android控件實現(xiàn)水滴效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

效果圖如下:

一、總體思路

1、畫兩個圓形,其中一個就是上面的大圓,還有一個是下面的小圓,大圓和小圓不斷變小,大圓的位置保持不變,小圓的位置不斷向下移動,即圓心不斷下移。
2、畫兩邊的曲線,這時候用到貝塞爾曲線去畫。
3、用屬性動畫實現(xiàn)動態(tài)的效果。

二、代碼實現(xiàn)

1、找出畫曲線的幾個關(guān)鍵點。

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

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

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

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

2、在構(gòu)造方法中調(diào)用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);
    // 轉(zhuǎn)換為像素單位
    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,不然路徑會重復(fù),我之前就是這樣
    path = new Path();
    // 把畫布移到中心
    canvas.translate(width / 2, height / 2);
    // 從canvas層面去除繪制時鋸齒
    canvas.setDrawFilter(drawFilter);
    // 當(dāng)前的兩個圓心的距離
    currentDis = distance * fraction;
    // 計算當(dāng)前大圓的半徑

    float bigRadius = this.bigRadius - currentDis / bigPercent;
    float smallRadius = 0;
    if (currentDis > 5) {// 距離大于5才改變小圓的半徑
      smallRadius = this.smallRadius - currentDis / smallPercent;
    }
    // 大圓兩邊的兩個點坐標(biāo)
    leftX = -bigRadius;// 大圓當(dāng)前的半徑
    leftY = rightY = 0;
    rightX = bigRadius;// 大圓當(dāng)前的半徑
    // 小圓兩邊的兩個點坐標(biāo)
    leftX2 = -smallRadius;// 小圓當(dāng)前的半徑
    leftY2 = rightY2 = currentDis;
    rightX2 = -leftX2; // 小圓當(dāng)前的半徑
    // 兩個控制點
    controlX1 = -smallRadius;// x坐標(biāo)取小圓當(dāng)前的半徑大小
    controlY1 = currentDis / 2;// y坐標(biāo)取兩個圓距離的一半
    controlX2 = smallRadius;// x坐標(biāo)取小圓當(dāng)前的半徑大小
    controlY2 = currentDis / 2;// y坐標(biāo)取兩個圓距離的一半
    path.moveTo(leftX, leftY);
    path.lineTo(rightX, rightY);
    // 用二階貝塞爾曲線畫右邊的曲線,參數(shù)的第一個點是右邊的一個控制點
    path.quadTo(controlX2, controlY2, rightX2, rightY2);
    path.lineTo(leftX2, leftY2);
    // 用二階貝塞爾曲線畫左邊邊的曲線,參數(shù)的第一個點是左邊的一個控制點
    path.quadTo(controlX1, controlY1, leftX, leftY);
    // 畫大圓
    canvas.drawCircle(0, 0, bigRadius, paint);
    // 畫小圓
    canvas.drawCircle(0, currentDis, smallRadius, paint);
    // 畫path
    canvas.drawPath(path, paint);
  }

4、用屬性動畫,實現(xiàn)動態(tài)的效果。


/*** 執(zhí)行屬性動畫,實現(xiàn)水滴的效果 */
  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是
     * 父容器目前可以使用大小,就是父容器當(dāng)前剩余的空間大小, 就相當(dāng)于使用match_parent一樣 的效果,因此我們可以設(shè)置一個默認(rèn)的值
     */
    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、其它的一些方法實現(xiàn)。


@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;
    }
  }
  /**
   * 根據(jù)手機的分辨率從 dp 的單位 轉(zhuǎn)成為 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;// 默認(rèn)寬高 
/* 兩個圓心的最大距離 / 
private int distance = 60; 
/* 當(dāng)前兩個圓心的距離 / 
private float currentDis = 0; 
private float bigRadius = 20;// 大圓半徑 
private float smallRadius = 10;// 小圓半徑 
private float controlX1, controlX2, controlY1, controlY2;// 兩個控制點的坐標(biāo) 
private float leftX, leftY, rightX, rightY;// 大圓兩邊的兩個點的坐標(biāo) 
private float leftX2, leftY2, rightX2, rightY2; // 小圓兩邊的兩個坐標(biāo) 
DrawFilter drawFilter; 
Path path; 
/* 由屬性動畫控制,范圍為0-1 */ 
float fraction = 0;// 比例值 
/* 大圓半徑變化的比例 / 
private final int bigPercent = 8; 
/* 小圓半徑變化的比例 / 
private final int smallPercent = 20; 
// 動畫的執(zhí)行時間 
private long duration = 3000;

三、總結(jié)

一種動畫效果,應(yīng)該先分析它的靜態(tài)的實現(xiàn),然后添加動態(tài)的效果,這樣就比較容易實現(xiàn)它的動畫效果了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持html5模板網(wǎng)。

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

這篇文章主要介紹了Android開發(fā)之TabHost選項卡及相關(guān)疑難解決方法,結(jié)合實例形式較為詳細(xì)的分析了Android開發(fā)中TabHost選項卡的常見用法以及相關(guān)疑難問題解決方法,需要的朋友可以參考下
這篇文章主要介紹了Android TabHost選項卡標(biāo)簽圖標(biāo)始終不出現(xiàn)的解決方法,涉及Android界面布局相關(guān)屬性與狀態(tài)設(shè)置操作技巧,需要的朋友可以參考下
這篇文章主要介紹了Android開發(fā)之Notification手機狀態(tài)欄通知用法,結(jié)合實例形式分析了Android Notification手機狀態(tài)欄通知的常見函數(shù)、功能及使用技巧,需要的朋友可以參考下
這篇文章主要介紹了Android開發(fā)實現(xiàn)模仿微信小窗口功能,結(jié)合實例形式分析了Android實現(xiàn)微信風(fēng)格Dialog對話框窗口相關(guān)功能與布局操作技巧,需要的朋友可以參考下
這篇文章主要介紹了Android開發(fā)之PopupWindow創(chuàng)建彈窗、對話框的方法,結(jié)合實例形式詳細(xì)分析了Android使用PopupWindow創(chuàng)建對話框相關(guān)操作技巧,需要的朋友可以參考下
這篇文章主要介紹了Android開發(fā)之DatePickerDialog、TimePickerDialog時間日期對話框用法,結(jié)合實例形式分析了Android使用DatePickerDialog、TimePickerDialog顯示日期時間相關(guān)操作技巧,需要的朋友可以參考
主站蜘蛛池模板: 便携式谷丙转氨酶检测仪|华图生物科技百科 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 电缆桥架生产厂家_槽式/梯式_热镀锌线槽_广东东莞雷正电气 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 苏州教学设备-化工教学设备-环境工程教学模型|同科教仪 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 中式装修设计_室内中式装修_【云臻轩】中式设计机构 | 防火门|抗爆门|超大门|医疗门|隔声门-上海加汇门业生产厂家 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | RS系列电阻器,RK_RJ启动调整电阻器,RQ_RZ电阻器-上海永上电器有限公司 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 中矗模型-深圳中矗模型设计有限公司 | 云杂志网-学术期刊-首页| 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 合肥活动房_安徽活动板房_集成打包箱房厂家-安徽玉强钢结构集成房屋有限公司 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 天长市晶耀仪表有限公司| 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 发电机组|柴油发电机组-批发,上柴,玉柴,潍柴,康明斯柴油发电机厂家直销 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 安徽集装箱厂-合肥国彩钢结构板房工程有限公司 | 包塑软管|金属软管|包塑金属软管-闵彬管业 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | CCE素质教育博览会 | CCE素博会 | 教育展 | 美育展 | 科教展 | 素质教育展 | 杭州公司变更法人-代理记账收费价格-公司注销代办_杭州福道财务管理咨询有限公司 | 宜兴市恺瑞德环保科技有限公司 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 样品瓶(色谱样品瓶)百科-浙江哈迈科技有限公司 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 |